이것은 자기 참조 문제입니다


49

Tupper의 자기 참조 공식 (Wikipedia에서 복사)

Tupper의 자기 참조 공식은 Jeff Tupper에 의해 정의 된 공식입니다. 평면에서 매우 특정한 위치에서 2 차원으로 그래프를 그릴 때 공식 자체를 시각적으로 재현하도록 "프로그래밍"할 수 있습니다. 다양한 수학 및 컴퓨터 과학 과정에서 그래프 작성 공식으로 사용됩니다.

터퍼의 자기 참조 공식

바닥 플로어 기능은 어디에 있습니까 ?

하자 k다음 543 자리 숫자 : 960939379918958884971672962127852754715004339660129306651505519271702802395266424689642842174350718121267153782770623355993237280874144307891325963941337723487857735749823926629715517173716995165232890538221612403238855866184013235585136048828693337902491454229288667081096184496091705183454067827731551705405381627380967602565625016981482083418783163849115590225610003652351370343874461848378737238198224849863465033159410054974700593138339226497249461751545728366702369745461014655997933798537483143786841806593422227898388722980000748404719

하나의 점의 집합 그래프 경우 (x, y)하여 0 <= x < 106그리고 k <= y < k + 17위의 부등식을 만족하는 것이, 결과 그래프는 다음과 같다 (달리 영상이 거꾸로 나오고,이 그래프의 축이 반전되었음을 주) :

터퍼의 자기 참조 공식의 결과

그래서 무엇?

이 공식에 대한 흥미로운 점은 가능한 흑백 106x17 이미지를 그래프로 표시하는 데 사용할 수 있다는 것입니다. 실제로 검색을 통해 검색하는 것은 매우 지루한 작업이므로 이미지가 나타나는 k- 값을 알아낼 수있는 방법이 있습니다. 과정은 매우 간단합니다.

  1. 이미지의 첫 번째 열의 맨 아래 픽셀부터 시작하십시오.
  2. 픽셀이 흰색이면 k 값에 0이 추가됩니다. 검은 색이면 1을 추가하십시오.
  3. 2 단계를 반복하여 열을 위로 이동하십시오.
  4. 열의 끝에서 동일한 프로세스에 따라 다음 열로 이동하고 맨 아래부터 시작하십시오.
  5. 각 픽셀을 분석 한 후이 이진 문자열을 10 진수로 변환하고 17을 곱하여 k 값을 얻습니다.

내 직업이 뭐야?

