8 가지 숫자를 출력하는 8 가지 방법으로 코드 읽기


21

영어와 대부분의 프로그래밍 언어는 왼쪽에서 오른쪽으로, 위에서 아래로 읽히지 만 읽을 필요는 없습니다 .

실제로 텍스트 블록

ABC
DEF

읽을 수있는 8 가지 관련 방법을 생각할 수 있습니다.

  1. 왼쪽에서 오른쪽, 위에서 아래 (LTR-TTB) : ABCDEF
  2. 위에서 아래로, 왼쪽에서 오른쪽으로 (TTB-LTR) : ADBECF
  3. 왼쪽에서 오른쪽, 아래에서 위로 (LTR-BTT) : DEFABC
  4. 하단에서 상단, 왼쪽에서 오른쪽 (BTT-LTR) : DAEBFC
  5. 오른쪽에서 왼쪽, 위에서 아래 (RTL-TTB) : CBAFED
  6. 위에서 아래로, 오른쪽에서 왼쪽 (TTB-RTL) : CFBEAD
  7. 오른쪽에서 왼쪽으로, 위에서 아래로 (RTL-BTT) : FEDCBA
  8. 하단에서 상단, 오른쪽에서 왼쪽 (BTT-RTL) : FCEBDA

도전

선택한 8 가지 단일 라인 프로그램 으로 위의 8 가지 방법으로 읽을 수있는 직사각형의 텍스트 블록을 작성 하십시오. 이러한 각 프로그램은 1에서 8까지 다른 정수를 출력해야합니다.

어떤 판독 방향이 어떤 숫자를 출력하는지는 중요하지 않으며, 위의 숫자와 일치하지 않아도됩니다. 예를 들어 텍스트 블록이 여전히

ABC
DEF

다음 프로그램의 ABCDEF힘 출력 5FEDCBA힘 출력 2, 및 다른 육 개 프로그램 것 출력 1, 3, 4, 6, 7, 그리고 8어떤 순서로한다.

텍스트 블록은 줄 종결 자를 제외한 모든 문자를 포함 할 수 있습니다 .

언어에 적절한 stdout이 없으면 출력이 stdout 또는 유사한 대안으로 이동해야합니다. 입력이 없습니다. 프로그램이 REPL 환경에서 실행되고 있다고 가정 할 수 있습니다.

Pietu1998는 자선 적으로 자발적 으로 텍스트 블록이 주어 졌을 때 8 가지의 다른 한 줄 프로그램을 제공 JSFiddle 을 . 스택 스 니펫으로 만들었습니다.

<script>function f(n){n=n.split("\n");var e=n.map(function(n){return n.length}).sort()[n.length-1];n=n.map(function(n){return(n+Array(e+1).join(" ")).substring(0,e)});var t=n[0].split("").map(function(e,t){return n.map(function(n){return n[t]}).join("")});n=[n.join(""),n.reverse().join(""),t.join(""),t.reverse().join("")],n=n.concat(n.map(function(n){return n.split("").reverse().join("")})),document.getElementById("a").innerHTML=n.map(function(n,e){return document.getElementById("b").checked?n+"   "+"LLTTRRBB"[e]+"T"+"RRBBLLTT"[e]+"-"+"TBLRBTRL"[e]+"T"+"BTRLTBLR"[e]:n}).join("\n")}</script><textarea onkeyup="f(this.value)" id="c" placeholder="Code"></textarea><br/><input type="checkbox" id="b" onchange="f(document.getElementById('c').value)" checked/>&nbsp;<label for="b">Show directions</label><br/><pre id="a"></pre>

Martin의 CJam 버전은 여기 에서 여전히 찾을 수 있습니다 .

채점

점수는 텍스트 블록의 영역 (너비와 높이)입니다. 가장 낮은 점수를받은 제출이 승리합니다. (실제로 가장 작은 코드가 승리하므로 태그입니다.) Tiebreaker는 이전에 게시 된 제출물로갑니다.

예는 2 x 3이므로 점수는 6입니다. 4 개 (2 x 2) 미만의 점수는 불가능하므로 8 개의 프로그램 중 일부가 동일하고 두 개의 다른 값을 출력 할 수 없기 때문입니다.


