向后执行打印


102

您的任务是颠倒某些prints命令的执行顺序。


规格:
您的代码将采用以下形式:

//some lines of code
/*code*/ print "Line1" /*code*/
/*code*/ print "Line2" /*code*/
/*code*/ print "Line3" /*code*/
/*code*/ print "Line4" /*code*/
//some lines of code

您必须print从第四到第一)(或echo,或write,或等效)这些字符串

  • 您可以决定程序的哪些行必须print使用字符串,但是它们必须相邻

  • 每行只能包含一个print,并且长度不能超过60个字节

  • 因为这是,所以要有创造力,避免只写一个goto或简单的for(i){if(i=4)print"Line1";if(i=3)...}

  • 2周内获得最高评价的答案将赢得此奖项。

  • 您的输出必须Line4 Line3 Line2 Line1 OR Line4Line3Line2Line1 OR Line4\nLine3\nLine2\nLine1(其中\n是换行符),并且必须仅通过prints向后执行来生成它。

编码愉快!

更新:比赛结束了!谢谢你们 :)


15
阿拉伯语算吗?:)

如果您能够满足规格要求,则:P
Vereos

想要快速阐明一个规则...当您说“每个人只能包含一个打印件”时,您是指代码文件中的一行文本还是一个LOC /语句?
Ruslan 2014年

每行代码只能包含一个打印内容
Vereos

是否必须通过代码审查-适用于生产代码?
Lance

Answers:


183

Commodore 64 BASIC

40 print "Line 1"
30 print "Line 2"
20 print "Line 3"
10 print "Line 4"

83
直到现在,我始终无法弄清为什么需要行号。
ugoren 2014年

3
我打算提议,将字符ROM($ D000)复制到RAM($ 3000),将字符位图交换为“ 1” <->“ 4”和“ 2” <->“ 3”,然后按正序运行程序。这很可爱。
马克·拉卡塔

我敢肯定,您实际上无法保存/加载或以其他方式使用标准工具所示的顺序列出代码(无论如何在Apple II上绝对不能),您所能做的就是在控制台中键入这些行以该顺序。如果允许的话,您不能只使用C#SendKeys库以任何已回答的语言以不同的顺序键入代码,并使用箭头键来移动。
Lance

108

的PHP

滥用优先... :-)

!print "Line1\n".
!print "Line2\n".
!print "Line3\n".
!print "Line4\n";

3
在PHP中,print可以用作表达式,就像在perl中一样,其返回值始终为1!1返回bool(false),当键入为字符串时,返回空字符串。对PHP的一个更适当的限制可能是要求echo而不是print; 以上只是一个陈述。
primo 2014年

1
@ kuldeep.kamboj就是这样分组的:print ("Line 1". !print ("Line2". !print ("Line 3". !print "Line4")));—打印语句右边的所有内容都是其中的一部分。
bwoebi 2014年

4
它在每个版本3v4l.org/dpSpK中的工作似乎都非常出色!
eisberg 2014年

3
花了我一段时间来理解(感谢@eisberg的链接!),但我现在明白了。虽然第一个print被首先调用,但是直到内部(下部)print已被调用并经过充分评估后,它才可以完成需要打印的内容。而!s只是隐藏将以其他方式打印的1。太棒了,@ bwoebi!
sfarbota 2014年

1
@sfarbota阅读规则很困难。固定。谢谢您:-)
bwoebi 2014年

76

C

未定义的行为是最令人兴奋的行为!

f(){}
main()
{
   f(printf("Line 1\n"), 
     printf("Line 2\n"), 
     printf("Line 3\n"), 
     printf("Line 4\n"));
}

实际输出可能会有所不同,具体取决于您的编译器,链接器,操作系统和处理器:)


22
我完全不知道这实际上是如何工作的,+ 1。
svick 2014年

7
@svick:为了支持varargs,大多数C编译器将函数参数以相反的顺序放置在堆栈上(因此,堆栈上的最高位始终是第一个参数),这意味着它们很可能以相同的方式计算参数。当然,这假设参数在堆栈传递,而对于较新的编译器,这种情况越来越少。
Guntram Blohm 2014年