당신의 임무는 106x17 이미지를 가져 와서 해당 k 값을 출력 할 수있는 프로그램을 만드는 것입니다. 다음과 같은 가정을 할 수 있습니다.

  1. 모든 이미지는 정확히 106x17입니다
  2. 모든 이미지에는 검은 색 (# 000000) 또는 흰색 (#FFFFFF) 픽셀 만 포함되며 그 사이에는 아무 것도 없습니다.

몇 가지 규칙도 있습니다.

  1. 출력은 단순히 k- 값입니다. 올바른 기반이어야하지만 모든 형식 일 수 있습니다.
  2. PNG 또는 PPM에서 이미지를 읽어야합니다.
  3. 표준 허점이 없습니다.

테스트 이미지

[ 닌텐도] ~ 1.4946x10 542를 생성해야합니다.

[ 큰 숫자] ~ 7.2355x10 159를 생성해야합니다.

[ 2 ^ 1801 * 17]는 2 1801 * 17을 생성해야합니다

[ 2 ^ 1802-1 * 17]는 (2 1802 -1) * 17을 생성해야합니다

정확한 솔루션은이 요지를 확인하십시오.

이것은 이므로 바이트 수가 가장 적습니다.


유용한 링크

위키 백과

볼프람 수학 세계


PPM을받을 수 있습니까?
Maltysen

편집 : 예, PPM 형식이 허용됩니다. 프로그램을 만들 때 PNG를 사용하려고했지만 PPM을 허용하면 더 많은 골프 언어가 참여할 수 있어야합니다.
Kade

3
이 질문을 읽으면서 "내 직업이 무엇입니까"부분에 도달하기 전에 quine어딘가에서 그 단어를 보게 될 것 입니다.
Jacob

나는 이런 종류의 일을 할 수있는 프로그래머 인 척하지 않고 대신 무고하고 진지한 질문을 제시 할 것입니다. 그렇습니다. 그러나 반대로 할 수 있습니까? 즉, 솔루션에 공급하고 결과로 생성 된 * .png가 표시됩니까?

@NotAsSharpAsYouGuys : 임의의 정밀 산술이 사소한 경우 각 픽셀에 대해 해당 수식의 결과를 확인하고 결과 이미지를 출력하면됩니다.
Matteo Italia

답변:


12

CJam, 16

l,l~q:~f*/W%ze_b

Dennis에게 큰 감사를드립니다. 온라인으로 사용해보십시오

URL에 문제가있는 경우 테스트 한 입력입니다.

P1
106 17
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000011111100000000000000000000000
0000000000000000000000000000000000000000000000000000000000000111111000
0000011111100110000000000000000000000000000000000000000000000000000000
0000000000000000000000000110011111100000100111100001000000000000001100
0110000000000000000000000000000000000000000000000000000000001000011110
0100010011111100001000000000000100101001110000000000000000000000000000
0011000000000000000000000100001111110010010110000110001000000000000100
0110010010000000011000000000000000000100100000000000000000000100011000
0110101111000000111111000000000001000110010011111100100100111001111100
0111001011110000000000000011111100000011111111000000110111000000000001
0000100111100000110000110001100000101000001100001000000000000011101100
0000111110110000001000010000000000010010000100100110011001100100100110
0100110010011001000000000000100001000000110110011000011000010000000000
0100110001001001100110011000001001100100110010011001000000000000100001
1000011001100111111111001100000000000100110001001001100110011001111001
1001001100100110010000000000001100111111111001101111111111111100000000
0001001010010010011001100101000110011001100000110000100000000000001111
1111111111010111001001001110000000000000110001101101100110011000111001
1001100111110011110000000000000001110010010011100010001001000100000000
0000000000000000000000000000000000000000000000000000000000000000000000
1000100100010000100000000001000000000000000000000000000000000000000000
0000000000000000000000000000000000001000000000010000010000000010000000
0000000000000000000000000000000000000000000000000000000000000000000000
0001000000001000000011111111000000000000000000000000000000000000000000
0000000000000000000000000000000000000000111111110000

주석을 제거하고 김프가 ASCII pbm으로 내보낼 때 생성 한 형식을 사용했습니다.

설명:

l,    read the first line ("P1" magic number) and get its length (2)
l~    read and evaluate the second line (106 17)
q     read the rest of the input (actual pixels)
:~    evaluate each character ('0' -> 0, '1' -> 1, newline -> nothing)
f*    multiply each number by 17
/     split into rows of length 106
W%    reverse the order of the rows
z     transpose
e_    flatten (effectively, concatenate the lines)
      now we have all the pixels in the desired order, as 0 and 17
b     convert from base 2 "digits" to a number

나는 당신을 위해 URL에 도착했습니다.
mbomb007

@ mbomb007 감사합니다, 무엇이 잘못되었는지 확실하지 않습니다.
aditsu

의견을 다룰 필요가 없다면 l;l~\qN-/W%zs:~2b*잘 작동해야합니다.
Dennis

@ 데니스 OMG, 거기에 몇 가지 광채가 있습니다 :) 혼자서 게시하고 싶습니까?
aditsu

별도의 답변이 귀하의 답변과 충분히 다를 것이라고 생각하지 않습니다.
Dennis

17

Pyth-21 바이트