6
왜 "인쇄 가능한 ASCII 만"규칙입니까? 이는 APL이이 도전에 참여할 수 없다는 것을 의미합니다. :(
Moris Zucca

3
코드 블록을 8 개의 프로그램으로 변환 하는 바이올린 을 만들었습니다 . 스 니펫으로 포함될 수 있지만 OP에 대한 의견을 원합니다.
PurkkaKoodari

3
@ MartinBüttner 좋아요, 고쳤습니다. String.prototype.repeat()여전히 새로운 것 같습니다 . 또한 IE에서 작동하는 것으로 확인되었습니다. 새로운 바이올린
PurkkaKoodari

@MorisZucca 줄 종결 자 이외의 모든 문자가 허용됩니다.
Calvin 's Hobbies

@ Pietu1998 Fiddle에 감사드립니다. 저는 이것을 스 니펫으로 추가했습니다.
Calvin 's Hobbies

답변:


21

J, 3 * 3 = 9

1[2
+2+
2+2

모든 방향으로 실행 :

       ". '1[2+2+2+2','2+2+2+1[2','1+2[2+2+2','2+2[2+1+2','2+2+2+2[1','2[1+2+2+2','2+2+2[2+1',:'2+1+2[2+2'
1 7 3 4 8 2 6 5

설명:

  • J에서는 실행이 오른쪽에서 왼쪽으로 진행되며 연산자 우선 순위가 없습니다.
  • 그만큼 [ ( left본질적 우리의 발현 등의 전부 우측이 취소되도록) 두 개의 피연산자의 왼쪽을 취 1+2[2+2+2하게 1+2[6다음과1+2 .
  • 왼쪽 표현식은 총 1, 2, 3 및 4 피연산자가있는 덧셈입니다. 각 n피연산자 표현식 중 하나는 숫자가 1있고 다른 하나는 2s 만 있습니다. 덧셈 1은 홀수 를 생성하고 다른 덧셈 은 짝수를 생성합니다.

5
정말 좋습니다. 교체 [;그것은 대부분의 언어 'REPL 환경에서 작동합니다.
Optimizer

18

베 펀지 -98 ,5x5 = 25 5x3 = 15

1+4+2
$.@.$
3+4+4

나는 올바른 숫자를 찾은 작은 스크립트를 썼습니다. 시간이 걸렸지 만 GolfScript를 이겼습니다! :디

내가 사용한 스크립트는 여기여기 에 있지만 코드 스타일이 매우 발암 성이 있으므로 스크립트를 보지 않는 것이 좋습니다.

서브 프로그램

1+4+2$.@.$3+4+4   LTR-TTB   5
3+4+4$.@.$1+4+2   LTR-BTT   7
1$3+.+4@4+.+2$4   TTB-LTR   3
2$4+.+4@4+.+1$3   TTB-RTL   4
4+4+3$.@.$2+4+1   RTL-BTT   8
2+4+1$.@.$4+4+3   RTL-TTB   6
4$2+.+4@4+.+3$1   BTT-RTL   2
3$1+.+4@4+.+4$2   BTT-LTR   1

구 버전

 1.6
3 @ 4
.@ @.
8 @ 7
 2.5

서브 프로그램

숫자 1-8을 각각 출력하십시오.

 1.6 3 @ 4.@ @.8 @ 7 2.5    LTR-TTB
 2.5 8 @ 7.@ @.3 @ 4 1.6    LTR-BTT
 3.8 1 @ 2.@ @.6 @ 5 4.7    TTB-LTR
 4.7 6 @ 5.@ @.1 @ 2 3.8    TTB-RTL
 5.2 7 @ 8.@ @.4 @ 3 6.1    RTL-BTT
 6.1 4 @ 3.@ @.7 @ 8 5.2    RTL-TTB
 7.4 5 @ 6.@ @.2 @ 1 8.3    BTT-RTL
 8.3 2 @ 1.@ @.5 @ 6 7.4    BTT-LTR

14

Brainfuck $ , 4x3 = 12

브레인 퍽 $는 매우 유사하다 브레인 퍽 하지만,이 문제에 매우 유용 숫자 출력으로 현재 셀 값, 출력 명령을 포함하여 좀 더 많은 명령을 가지고 있습니다.

++:+
  ++
++++

한 줄 명령 :

++:+  ++++++   LTR-TTB, outputs 2
++++  ++++:+   LTR-BTT, outputs 8
+ ++ +:+++++   TTB-LTR, outputs 4
+++:+++ ++ +   TTB-RTL, outputs 3
++++++  +:++   RTL-BTT, outputs 7
+:++++  ++++   RTL-TTB, outputs 1
+++++:+ ++ +   BTT-RTL, outputs 5
+ ++ +++:+++   BTT-LTR, outputs 6

나는 당신이 Brainfuck $를 필요로하지 않는다고 주장 할 것이다; 명령. 간단히 사용하는 것이 좋습니다. 0x01-0x08을 완벽하게 출력합니다. 브레인 크 (Brainfuck)입니다. +1.
matega

이진 출력에 문제가 없습니다.
captncraig

7

TECO, 3 * 5 = 15

 +4 5
+2=4 
 +1 \

=마지막 숫자 식의 값을 인쇄합니다. \문자열에서 숫자를 읽거나 쓰는 데 사용되지만 여기서는 버림으로 만 사용합니다.

  • +4 5+2=4 +1 \ 7
  • + +2+4=1 4 5 \ 6
  • + +2+1=4 4 \ 5
  • +1 \+2=4 +4 5 2
  • \ 1+ 4=2+5 4+ 5
  • \ 5 4 1=4+2+ + 1
  • 5 \ 4 4=1+2+ + 4
  • 5 4+ 4=2+\ 1+ 8

7

piet-12x12 = 144

여기에 이미지 설명을 입력하십시오

한 줄 프로그램은 절대 종료 할 수 없으므로 첫 번째 출력 후에 종료한다고 가정하십시오.

단일 이미지에서 8 개의 서브 프로그램 :

여기에 이미지 설명을 입력하십시오


6

GolfScript, 4x4 = 16

1})7
)  }
}  )
3)}5

