인쇄를 거꾸로 실행


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문자열 이어야하는지 결정 하지만 인접 해야합니다 .

  • 모든 줄은 하나만 포함 할 수 있으며 길이 print60 바이트 를 초과 할 수 없습니다 .

  • 이것은 이므로 창의력을 발휘하고 a goto또는 simple 을 쓰지 마십시오.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

모든 코드 줄은 한
장만

프로덕션 코드에 적합한 코드 검토를 통과해야합니까?
랜스

답변:


183

코모도어 64 베이직

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

83
지금까지 왜 줄 번호가 필요한지 알 수 없었습니다.
ugoren

3
나는 문자 ROM ($ D000)을 RAM ($ 3000)에 복사하고 문자 비트 맵을 "1"<-> "4"및 "2"<-> "3"으로 교체 한 다음 프로그램을 순차 순서대로 실행하도록 제안하려고했습니다. . 이것은 귀엽습니다.
Mark Lakata

표준 도구를 사용하여 표시된 순서대로 코드를 실제로 저장 /로드하거나 다른 방법으로 나열 할 수 없다고 확신합니다 (어쨌든 Apple II에서는 절대 불가능합니다). 콘솔에 입력하면됩니다. 그와 같은 순서로. 그리고 이것이 허용된다면 C # SendKeys 라이브러리를 사용하여 대답하는 언어 중 하나를 화살표 키로 다른 순서로 입력하여 이동할 수 있습니다.
랜스

108

PHP

우선 순위 남용 ... :-)

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

3
PHP에서는 printperl에서와 같이 표현식으로 사용될 수 있으며, 리턴 값은 항상 1입니다. !1bool(false)문자열로 입력하면 빈 문자열을 반환합니다. PHP에 대한보다 적절한 제한은 echo오히려 요구 하는 것입니다 print. 위의 내용은 실제로 하나의 진술입니다.
primo

1
@ kuldeep.kamboj 방금 다음과 같이 그룹화되었습니다. print ("Line 1". !print ("Line2". !print ("Line 3". !print "Line4")));— 인쇄 문 오른쪽에있는 모든 것이 그 일부입니다.
bwoebi

4
그것은 모든 버전 3v4l.org/dpSpK에서 매우 인상적입니다!
eisberg

3
이해하는 데 시간이 걸렸습니다 (링크에 대한 @eisberg 감사합니다!). 그러나 나는 지금 그것을 얻습니다. 첫 번째 print가 먼저 호출 되지만 내부 (하단) print가 이미 호출되고 완전히 평가 될 때까지 인쇄해야 할 내용을 평가하는 것은 끝나지 않습니다 . 그리고 !s는 달리 인쇄 할 1을 숨기려고합니다. 훌륭합니다, @bwoebi!
sfarbota

1
@sfarbota 읽는 규칙은 어렵다. 결정된. 감사합니다 :-)
bwoebi

76

정의되지 않은 행동은 가장 흥미로운 종류의 행동입니다!

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

실제 출력은 컴파일러, 링커, 운영 체제 및 프로세서에 따라 달라질 수 있습니다. :)


22
나는 이것이 실제로 어떻게 작동하는지 전혀 모른다, +1.
svick

7
@svick : varargs를 지원하기 위해 대부분의 C 컴파일러는 스택에 함수 인수를 역순으로 배치하므로 스택의 최상위 항목은 항상 첫 번째 인수이므로 동일한 방식으로 인수를 평가할 가능성이 높습니다. 물론, 이것은 새로운 컴파일러의 경우에 인수 스택에 전달되는 것으로 가정합니다 .
트람

@GuntramBlohm이 말했듯이 기본 아이디어는 C 함수 매개 변수가 종종 오른쪽에서 왼쪽 순서로 스택에 푸시된다는 것입니다. 이것들은 함수 호출이므로 함수는 오른쪽에서 왼쪽으로 호출 될 수도 있습니다. 이 모든 것이 C 표준에 의해 정의되지는 않았으므로 GCC 4에서 올바른 결과를 산출하는 동안 실제로 발생하는 것은 컴파일러와 호출 규칙에 달려 있습니다.
Nick

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
끔찍 해요 나는 그것을 좋아한다.
Roger Lindsjö

4
+1 사람들은 항상 자바 문자열을 변경할 수 없다고 말합니다. 당신은 그들이 아니라는 것을 증명합니다.
Victor Stafusa

16
유쾌하게 불쾌하지만 역 실행의 요구 사항은 충족되지 않습니다.
Thorbjørn Ravn Andersen 님이

4
@ ThorbjørnRavnAndersen shhhh ... 당신은 그들에게 말하지 않아야합니다. : p
Danny