pyth의 i기본 변환으로 간단합니다 . PBM파일 이름으로 입력을 받고 '명령을 사용하여 읽습니다 . 나는 !M흑인과 백인을 부정 하기 위해 사용해야 했다. 그 밖의 모든 것은 자명하다.

*J17i!MsC_cJrstt.z7 2

온라인으로 사용해보십시오 . (웹 인터프리터는 파일을 읽을 수 없으므로 수정되어 파일을 입력으로 사용합니다).


60
Pyth의 어떤 것도 자명 하다고 생각하지 않습니다 . : /
Alex A.

3
내가 아는 언어는이 언어를 이길 수 없습니다. 그러나 내가 아는 어떤 언어도 "골프를위한"언어가 아닙니다.
Mahesh

링크를 열 수 없습니다. 경로가 너무 깁니다. (Safari 8.1)
Kametrixom 2016 년

예시 이미지가 잘못되었습니다. P3 대신 P2를 사용 했습니까?
aditsu

아 잠깐만 요, P2도 아니고 P1처럼 보이지만 거꾸로
aditsu

9

파이썬 2 : 133 110 바이트

PIL을 사용하여 파이썬에서 첫 번째 시도 :

from PIL.Image import*
j=open(input()).load()
a=k=0
while a<1802:k=(j[a/17,16-a%17][0]<1)+k*2;a+=1
print k*17

아래에서 도움이되는 댓글 작성자 덕분에


2
한 번만 Image.open (input ()). load를 사용하고 수정하는 것처럼 보이지 않으므로 var j를 사용하는 대신 그대로 사용하는 것이 좋지 않습니까? 이 같은 것입니다from PIL import Image k=0 for a in range(1802):y=a%17;x=a/17;k=(0 if Image.open(input()).load()[x,16-y][0]else 1)+k*2 print k*17
Katenkyo

3
Katenkyo의 관점 @에 계속, 당신은 또한 단지에 연결할 수 a/17a%17적절한 위치에, 당신은 1 truthy이고 0 falsy는 사실을 악용 할 수 있습니다. 이러한 변경의 결과는 다음 과 같습니다. 111 바이트로 줄어 듭니다.
Kade

@Kateyenko는 슬프게도 input()그 수정으로 루프의 모든 반복에서 호출됩니다. 그러나 다른 팁으로 편집하면 감사합니다.
joc

1
(...<1) --> 0**...아마도?
Sp3000

7

C #, 199

이것은 재미 있었다! 비트 맵을 106 * 17 번 다시로드해도 아무 문제가 없습니다. 바이트를 절약하는 함수로 사용했지만 합법적인지 확실하지 않습니다.

BigInteger s(string i){return (Enumerable.Range(0,106).SelectMany(x=>Enumerable.Range(0,17).Select(y=>new BigInteger(new Bitmap(i).GetPixel(x,y).B==0?1:0)).Reverse()).Aggregate((x,y)=>(x<<1)+y)*17);}

i 입력 파일 이름입니다.

또한 단일 표현식으로서, i제공된 또는 서브 베드 (167 바이트) 가있는 하나의 표현식이기 때문에

(Enumerable.Range(0,106).SelectMany(x=>Enumerable.Range(0,17).Select(y=>new BigInteger(new Bitmap(i).GetPixel(x,y).B==0?1:0)).Reverse()).Aggregate((x,y)=>(x<<1)+y)*17)

1
질문은 "당신의 직업은 프로그램 을 만드는 것입니다 ..."
Sean Latham

1

매스 매 티카 69 바이트

17*FromDigits[1-Flatten[Reverse/@Transpose[ImageData@Binarize@#]],2]&

이미지가 흑백 형식 인 경우 Binarize @를 생략 할 수 있습니다.

이 기능은 이미지를 재현합니다 :

   ArrayPlot[Table[Boole[1/2<Floor[Mod[Floor[y/17]2^(-17Floor[x]-Mod[Abs[y],17]),2]]],{y,1+#,17+#},{x,106,1,-1}]]&
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.