순수 출처-0에서 9까지의 숫자를 출력하는 프로그램 형성


21

다음은 0에서 9까지의 숫자에 대한 픽셀 화 된 5 x 7 글꼴입니다.

.███.
█...█
█...█
█...█
█...█
█...█
.███.

..█..
███..
..█..
..█..
..█..
..█..
█████

.███.
█...█
....█
...█.
..█..
.█...
█████

.███.
█...█
....█
..██.
....█
█...█
.███.

█..█.
█..█.
█..█.
█████
...█.
...█.
...█.

█████
█....
█....
.███.
....█
█...█
.███.

.███.
█...█
█....
████.
█...█
█...█
.███.

█████
....█
....█
...█.
...█.
..█..
..█..

.███.
█...█
█...█
.███.
█...█
█...█
.███.

.███.
█...█
█...█
.████
....█
█...█
.███.

(이 글꼴과이 페이지는 브라우저 콘솔이나 javascript::로 시작하는 URL 표시 줄에서이 JavaScipt 코드를 실행하면 더 좋아 보일 것입니다 $('#question pre,.answer pre').css('line-height',1).)

.위의 글꼴에서 빈 공간 ( )을 나타내는 하나와 채워진 공간 ( ) 을 나타내는 하나의 동일한 크기의 직사각형 텍스트 블록 두 개 를 작성하십시오 .

이 두 개의 텍스트 블록이 위의 숫자 중 하나와 동일한 5x7 패턴으로 배열되면 결과 큰 텍스트 블록은 해당 숫자를 표준 출력으로 인쇄하는 프로그램이어야합니다. 이것은 10 자리 모두에서 작동합니다.

예를 들어 .텍스트 블록이