5
@Victor Java에서 문자열 변경할 수 없습니다. Stackoverflow 전체에서 "문자열이 변경 불가능하다고 생각했습니다"와 같은 질문이 있습니다. 그들은 반사를 사용하며 불변으로 보입니다. Java의 약속은 다음과 같이 작동합니다. "우리가 의도 한 방식으로 사물 / 클래스를 사용하는 경우, 우리는 그 주장이 정확하다고 약속합니다." 반성은 클래스가 사용하는 방식이 아닙니다.
Justin

70

C (그리고 일종의 파이썬)

질문 형식에 완벽하게 맞도록 매크로를 사용하는 새로운 버전. Quincunx의 의견에 따라, 나는 return그것을 더 멋지게 만들기 위해 추가 했습니다.

파이썬에서도 작동하지만 올바른 순서로 인쇄됩니다.

#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 문을 가질 수 있습니다.
Justin

@Quincunx, 당신은 정의 할 수 없지만, 당신은 지금 내가 한 것을 }정의 할 수 있습니다 return. 그것은 거의 폴리 글롯입니다. print구문은 여러 스크립트 언어로 작동하고 #define종종 주석이지만 main(){..}찾을 수있는 언어로는 작동하지 않습니다.
ugoren

1
@Quincunx, 그리고 지금은 정말 폴리 글 로트입니다.
ugoren

처음 두 개는 공백없는 작업을 어떻게 정의합니까? 를 만들 것 print으로 교체 "\n",printf(?
phuclv

@ LưuVĩnhPhúc-공간은 선택 사항입니다. 말한대로 바뀝니다.
ugoren

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"

그것의 참고 정확히 맞게에만 약간의 backwardification로, 요청의 형식 모드의 구문을 . 이 모드는 현재 Firefox 최신 버전에서만 지원됩니다 .

마지막 참고 사항 : 실제로 역방향 모드는 없습니다. 그러나 이것은 여전히 ​​Firefox에서 실행되는 유효한 스크립트입니다 (모든 것을 복사하십시오). :디


ES6 "휴식 모드"

보너스 : 여기에는 역방향 모드를 사용하지 않고 JS 엔진이 지정된 JS 구문의 준수 여부에 관계없이 코드가 수행해야 할 작업을 추측하려고하는 새로 지정된 "lax 모드"를 사용하는 업데이트 된 버전이 있습니다 ( 기본적으로 엄격 모드의 대립) :

// 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 mode "는 현재 Firefox> = 34에서만 사용할 수 있습니다.; P


7
게시 한 3 개의 링크가 모두 404입니다. 이런 종류의 농담입니까?
manatwork

8
아 나는 지금 본다. 구문 형광펜은 여기서 공범자였습니다.
manatwork

12
이것은 콤보 인기 경연 대회코드 트롤링입니다 . :) 나는 그것을 좋아한다.
찰스

8
이것은 Javascript의 경이로운 남용입니다. 나는 그것을 좋아한다.
Seiyria 2019

2
교활한. Soooo sneaky ....
David Conrad

59

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
나는 이것을 가지고 있기 때문에 이것을 선호합니다
Ray

2
두 가지 해결책이 있다면 정상적으로 두 가지 답변을 게시하지 않습니까?
The Constructor

3
ruby코드 블록으로 더 이상 보이지 않습니까? pastebin.com/LDWpxKx8
manatwork

2
@PacMani 그 parens는 공백을 사용하지 않고 공백을 사용합니다.
corsiKa

@manatwork 좋은 하나! 그래도 method_missing꽤 루비 같은 것이라고 생각 합니다.
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

24
누군가가 "창의적이며 단지 goto";-)라고
쓰지 말라고 생각했습니다.

22
@TheConstructor 크리에이티브 부분은 PHP에서 goto 사용 하고 있습니다 ;)
NikiC

1
승리로 가득합니다.
Nick T

41

하스켈

프로그램이 이제 오른쪽에서 왼쪽으로 기능 구성처럼 보이기 때문에 이것은 거의 관용적 Haskell입니다. 함수가 인쇄되지 않았지만 (유용한) 값을 반환하는 것이면 연산자 선언이 필요하지 않으며 코드는 라이브러리에서 볼 수 있습니다.

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

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

5
팁 :(<<) = flip (>>)
Bergi

@ Bergi 그것은 그것을 쓰는 또 다른 방법입니다, 나는 조금 더 우아하다고 생각합니다. 실제로 prelude (또는 Control.Monad)에서 정의되지 않은 것을보고 약간 놀랐습니다.
shiona