正如@GuntramBlohm所说,基本思想是C函数参数通常(但不总是)以从右到左的顺序被压入堆栈。由于这些是函数调用,因此也可能(但不一定)从右到左调用这些函数。尽管所有这些都不是C标准定义的,所以在GCC 4中碰巧会产生正确的结果,但这完全取决于编译器和调用约定的实际情况。
尼克

1
@fluffy:唉,这是周围的其他方式:C并不能治疗的arglist逗号作为序列点,不像其他的逗号。
Williham Totland

6
@WillihamTotland那么我就知道一些我确实需要修复的代码...谢谢
蓬松的

74

爪哇

使用反射

public class ReversePrint {
    public static void main(String[]a) {
        System.out.println("Line1");
        System.out.println("Line2");
        System.out.println("Line3");
        System.out.println("Line4");
    }
    static {
        try{
            Field f=String.class.getDeclaredField("value");
            f.setAccessible(true);
            f.set("Line1","Line4".toCharArray());
            f.set("Line2","Line3".toCharArray());
            f.set("Line3","Line2 ".trim().toCharArray());
            f.set("Line4","Line1 ".trim().toCharArray());
        }catch(Exception e){}
    }
}

输出:

Line4
Line3
Line2
Line1

有关为什么这样做的解释,请参见此处


61

4
+1人们总是说Java字符串是不可变的。您证明他们不是。
Victor Stafusa 2014年

16
这真令人讨厌,但是没有满足反向执行的要求。
托尔比约恩Ravn的安徒生

4
@ThorbjørnRavnAndersen嘘...你不应该告诉他们的。:p
Danny

5
@Victor在Java中,字符串不可变的。在整个Stackoverflow上,存在诸如“我认为字符串是不可变的”之类的问题。他们使用反射,这使它们看起来是不变的。Java的承诺的工作方式如下:“如果您按照我们的意图使用我们的事物/类,那么我们保证我们的主张是正确的。” 反射不是类打算使用的方式。
贾斯汀

70

C(和类似的Python)

新版本,使用宏完全适合问题格式。跟随Quincunx的评论,我添加return了使其更好。

它也可以在Python中工作,但是打印顺序正确。

#define print"\n",printf(
#define return"\n"))));}
#define def main(){0?

def main():
    print "Line 1"
    print "Line 2"
    print "Line 3"
    print "Line 4"
    return

main();

原始版本-宏替换后,两者实际上是相同的:

main(){
    printf("Line 1\n",
    printf("Line 2\n",
    printf("Line 3\n",
    printf("Line 4\n",
    0))));
}

1
宏+1。也许包括另一个;诸如此类#define } 0))));(我不完全知道宏在C中如何工作)。这样,您可以只在main方法中包含print语句,仅此而已。
贾斯汀

@Quincunx,您无法定义},但是您可以定义return,我现在已经做了。现在几乎是多语言的- print语法可在多种脚本语言中使用,#define通常是注释,但main(){..}不适用于我能找到的任何语言。
ugoren 2014年

1
@Quincunx,现在它真的是一个多语言的。
ugoren 2014年

前两个定义如何没有空格的工作?会print被替换"\n",printf(吗?
phuclv 2014年

@LưuVĩnhPhúc-该空间是可选的。如您所说,它将取代。
ugoren 2014年

61

ES6(使用向后模式;)

哇,当ECMAScript的设计师将反向模式作为规范的一部分时,他们似乎具有不可思议的远见:

// activate backwards mode:
'use backwardsˈ; \* mode backwards in now *\
code of lines some \
\*code*\ "Line1" print \*code*\
\*code*\ "Line2" print \*code*\
\*code*\ "Line3" print \*code*\
\*code*\ "Line4" print \*code*\
code of lines some \
⁏ˈforwards useˈ // back to ˈnormal'.

// So simple! No need to do anything this complicated:
split('"').reduce((L,o,l)=>(l%2?o:'')+L,'')

输出(评估,实际上):

"Line4Line3Line2Line1"

请注意,它的格式完全符合要求,仅略微后退即可适应mode的语法。还需要注意的是这种模式在最新版本的Firefox只支持在此刻

最后说明:实际上,没有向后模式。但这仍然是在Firefox中运行的有效脚本(复制整个内容)。:D


ES6“宽松模式”

奖励:这是一个更新的版本,该版本不使用向后模式,而是使用新指定的“宽松模式”,无论遵循任何指定的JS语法,JS引擎都将尝试猜测该代码应该做什么(基本上是严格模式的对立):

// activate "lax" mode:
`use laxˋ; // also works: ˋuse relaxˋ, ˋuse guessingˋ, ˋuse whatevsˋ, etc.
//some lines of code
/*code*/ print "Line1" /*code*/
/*code*/ print "Line2" /*code*/
/*code*/ print "Line3" /*code*/
/*code*/ print "Line4" /*code*/
//some lines of code
ˋuse normalˋ; // same as ˋuse default`.

// Again, compare to inferior, illegible "traditional" ES6:
split('"').reduce((L,o,l)=>(l%2?o:'')+L,'')

请注意,“ lax模式 ”当前仅在Firefox> = 34中可用。


7
您发布的所有3个链接均指向404。这是个玩笑吗?
manatwork 2014年

8
啊。我现在明白了。语法荧光笔是您的帮凶。
manatwork 2014年

12
这是一次组合性的竞赛代码竞赛,不是吗?:) 我喜欢它。
并非查尔斯(Charles)