---
'''

그리고 당신의 텍스트 블록은

ABC
123

그런 다음 프로그램

---ABCABCABC---
'''123123123'''
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
---ABCABCABC---
'''123123123'''

출력해야합니다 0. 마찬가지로, 프로그램

------ABC------
''''''123''''''
ABCABCABC------
123123123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
ABCABCABCABCABC
123123123123123

1에 대한 프로그램까지 출력해야 합니다 9.

이 스택 스 니펫을 사용하여 숫자 모양의 프로그램을 만들 수 있습니다.

<style>textarea{font-family:monospace;}</style><script>function go(){var t=parseInt(document.getElementById("digit").value[0]);if(isNaN(t))return void alert("Invalid digit.");for(var e=document.getElementById("empty").value.split("\n"),n=document.getElementById("filled").value.split("\n"),l=[],o=0;o<7*e.length;o++){l[o]="";for(var d=0;5>d;d++)l[o]+=font[t][Math.floor(o/e.length)][d]?n[o%n.length]:e[o%e.length]}document.getElementById("output").value=l.join("\n")}font=[[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[0,0,1,0,0],[1,1,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[1,1,1,1,1]],[[0,1,1,1,0],[1,0,0,0,1],[0,0,0,0,1],[0,0,0,1,0],[0,0,1,0,0],[0,1,0,0,0],[1,1,1,1,1]],[[0,1,1,1,0],[1,0,0,0,1],[0,0,0,0,1],[0,0,1,1,0],[0,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[1,0,0,1,0],[1,0,0,1,0],[1,0,0,1,0],[1,1,1,1,1],[0,0,0,1,0],[0,0,0,1,0],[0,0,0,1,0]],[[1,1,1,1,1],[1,0,0,0,0],[1,0,0,0,0],[0,1,1,1,0],[0,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,0],[1,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[1,1,1,1,1],[0,0,0,0,1],[0,0,0,0,1],[0,0,0,1,0],[0,0,0,1,0],[0,0,1,0,0],[0,0,1,0,0]],[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,1],[0,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]]]</script><textarea id='empty' rows='8' cols='32' placeholder='empty space text block...'></textarea><textarea id='filled' rows='8' cols='32' placeholder='filled space text block...'></textarea><br>Digit <input id='digit' type='text' value='0'> <button type='button' onclick='go()'>Generate</button><br><br><textarea id='output' rows='16' cols='64' placeholder='output...' style='background-color: #eee;' readonly></textarea>

세부

  • 10 개의 큰 텍스트 블록 프로그램 중 어느 것도 입력 할 필요가 없습니다. 한 자릿수와 선택적인 후행 줄 바꿈 만 출력하십시오. stdout 또는 유사한 대안으로 출력합니다.
  • 어떤 프로그램도 자신의 소스 코드를 읽거나 액세스 할 수 없습니다. 이것을 엄격한 퀴네 도전 처럼 취급하십시오 .
  • 텍스트 블록은 동일하지 않을 수 있으며 0이 아닌 치수를 가져야합니다.
  • 텍스트 블록은 줄 종결 자를 제외한 모든 문자를 포함 할 수 있습니다 .
  • 10 개의 프로그램은 같은 언어로 작성된 본격적인 프로그램이어야하며 REPL 스 니펫 이 아닙니다 . 선택적으로 그들 모두에 후행 줄 바꿈을 추가하거나 전혀 추가하지 않을 수 있습니다.

채점

점수는 텍스트 블록 중 하나의 영역 (너비 x 높이)입니다. 크기는 동일하므로 두 블록을 모두 세는 데는 아무런 의미가 없습니다. 예제의 영역은 3 x 2이며 점수는 6입니다.

가장 낮은 점수가 이깁니다. 동점 인 경우, 가장 높은 투표 응답이 이깁니다.


코드에서 많이 향상시킬 수 있습니다. var t=parseInt(document.getElementById("digit").value[0]);if(isNaN(t))return void alert("Invalid digit.");로 쓸 수 있습니다 var t=document.getElementById("digit").value[0]/1;if(t!=t)return void alert("Invalid digit.");. 동일하지만 더 짧습니다. 당신이 그것을 향상시킬 수있는 몇 가지 더 있지만, 좋아 보인다!
Ismael Miguel

4
@IsmaelMiguel TBH 나는 JS 축소기를 통해 한 줄에 넣었습니다. 결코 골프를해서는 안됩니다.
Calvin 's Hobbies

오, 친구 .. 조금 게으르다 .. 골프 질문에서 당신은 골퍼가 아닌 코드를 게시한다. 그러나 이봐. 내가 말한 것을 따를 필요는 없습니다. 그러나 좋은 일입니다.
Ismael Miguel

6
@IsmaelMiguel 필자는 ungolfed 유틸리티 코드를 게시 했다. 그러나 실제로 작동하는 한 스택 스 니펫의 코드 크기는 실제로 도전 과제의 결과와 전혀 관련이 없습니다.
Calvin 's Hobbies

3
text blocks may not be identical정말? 모든 숫자가 정확히 같은 코드 일 때 마술처럼 다른 숫자를 반환하는 두 개의 동일한 코드 블록을 제공하여 누군가이 규칙을 위반하고 싶습니다 ^^
Falco

답변:


13

CJam, 20 18 14 13 12 * 1 = 12

온라인으로 시도하십시오 : 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9

빈 블록

];BG*K+ :BD%

솔리드 블록

];B9+33%:B4/

설명

Sp3000의 솔루션 과 비슷한 전략을 사용하여 각 블록이 곱셈, 덧셈 및 변수에 대한 모듈로 연산을 수행하고 값을 다시 저장하도록했습니다. 최적의 해결책을 찾기 위해, 나는 좋은 오래된 무차별 힘을 사용했습니다. 가능한 모든 초기 값 (CJam 변수의 초기 값)과 모든 수백만 개의 가능한 변환 함수의 공간을 검색하여 모든 숫자 형식의 출력이 고유하도록 프로그램을 작성했습니다. 그런 다음 빈 블록으로 끝나는 숫자 형태의 최종 결과가 8 개인 최종 결과를 다른 곱하기, 추가 및 모듈로 공식을 통해 올바른 결과로 다시 매핑 할 수 있도록 결과를 필터링했습니다.

며칠간의 CPU 검색 시간이 지나면 지금까지 가장 좋은 결과는 크기가 12입니다! 이 솔루션은 값으로 시작 11하고 빈 블록 변환 함수는 x * 16 + 20빈 블록 결과 함수는 x % 13솔리드 블록 변환 함수는 (x + 9) % 33솔리드 블록 결과 함수는 x / 4입니다.


23

> <> (물고기) , 5 * 10 = 50

빈 블록

   \   !9 
4n;    n/ 
1n;\      
       \  
0n;n7\\\  

솔리드 블록

   \; n8/ 
     /!/!v
     \  ;6
3n;\ ! /nn
2n;n5<  8;

이 코드에는 논리 가 포함되어 있지 않거나 산술 에는 '미러'( /\)와 두 개의 '화살표'( <v) 와 함께> <>의 2D 명령어 포인터 (IP)의 정적 리디렉션 만 사용합니다 . 다른 흐름 컨트롤러는 !다음 문자를 뛰어 넘는 '트램폴린'( )입니다.

IP는 왼쪽 상단에서 동쪽으로 시작합니다. 일부 리디렉션 후 숫자에 도달하면 스택으로 푸시되어 인쇄되고 n프로그램은로 종료됩니다 ;.

프로그램 흐름

블록은 IP가 어느 지점에 들어 왔는지에 따라 프로그램의 현재 상태를 '인식'하여 포인터를 내 보내야하는 방향 (다음에 어떤 블록을 실행해야하는지)과 정확한 위치를 결정합니다. 포인터가 왼쪽에 있어야합니다 (새로운 상태). 물론 블록은 논리를 수행하지 않습니다.이 모든 동작은 리디렉터에서 나옵니다.


나는 이와 같은 대답을 원했습니다. 순수한 마법.
EagleV_Attnam

11

CJam, 23 22 19 * 1 = 19

빈 블록 :

];G)B%:G"73860594"=

솔리드 블록 :

];GW*B+3*D%:G    7-

온라인으로 사용해보십시오 .

나는 수학적 우연의 일치와 실패로 운을 얻으려고 노력하고 있으므로 Martin의 솔루션과의 고유성 매핑에 대한 약간 다른 접근법이 있습니다.

16. 빈 블록 1을 첨가하고 3을 곱 (11)를 추가, -1 11. 고체 블록 곱셈 모듈 가지고 시작은이 마법 매핑 13. 모듈 취 03456789(빈 블록 끝나는 숫자)에 41753026우리는 인덱스를 사용하여, 바로 잡으려고 12으로 깔끔하게 매핑 89됩니다. 7을 빼서 해결할 수 있습니다.


7

CJam, 28 27 x 1 = 27

여기에 시작이 있습니다.

빈 블록

U):U;                       

솔리드 블록

];U):UW+:WF%"1302986_7_54"=

여기에서 테스트하십시오. 코드가 너무 길어서 코드에 대한 영구 링크를 줄 수 없으므로 챌린지의 스 니펫에서 수동으로 코드를 복사해야합니다.

아이디어는 다음과 같이 모양을 해시하는 것입니다.

  • 각 "픽셀"에 대해 카운터를 증가시킵니다 U.
  • 각 검은 색 "픽셀" U에 대해 누계에 추가 합니다 W(에서 시작 -1). 결국 우리는이 모듈로 15를 사용하여 고유 한 결과를 얻습니다 .이 결과는 조회 문자열로 색인을 생성하는 데 사용됩니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.