@shiona : 예, 놓칠 수없는 놀라운 일입니다. 행복하게도, 우리는 Applicatives의 연산자를 모두 가지고 있습니다 : <**>.
Tikhon Jelvis 2012

1, 실제로 @TikhonJelvis <*실용적 운영자가이 다르다 <<: a <* b에 해당 do x<-a;b;return x가 실행 즉, a첫 번째의 효과를
자랑 haskeller

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

4
@Cruncher 나는 알고 있지만 1 초 간격으로 역순 이외의 인쇄 가능성은 상당히 적습니다.
Gareth

3
@Gareth 그것이 이론적으로 기울임 꼴이 된 이유입니다. :)
Cruncher

3
@Cruncher 그렇게 재미 있지 않습니까?
Pierre Arlaud

이론적으로 내 원자가 벽을 통과 할 수 있는 것과 같은 방식으로 @Cruncher ?
cdeange

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
아무도 공감대를 설명 할 수 있습니까? 이것은 인쇄 할 때 작동합니다.
Mr Lister

당신은 또한 할 수 있습니다p {float:right;}
Noyo

그러나 결과는 모두 한 줄에 있습니다!
Mr Lister

... 그리고 그것은 허용됩니다. :]
Noyo

1
... 허용되지 않습니다. : D div로 감싸서 CSS 규칙을 추가 할 수도 있습니다 div {float:left}.
Noyo

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; }},
    };
}

(동일하지만 람다와 배열 데이터 멤버를 대신 사용합니다.)


을 사용하여 솔루션을 게시했으며 std::function제거하려고했습니다. 당신이 그것을 가지고 있기 때문에 지금은 필요하지 않습니다!
sergiol

21

하스켈

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

21

자바 스크립트

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 : setTimeoutES가 아닌 HTML5 / 타이머로 표준화되었습니다. 또한 최소 제한 시간은 4ms입니다. :-)
Bergi

1
@Bergi Yep, 물론입니다! HTML 표준-타이머 -누군가 관심이 있다면.
ComFreek

1
이것을 충분히 느린 머신 (예 : 다른 여러 응용 프로그램을 실행하는 8086)에서 실행하면 실패합니다. (실패하면, 각 명령을 실행하는 데 100ms 이상이 걸리기 때문에 순서가 바뀌지 않을 것입니다.
Jeff Davis

1
@ lastr2d2 while 루프를 사용하여 느린 컴퓨터를 시뮬레이트하는 것은 상당히 주관적이지만 jsfiddle.net/7zbKw/1같습니다 . 에서 참고 whatwg.org/specs/web-apps/current-work/multipage/... "타이머가 일정에 따라 정확히 실행됩니다. 때문에 CPU 부하, 다른 작업 등으로 지연을 보장하지 않습니다이 API는, 예상 할 수있다"고 말했다.
Jeff Davis

20

질문의 팁을 최대한 창의적으로 만들려고합니다.

#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의 좋은 남용 : P +1
masterX244

15

BF

셀 랩핑을 가정합니다.

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

작동하는 이유

첫 번째 줄과 마지막 줄은 4 번 반복되는 루프를 구성합니다 (카운터 = cell0).

루프 안에는 cell1매 실행마다 증가 하는 카운터 변수 ( )가 있습니다.

각 줄은 4, 3, 2 또는 1 씩 감소하는 것이 0인지 확인합니다. 따라서 첫 번째 실행에서 카운터는 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$2: function 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

좋아, 좋아 :-)
Timtech

12

파이썬 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

11

커먼 리스프 № 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

커먼 리스프 № 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

9

에프#

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)는 미적분이며 프로그래밍이 아닙니다.
Jeff Davis

2
@JeffDavis : 확신 (?) f g x으로 대략 읽고 (?)(f, g, x),하지f(g(x))
에릭

9

이동 (골랑)

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

@Art, 굉장하다! Code Golf에서 더 많은 Go가 사용되기를 바랍니다.
cory.todd

아마 일어나지 않을 것입니다. Go는 압축하는 것이 좋지 않으며 의도적으로 이상한 구성을 제한하여 읽을 수없는 혼란을 만들 수 없습니다. 그러나이 경우 (그리고 다른 인기있는 경연 대회) 기회가 있습니다.
Art

8

파이썬 3

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

마지막 행에서 모든 공백을 제거하여 6 바이트 더 짧을 수 있습니다.


7

자바 스크립트

[
  "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::reverseand 대신에 std::for_each간단히 사용하십시오while (! functors.empty()) { functors.back()(); functors.pop_back(); }
David 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

7

씨#

Run 메서드를 직접 호출하는 대신로드 문자열 opcode 피연산자가 교체되는 것을 제외하고 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.