8
这是对Javascript的滥用。我喜欢。
Seiyria 2014年

2
鬼 偷偷摸摸的....
David Conrad

59

C

main()
{
  int i = 0;
  for(; i == 0; printf("Line 1\n"))
    for(; i == 0; printf("Line 2\n"))
      for(; i == 0; printf("Line 3\n"))
        for(; i == 0; printf("Line 4\n"))
          i = 1;
}

56

红宝石

print 'Line1' unless
print 'Line2' unless
print 'Line3' unless
print 'Line4'

编辑:或者,

def method_missing(meth,*)
  puts meth.to_s.sub('print'){}
end

printLine1(
printLine2(
printLine3(
printLine4)))

38
我更喜欢它,因为它有冰毒

2
如果您有两个解决方案,您通常不会发布两个答案吗?
TheConstructor 2014年

3
看起来ruby不像代码块吗?pastebin.com/LDWpxKx8
manatwork

2
@PacMani那些括号不使用空格,而是使用空格。
corsiKa 2014年

@manatwork不错!不过,我确实认为method_missing这很像Ruby。
histocrat

49

的PHP

我知道,这是疯狂的事...

goto d;
a: print "Line1\n"; goto end;
b: print "Line2\n"; goto a;
c: print "Line3\n"; goto b;
d: print "Line4\n"; goto c;
end: exit;

66
您听到的声音是Dijkstra在坟墓中旋转。:-)
Gareth 2014年

24
以为有人说“要有创造力,避免只写一个; goto;-)
TheConstructor 2014年

22
@TheConstructor创意部分是在PHP中使用goto ;)
NikiC

1
如此充满胜利。
尼克T

41

哈斯克尔

这几乎是惯用的Haskell,因为该程序现在看起来像是从右到左的函数组合。如果该函数不是打印出来的,但是会返回一个(有用的)值的操作符将是不必要的,并且代码将是您在库中看到的。

a << b = (const a =<< b)

main = putStrLn "Line1"
    << putStrLn "Line2"
    << putStrLn "Line3"
    << putStrLn "Line4"

5
提示:(<<) = flip (>>)
Bergi 2014年

@Bergi这是另一种编写方式,我想它甚至还要优雅一点。实际上,我是有点惊讶地看到的东西并没有在规定的前奏(或Control.Monad)
shiona

@shiona:是的,这是一件令人惊讶的事情。幸运的是,我们有两个Applicatives运算符:<**>
Tikhon Jelvis,2014年

@TikhonJelvis实际上,<*应用运算符与此不同<<a <* b等于do x<-a;b;return x,即它首先运行a效果
骄傲的haskeller 2014年

40

佩尔

use threads;

$a=threads->create(sub {sleep(5); print("Line1\n");});
$b=threads->create(sub {sleep(4); print("Line2\n");});
$c=threads->create(sub {sleep(3); print("Line3\n");});
$d=threads->create(sub {sleep(2); print("Line4\n");});

$a->join();
$b->join();
$c->join();
$d->join();

22
这是理论上不能保证在确切相反的顺序进行打印。
Cruncher 2014年

4
我知道@Cruncher,但是有1秒的间隔,以相反的顺序打印的机会很小。
Gareth 2014年