예전의 "슈퍼 코멘트"를 사용합니다. 일치하지 않는 }코드는 나머지 코드를 무시합니다 (실제로이 #코드는 모든 코드가 한 줄로 실행되기 때문에 일반 코멘트 도 작동했을 것입니다). 따라서 각 모서리에는 단일 번호 만 있거나 다른 방향으로 1 씩 증가합니다. 실행이 종료되고 스택 내용이 인쇄되기 때문입니다. 8 개의 프로그램은

1})7)  }}  )3)}5  # LTR-TTB
1)}3}  ))  }7})5  # TTB-LTR
3})1)  }}  )5)}7  # BTT-LTR
3)}5}  ))  }1})7  # LTR-BTT
5})3)  }}  )7)}1  # RTL-BTT
5)}7}  ))  }3})1  # BTT-RTL
7})5)  }}  )1)}3  # TTB-RTL
7)}1}  ))  }5})3  # RTL-BTT

5

하스켈, 26x26 = 676

주석 ( --)을 사용 하여 앞뒤 비트를 숨 깁니다. 이건 정말 길어

main=print 1--2 tnirp=niam
a                        a
i                        i
n                        n
=                        =
p                        p
r                        r
i                        i
n                        n
t                        t

3                        4
-                        -
-                        -
5                        6

t                        t
n                        n
i                        i
r                        r
p                        p
=                        =
n                        n
i                        i
a                        a
main=print 7--8 tnirp=niam

2
이것이 인라인 주석으로 대부분의 언어로 확장 될 수있는 것 같습니다
Sp3000

4

전주곡 , 5x3 = 15

12 34
  !  
56 78

이것은 파이썬 인터프리터를 가정합니다. 문자 코드 대신 숫자로 값을 인쇄 .

이것은 Befunge $를이기는 것이 아니라 GolfScript 제출을이기는 것이므로 단순함을 좋아합니다. 또한 지금까지 다른 제출물보다 적은 9 개의 비 공백 문자 만 사용합니다 (J는 다시칩니다). Prelude에서는 각 숫자가 스택에 개별적으로 푸시되며 경로에 따라. 바로 앞에 다른 숫자가 있습니다.이 숫자 !는 맨 위 스택 요소 만 인쇄합니다. 8 가지 프로그램은 다음과 같습니다.

