นี่คือปัญหาการอ้างอิงตนเอง


49

สูตรอ้างอิงตนเองของทัปเปอร์(คัดลอกมาจาก Wikipedia)

สูตรอ้างอิงตนเองของทัปเปอร์เป็นสูตรที่กำหนดโดยเจฟทัปเปอร์ซึ่งเมื่อกราฟในสองมิติที่ตำแหน่งที่เจาะจงมากในระนาบสามารถ "ตั้งโปรแกรม" เพื่อสร้างสูตรด้วยตนเอง มันถูกใช้ในวิชาคณิตศาสตร์และวิทยาศาสตร์คอมพิวเตอร์ต่าง ๆ เป็นการออกกำลังกายในสูตรกราฟ

สูตรอ้างอิงตนเองของทัปเปอร์

ชั้น ฟังก์ชั่นพื้นอยู่ที่ไหน

อนุญาตkเป็นหมายเลข 543 หลักต่อไปนี้: 960939379918958884971672962127852754715004339660129306651505519271702802395266424689642842174350718121267153782770623355993237280874144307891325963941337723487857735749823926629715517173716995165232890538221612403238855866184013235585136048828693337902491454229288667081096184496091705183454067827731551705405381627380967602565625016981482083418783163849115590225610003652351370343874461848378737238198224849863465033159410054974700593138339226497249461751545728366702369745461014655997933798537483143786841806593422227898388722980000748404719

หากหนึ่งในกราฟชุดของจุด(x, y)ใน0 <= x < 106และk <= y < k + 17ความพึงพอใจของความไม่เท่าเทียมกันดังกล่าวข้างต้นกราฟส่งผลให้มีลักษณะเช่นนี้ (โปรดทราบว่าแกนในพล็อตนี้ได้รับการกลับรายการมิฉะนั้นภาพออกมาคว่ำลง):

ผลลัพธ์ของสูตรการอ้างอิงตนเองของทัปเปอร์

แล้วอะไรล่ะ

สิ่งที่น่าสนใจเกี่ยวกับสูตรนี้ก็คือมันสามารถใช้สร้างกราฟ 106x17 ภาพขาวดำที่เป็นไปได้ ตอนนี้การค้นหาผ่านการค้นหาจริง ๆ แล้วจะน่าเบื่ออย่างยิ่งดังนั้นจึงมีวิธีการหาค่า k ที่ภาพของคุณปรากฏ กระบวนการนี้ค่อนข้างง่าย:

  1. เริ่มจากพิกเซลด้านล่างของคอลัมน์แรกของภาพของคุณ
  2. หากพิกเซลเป็นสีขาว 0 จะถูกผนวกเข้ากับค่า k ถ้าเป็นสีดำให้ผนวก 1
  3. เลื่อนคอลัมน์ขึ้นทำซ้ำขั้นตอนที่ 2
  4. เมื่อสิ้นสุดคอลัมน์แล้วให้ย้ายไปที่คอลัมน์ถัดไปและเริ่มจากด้านล่างตามกระบวนการเดียวกัน
  5. หลังจากวิเคราะห์แต่ละพิกเซลแล้วให้แปลงสตริงไบนารี่นี้เป็นทศนิยมและคูณด้วย 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

ตรวจสอบสรุปสาระสำคัญนี้เพื่อดูคำตอบที่แน่นอน

นี่คือดังนั้นจำนวนไบต์ที่น้อยที่สุดจึงจะชนะ


ลิงก์ที่มีประโยชน์

วิกิพีเดีย

Wolfram Mathworld


ฉันสามารถรับ PPM ได้หรือไม่
Maltysen

แก้ไข:ใช่อนุญาตให้ฟอร์แมต PPM เมื่อฉันเข้าร่วมโปรแกรมฉันตั้งใจให้ใช้ PNGs แต่การอนุญาตให้ PPM ควรอนุญาตให้ภาษากอล์ฟเพิ่มขึ้นเพื่อเข้าร่วม
Kade

3
ในขณะที่ฉันกำลังอ่านคำถามนี้ก่อนที่จะไปที่ส่วน "งานของฉันคืออะไร" ฉันคิดว่าฉันจะเห็นคำquineนั้น
Jacob

ฉันจะไม่แกล้งทำเป็นโปรแกรมเมอร์ที่สามารถทำสิ่งนี้ได้ แต่ฉันจะเสนอคำถามที่ไร้เดียงสาและจริงจัง: ใช่ แต่มันจะทำในสิ่งที่ตรงกันข้ามได้หรือไม่? ฉันป้อนอาหารในการแก้ปัญหาและเห็น * .png ที่สร้างขึ้นเป็นผลหรือไม่

@NotAsSharpAsYouGuys: หากคุณมีเลขคณิตความแม่นยำโดยพลการมันเป็นเรื่องไม่สำคัญคุณเพียงแค่ต้องตรวจสอบผลลัพธ์ของสูตรนั้นสำหรับแต่ละพิกเซลและส่งภาพผลลัพธ์ออกมา
Matteo Italia

คำตอบ:


12

CJam, 16

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

ด้วยความขอบคุณอย่างมากต่อเดนนิส ลองออนไลน์

ในกรณีที่คุณมีปัญหากับ 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

ฉันใช้รูปแบบที่ GIMP สร้างขึ้นเมื่อส่งออกเป็น 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

@Dennis OMG มีหลายระดับของความหมายที่นั่น :) อยากโพสต์ด้วยตัวเองเหรอ?
aditsu

ฉันไม่คิดว่าคำตอบที่แยกต่างหากจะแตกต่างจากของคุณอย่างเพียงพอ
Dennis

17

Pyth - 21 ไบต์

ง่าย ๆ กับiการแปลงฐานของ pyth รับอินพุตเป็นPBMชื่อไฟล์และอ่านโดยใช้'คำสั่ง ฉันต้องใช้!Mเพื่อลบล้างคนผิวดำและคนผิวขาว ทุกสิ่งทุกอย่างสามารถอธิบายตนเองได้

*J17i!MsC_cJrstt.z7 2

ลองมันนี่เกมออนไลน์ (ล่ามเว็บไม่สามารถอ่านไฟล์ได้ดังนั้นจึงได้รับการแก้ไขและรับไฟล์เป็นอินพุต)


60
ฉันไม่คิดว่าอะไรใน Pyth อธิบายได้ด้วยตนเอง : /
Alex A.

3
ไม่มีภาษาใดที่ฉันรู้ว่าสามารถเอาชนะอันนี้ได้ แต่จากนั้นอีกครั้งไม่มีภาษาที่ฉันรู้ว่าเป็น "ทำเพื่อกอล์ฟ"
Mahesh

ไม่สามารถเปิดลิงก์เส้นทางยาวเกินไปแดง (Safari 8.1)
Kametrixom

ภาพตัวอย่างของคุณดูเหมือนผิด คุณหมายถึงใช้ P2 มากกว่า P3 หรือไม่?
aditsu

โอ้เดี๋ยวก่อนมันไม่ได้เป็น P2 แต่ดูเหมือน P1 แต่กลับด้าน
aditsu

9

Python 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/17และa%17ในสถานที่ที่เหมาะสมและคุณสามารถใช้ความจริงที่ว่า 1 คือความจริงและ 0 เป็นเท็จ นี่คือผลลัพธ์ของการเปลี่ยนแปลงเหล่านี้คุณจะลดลงเหลือ 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หรือ subbed (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

Mathematica 69 Bytes

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.