3
@Gareth这就是为什么我在理论上用斜体显示的原因:)
Cruncher

3
@Cruncher是不是让它如此有趣?
皮埃尔·阿洛德

@Cruncher就像理论上我的原子可以穿过一堵墙一样?
cdeange 2014年

37

HTML + CSS

<p>Line 1</p>
<p>Line 2</p>
<p>Line 3</p>
<p>Line 4</p>

CSS:

body {margin-top:7em}
p + p {margin-top:-4em}

参见jsFiddle

编辑:
为了更好地符合规则,这是XML的一种变体,实际上使用print

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="style.css"?>
<root>
  <print>Line 1</print>
  <print>Line 2</print>
  <print>Line 3</print>
  <print>Line 4</print>
</root>

style.css应该在哪里

* {display:block; margin-top:3em}
print + print {margin-top:-3em}

没有CSS的HTML

而且就此而言,这里没有CSS。

<table>
<tfoot><tr><td><table><tfoot><tr><td>Line 1</tr></tfoot>
<tbody><tr><td>                      Line 2</table></tfoot>
<tbody><tr><td><table><tfoot><tr><td>Line 3</tr></tfoot>
<tbody><tr><td>                      Line 4</table></tbody>
</table>

小提琴


2
有人可以解释一下反对意见吗?您知道,这在打印时有效。
李斯特先生,2014年

您也可以这样做p {float:right;}
Noyo

但是结果将全部集中在一行上!
李斯特先生,2014年

...这是允许的。:]
Noyo 2014年

1
...而且这不是不允许的。:D您也可以将其包装在div中并添加CSS规则div {float:left}
Noyo 2014年

23

C ++

#include <iostream>
#define Q(x,y) x ## y
#define P(x,y) Q(x, y)
#define print S P(s, __LINE__) =
struct S { const char *s; S(const char *s): s(s) {} ~S() { std::cout << s << std::endl; } };
int main() {
    print "Line1";
    print "Line2";
    print "Line3";
    print "Line4";
}

(局部变量以相反的声明顺序销毁。)

C ++ 11

#include <iostream>
int main() {
    struct S { void (*f)(); S(void (*f)()): f(f) {} ~S() { f(); } } s[] = {
        {[](){ std::cout << "Line1" << std::endl; }},
        {[](){ std::cout << "Line2" << std::endl; }},
        {[](){ std::cout << "Line3" << std::endl; }},
        {[](){ std::cout << "Line4" << std::endl; }},
    };
}

(大致相同,但使用lambda和数组数据成员代替。)


我使用发布了一个解决方案std::function,而我试图摆脱它。现在我不需要了,因为你明白了!
sergiol

21

哈斯克尔

main = sequence_ $ reverse [
    putStr "Line1",
    putStr "Line2",
    putStr "Line3",
    putStr "Line4"]

21

Java脚本

setTimeout(function(){console.log("Line 1");},900);
setTimeout(function(){console.log("Line 2");},800);
setTimeout(function(){console.log("Line 3");},700);
setTimeout(function(){console.log("Line 4");},600);

使用1,2,3,4超时也对我有用。(但是,我不知道此行为是否在ECMAScript中得到了标准化。)
ComFreek

1
@ComFreek:setTimeout在HTML5 /计时器中标准化,而不在ES中标准化。此外,它还指定了至少4毫秒的超时时间:-)
Bergi 2014年

1
@Bergi Yep,你是对的,当然!HTML标准-计时器 -如果有人感兴趣的话。
ComFreek