12 34  !  56 78   LTR-TTB   4
56 78  !  12 34   LTR-BTT   8
1 52 6 ! 3 74 8   TTB-LTR   6
4 83 7 ! 2 61 5   TTB-RTL   7
87 65  !  43 21   RTL-BTT   5
43 21  !  87 65   RTL-TTB   1
8 47 3 ! 6 25 1   BTT-RTL   3
5 16 2 ! 7 38 4   BTT-LTR   2

대안으로,

 1 3 
1+!+1
 5 7 

수직 경로에서 홀수를 푸시하고 수평 경로에서 홀수를 증가시킵니다 1.

 1 3 1+!+1 5 7    LTR-TTB   4
 5 7 1+!+1 1 3    LTR-BTT   8
 1 1+5 ! 3+7 1    TTB-LTR   5
 1 3+7 ! 1+5 1    TTB-RTL   7
 7 5 1+!+1 3 1    RTL-BTT   6
 3 1 1+!+1 7 5    RTL-TTB   2
 1 7+3 ! 5+1 1    BTT-RTL   3
 1 5+1 ! 7+3 1    BTT-LTR   1


1

루비-7x7

하스켈의 대답과 같은 전술도 인상적이지 않습니다.

p 1#2 p

3     7
#     #
4     8

p 5#6 p

1

R, 9x9

공백도없고 주석도 없습니다.

75%%99299
99%%99699
%%299%%41
%%699%%06
995999997
11%%999%%
99%%799%%
39719%%99
59519%%16

나는 이것이 원하는 크기로 확장 될 수 있다고 생각합니다. 모듈러스 연산자는 데이터 크기에 관계없이 값이 너무 커지는 것을 막기 때문에 사용 가능한 연산자 중 가장 유연한 연산자라고 생각했습니다.

75%%9929999%%99699%%299%%41%%699%%0699599999711%%999%%99%%799%%39719%%9959519%%16   LTR-TTB  2
59519%%1639719%%9999%%799%%11%%999%%995999997%%699%%06%%299%%4199%%9969975%%99299   LTR-BTT  3
79%%9193559%%91999%%265%%75%%999%%1199999979999%%999%%26%%999%%99409%%9199167%%96   TTB-LTR  4
99167%%9699409%%9126%%999%%99%%999%%999999799%%999%%11%%265%%7559%%9199979%%91935   TTB-RTL  1
61%%9159599%%91793%%997%%99%%999%%1179999959960%%996%%14%%992%%99699%%9999299%%57   RTL-BTT  5
99299%%5799699%%9914%%992%%60%%996%%799999599%%999%%11%%997%%9999%%9179361%%91595   RTL-TTB  6
69%%7619919%%90499%%999%%62%%999%%9999799999911%%999%%57%%562%%99919%%9553919%%97   BTT-RTL  7
53919%%9799919%%9557%%562%%11%%999%%997999999%%999%%99%%999%%6219%%9049969%%76199   BTT-LTR  8

1

프로그래밍 언어, 5 * 9 = 45

1i;i2
2   2
+   +
i   i
;   ;
i   i
+   +
2   2
5i;i6

이것은 이것으로 번역됩니다 :

1i;i22   2+   +i   i;   ;i   i+   +2   25i;i6
5i;i62   2+   +i   i;   ;i   i+   +2   21i;i2
12+i;i+25i       i;       ;i       i22+i;i+26
22+i;i+26i       i;       ;i       i12+i;i+25
6i;i52   2+   +i   i;   ;i   i+   +2   22i;i1
2i;i12   2+   +i   i;   ;i   i+   +2   26i;i5
62+i;i+22i       i;       ;i       i52+i;i+21
52+i;i+21i       i;       ;i       i62+i;i+22

때문에이 ;프로그램이에 상기를 번역 종료 :

1i;   - outputs 1
5i;   - outputs 5
12+i; - outputs 3
22+i; - outputs 4
6i;   - outputs 6
2i;   - outputs 2
62+i; - outputs 8
52+i; - outputs 7

설명 : 임의의 수 09스택에 대응하는 숫자를 민다. +상위 두 값 팝업 xy스택 오프 밀고 x + y스택에. i스택을 정수로 출력합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.