순수 출처-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.