1
在足够慢的机器上运行此程序(例如,运行其他应用程序的8086吗?),它将失败。(通过失败了,我的意思是顺序不会逆转的,因为它会采取> = 100毫秒执行每条语句。
杰夫·戴维斯

1
@ lastr2d2用while循环模拟慢速计算机是相当主观的,但是我认为这会更像它:jsfiddle.net/7zbKw/1。请注意whatwg.org/specs/web-apps/current-work/multipage/…中的内容。 “此API不能保证计时器会完全按计划运行。由于CPU负载,其他任务等会导致延迟。”
杰夫·戴维斯

20

C

尝试尽可能无视创意中的问题提示:

#include <stdio.h>
#define print if (i == __LINE__) puts
static unsigned i;
int main(void) {
  while (--i) {
    print("Line 1");
    print("Line 2");
    print("Line 3");
    print("Line 4");
  }
  return 0;
}

3
#define的不错
用法

15

高炉

假定单元包装。

++++[->+
----[> (line 1) .[-]<]++++
---[> (line 2) .[-]<]+++
--[> (line 3) .[-]<]++
-[> (line 4) .[-]<]+
<]

为什么运作

第一行和最后一行组成一个循环,该循环重复四次(counter = cell0)。

在循环内部,有一个计数器变量(cell1),每次运行都会增加。

每行检查减少四,三,二或一是否等于零。因此,在第一次运行时,计数器为1,执行最后一行;在第二次运行时,执行第三行,依此类推。

(line 1)节目在这里你应该是打印的文本。循环中的箭头cell2为此目的分配。使用后将其[-]清除cell2


14

重击

为了纪念尊敬的SleepSortSleepAdd,我向您介绍... SleepReverse

#!/bin/bash

function print(){(sleep $((4-$1));echo "Line $1";)&}

print 1
print 2
print 3
print 4

要使其看起来更像规格,请使用$1$2function print(){(sleep $((4-$2));echo "$1 $2";)&}; print Line 1
ThinkChaos

13

爪哇

import java.io.PrintStream;
import java.util.concurrent.FutureTask;

public class Print {
  public static void main(String[] args) {
    new FutureTask<PrintStream>(new Runnable() {
      public void run() {
        new FutureTask<PrintStream>(new Runnable() {
          public void run() {
            new FutureTask<PrintStream>(new Runnable() {
              public void run() {
                System.out.append("Line1"); }
            }, System.out.append("Line2")).run(); }
        }, System.out.append("Line3")).run(); }
    }, System.out.append("Line4")).run();
  }
}

一切都在正确的时间... ;-)


线必须相邻。
Timtech

它们与codegolf.stackexchange.com/a/20660/16293相邻,没人说它们看起来应该一样。将删除一些换行符;-)
TheConstructor 2014年

好的,太好了:-)
Timtech

12

Python 3

import atexit

atexit.register(print,"Line1")
atexit.register(print,"Line2")
atexit.register(print,"Line3")
atexit.register(print,"Line4")

12

重击

这是双面脚本:

#!/bin/bash
s=1
if [ $s -ne 0 ]; then tac $0 | bash; exit; fi
s=0
echo "Line1"
echo "Line2"
echo "Line3"
echo "Line4"

2
我什至不知道tac存在!哈哈谢谢。
Noyo 2014年

11

普通Lisp№1

编写一个ngorp以相反顺序执行其形式的宏很容易:

(macrolet ((ngorp (&body ydob) `(progn ,@(reverse ydob))))
  (ngorp
   (write-line "Line 1")
   (write-line "Line 2")
   (write-line "Line 3")
   (write-line "Line 4")))
Line 4
Line 3
Line 2
Line 1

普通Lisp№2

这是一个从字面意义上解决问题的人。问题中的代码无需修改即可出现在程序中:

(macrolet ((execute-prints-backwards (&body body)
             `(progn 
                ,@(nreverse (mapcar (lambda (string)
                                      (list 'write-line string))
                                    (remove-if-not 'stringp body))))))
  (execute-prints-backwards

//some lines of code
/*code*/ print "Line1" /*code*/
/*code*/ print "Line2" /*code*/
/*code*/ print "Line3" /*code*/
/*code*/ print "Line4" /*code*/
//some lines of code

  ))
Line4
Line3
Line2
Line1

10

的PHP

另一个eval变体:

$lines=array_slice(file(__FILE__),-4); // get last 4 lines of current file
eval(implode('',array_reverse($lines)));exit; // eval lines reversed and exit
print "Line1\n";
print "Line2\n";
print "Line3\n";
print "Line4\n";

1
光滑!尽管如此,我还是不得不指出这是一个非常糟糕的主意。
David Kryzaniak 2014年

9

F#

let inline (?) f g x = g x; f x

(printfn "Line1%s") ?
 (printfn "Line2%s") ?
  (printfn "Line3%s") ?
   (printfn "Line4%s") ""

刚刚创建了一个自定义运算符,它以相反的顺序执行功能。


3
我很确定(?)f(g(x))= g(x); f(x)是演算而不是编程。
杰夫·戴维斯

2
@JeffDavis:可以肯定地(?) f g x读为(?)(f, g, x),而不是f(g(x))
Eric

9

去(Golang)

package main

import "fmt"

func main() {
    defer fmt.Println("Line 1")
    defer fmt.Println("Line 2")
    defer fmt.Println("Line 3")
    defer fmt.Println("Line 4")
}

试试看:http : //play.golang.org/p/fjsJLwOFn2


我想发布完全相同的代码。从字面上看,逐字节完全相同。
艺术

@Art,太棒了!我希望看到更多的Go在Code Golf中使用。
cory.todd 2014年

可能不会发生。Go并不是一个很好的压缩对象,它们故意限制怪异的结构,以免造成无法理解的混乱。但是在这种情况下(也许还有其他人气竞赛),它就有机会。
艺术

8

Python3

print("Line1",
print("Line2",
print("Line3",
print("Line4") or '') or '') or '')

通过删除最后一行中的所有空格,可以缩短6个字节。


7

Java脚本

[
  "console.log('Line1')",
  "console.log('Line2')",
  "console.log('Line3')",
  "console.log('Line4')"
].reverse().forEach(function(e){eval(e)})

C ++ 11

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<std::function<void()>> functors;
    functors.push_back([] { std::cout << "Line1"; });
    functors.push_back([] { std::cout << "Line2"; });
    functors.push_back([] { std::cout << "Line3"; });
    functors.push_back([] { std::cout << "Line4"; });
    std::reverse(functors.begin(),functors.end());
    std::for_each (functors.begin(), functors.end(), [](std::function<void()> f) {f();});
    return 0;
}

取而代之的是std::reversestd::for_each,只需使用while (! functors.empty()) { functors.back()(); functors.pop_back(); }
大卫Hammen

7

批量

echo off

call :revers ^
echo.line1 ^
echo.line2 ^
echo.line3 ^
echo.line4

:revers
if not "%2"=="" call :revers %2 %3 %4 %5 %6 %7 %8 %9
%1

欢迎来到codegolf!好贴。
Cruncher 2014年

7

C#

我创建的动态方法不是直接调用Run方法,而是创建包含Run的IL字节码副本的动态方法,只是交换了加载字符串操作码操作数。这将导致新方法以相反的顺序显示字符串。

using System;
using System.Collections.Generic;
using System.Reflection;
using System.Reflection.Emit;

namespace TestApp
{
    class Program
    {
        public static void Run()
        {
            Console.WriteLine("Line 1");
            Console.WriteLine("Line 2");
            Console.WriteLine("Line 3");
            Console.WriteLine("Line 4");
        }


        static void Main(string[] args)
        {
            var method = typeof(Program).GetMethod("Run");
            var il = method.GetMethodBody().GetILAsByteArray();
            var loadStringOperands = new Stack<int>();
            for (int i = 0; i < il.Length; i++)
            {
                if (il[i] == OpCodes.Ldstr.Value)
                {
                    loadStringOperands.Push(BitConverter.ToInt32(il, i + 1));
                    i += 4;
                }
            }

            var run = new DynamicMethod("Run", typeof(void), null);
            var gen = run.GetILGenerator(il.Length);
            for (int i = 0; i < il.Length; i++)
            {
                if (il[i] == OpCodes.Ldstr.Value)
                {
                    var str = method.Module.ResolveString(loadStringOperands.Pop());
                    gen.Emit(OpCodes.Ldstr, str);
                    i += 4;
                }
                else if (il[i] == OpCodes.Call.Value)
                {
                    var mInfo = method.Module.ResolveMethod(BitConverter.ToInt32(il, i + 1)) as MethodInfo;
                    gen.Emit(OpCodes.Call, mInfo);
                    i += 4;
                }
                else if (il[i] == OpCodes.Ret.Value)
                {
                    gen.Emit(OpCodes.Ret);
                }
            }

            run.Invoke(null, null);
        }
    }
}

6

蟒蛇

另一个解决方案使用 eval()

a = [
"print('Line1')",
"print('Line2')",
"print('Line3')",
"print('Line4')"]

for line in reversed(a):
    eval(line)

它不是很复杂,但是很容易理解。


2
我理解的唯一代码:D
Moldovean 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.