Đây là một vấn đề tự tham khảo


49

Công thức tự tham khảo của Tupper (được sao chép từ Wikipedia)

Công thức tự tham chiếu của Tupper là một công thức được định nghĩa bởi Jeff Tupper, khi được vẽ biểu đồ theo hai chiều tại một vị trí rất cụ thể trong mặt phẳng, có thể được "lập trình" để tự tái tạo trực quan công thức. Nó được sử dụng trong các khóa học toán và khoa học máy tính khác nhau như một bài tập trong các công thức đồ thị.

Công thức tự tham khảo của Tupper

Trường hợp sàn nhà là hàm sàn.

Hãy klà số có 543 chữ số sau đây: 960939379918958884971672962127852754715004339660129306651505519271702802395266424689642842174350718121267153782770623355993237280874144307891325963941337723487857735749823926629715517173716995165232890538221612403238855866184013235585136048828693337902491454229288667081096184496091705183454067827731551705405381627380967602565625016981482083418783163849115590225610003652351370343874461848378737238198224849863465033159410054974700593138339226497249461751545728366702369745461014655997933798537483143786841806593422227898388722980000748404719

Nếu một biểu đồ tập hợp các điểm (x, y)trong 0 <= x < 106k <= y < k + 17thỏa mãn bất đẳng thức đã cho ở trên, thì biểu đồ kết quả trông như thế này (lưu ý rằng các trục trong biểu đồ này đã bị đảo ngược, nếu không thì hình ảnh bị lộn ngược):

Kết quả của công thức tự tham khảo của Tupper

Vậy thì sao?

Điều thú vị về công thức này là nó có thể được sử dụng để vẽ biểu đồ cho bất kỳ hình ảnh 106x17 đen trắng nào có thể. Bây giờ, thực sự tìm kiếm để tìm kiếm sẽ vô cùng tẻ nhạt, vì vậy có một cách để tìm ra giá trị k nơi hình ảnh của bạn xuất hiện. Quá trình này khá đơn giản:

  1. Bắt đầu từ pixel dưới cùng của cột đầu tiên của hình ảnh của bạn.
  2. Nếu pixel có màu trắng, 0 sẽ được thêm vào giá trị k. Nếu nó màu đen, nối thêm 1.
  3. Di chuyển lên cột, lặp lại bước 2.
  4. Khi ở cuối cột, di chuyển đến cột tiếp theo và bắt đầu từ dưới cùng, theo quy trình tương tự.
  5. Sau khi mỗi pixel được phân tích, chuyển đổi chuỗi nhị phân này thành số thập phân và nhân với 17 để có giá trị k.

Công việc của tôi là gì?

Công việc của bạn là tạo ra một chương trình có thể lấy bất kỳ hình ảnh 106x17 nào và xuất giá trị k tương ứng của nó. Bạn có thể đưa ra các giả định sau:

  1. Tất cả hình ảnh sẽ chính xác 106x17
  2. Tất cả hình ảnh sẽ chỉ chứa pixel đen (# 000000) hoặc trắng (#FFFFFF), không có gì ở giữa.

Cũng có một vài quy tắc:

  1. Đầu ra chỉ đơn giản là giá trị k. Nó phải ở trong cơ sở thích hợp, nhưng có thể ở bất kỳ định dạng nào.
  2. Hình ảnh phải được đọc từ PNG hoặc PPM.
  3. Không có sơ hở tiêu chuẩn.

Hình ảnh thử nghiệm

[ Nintendo] sẽ tạo ra ~ 1.4946x10 542

[ Một số lượng lớn] sẽ tạo ra ~ 7.2355x10 159

[ 2 ^ 1801 * 17] nên tạo 2 1801 * 17

[ 2 ^ 1802 - 1 * 17] sẽ tạo ra (2 1802 -1) * 17

Kiểm tra Gist này cho các giải pháp chính xác.

Đây là , vì vậy số byte ít nhất sẽ thắng.


Liên kết hữu ích

Wikipedia

Thế giới toán học Wolfram


Tôi có thể lấy PPM không?
Maltysen

EDIT: Có, định dạng PPM được cho phép. Khi tôi đưa ra chương trình tôi dự định sẽ sử dụng PNG, nhưng cho phép PPM nên cho phép nhiều ngôn ngữ chơi gôn hơn tham gia.
Kade

3
Khi tôi đang đọc câu hỏi này, trước khi đến phần "Công việc của tôi", tôi đã khẳng định rằng tôi sẽ thấy từ này quineở đâu đó.
Jacob

Tôi sẽ không giả vờ là một lập trình viên có thể làm loại công cụ này, thay vào đó tôi sẽ chỉ đơn giản đưa ra một câu hỏi ngây thơ, nghiêm túc: Có, nhưng nó có thể được thực hiện ngược lại không? Tức là cho ăn trong dung dịch và thấy * .png được tạo như kết quả?

@NotAsSharpAsYouGuys: nếu bạn có số học chính xác tùy ý, nó chỉ cần kiểm tra kết quả của công thức đó cho từng pixel và xuất ra hình ảnh kết quả.
Matteo Italia

Câu trả lời:


12

CJam, 16

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

Cảm ơn rất nhiều đến Dennis. Dùng thử trực tuyến

Trong trường hợp bạn gặp vấn đề với url, đây là đầu vào tôi đã kiểm tra:

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

Tôi đã sử dụng định dạng mà GIMP tạo ra khi xuất dưới dạng ASCII pbm, với nhận xét đã bị xóa.

Giải trình:

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

Tôi đã nhận nó trong URL cho bạn.
mbomb007

@ mbomb007 cảm ơn, không chắc chuyện gì đã xảy ra.
aditsu

Nếu bạn không phải đối phó với các bình luận, l;l~\qN-/W%zs:~2b*cũng nên làm việc như vậy.
Dennis

@Dennis OMG, có nhiều cấp độ rực rỡ ở đó :) bạn muốn tự mình đăng nó không?
aditsu

Tôi không nghĩ rằng một câu trả lời riêng biệt sẽ đủ khác với câu trả lời của bạn.
Dennis

17

Pyth - 21 byte

Đơn giản để làm với ichuyển đổi cơ sở của pyth . Lấy đầu vào là PBMtên tệp và đọc bằng 'lệnh. Tôi đã phải sử dụng !Mđể phủ nhận người da đen và người da trắng. Mọi thứ khác là tự giải thích.

*J17i!MsC_cJrstt.z7 2

Hãy thử nó ở đây trực tuyến . (Trình thông dịch web không thể đọc tệp, do đó được sửa đổi và lấy tệp làm đầu vào).


60
Tôi không nghĩ bất cứ điều gì ở Pyth là tự giải thích. : /
Alex A.

3
Không có ngôn ngữ tôi biết có thể đánh bại cái này. Nhưng sau đó, một lần nữa, không có ngôn ngữ nào tôi biết là "dành cho chơi gôn".
Mahesh

Không thể mở liên kết, đường dẫn quá dài, dang (Safari 8.1)
Kametrixom

Hình ảnh ví dụ của bạn có vẻ sai. Ý của bạn là sử dụng P2 chứ không phải P3?
aditsu

Đợi đã, thậm chí không phải là P2, nó trông giống như P1 nhưng ngược lại
aditsu

9

Python 2: 133 110 byte

Nỗ lực đầu tiên trong python bằng 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

Cảm ơn các bình luận hữu ích dưới đây


2
vì bạn chỉ sử dụng một lần Image.open (input ()). tải và nó không nới lỏng như bạn đang sửa đổi nó, sẽ tốt hơn nếu sử dụng nó như vậy, thay vì sử dụng var j? nó sẽ giống như thế nàyfrom 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
Tiếp tục theo quan điểm của @ Katenkyo, bạn cũng có thể chỉ cần cắm a/17a%17vào các vị trí thích hợp và bạn có thể lạm dụng thực tế rằng 1 là sự thật và 0 là giả. Đây là kết quả của những thay đổi này, bạn sẽ giảm xuống còn 111 byte :)
Kade

@Kateyenko, thật đáng buồn input()khi được gọi trên mỗi lần lặp của vòng lặp với sửa đổi đó. Chỉnh sửa với các mẹo khác mặc dù, cảm ơn bạn.
JOC

1
(...<1) --> 0**...có lẽ?
Sp3000

7

C #, 199

Điều này thật thú vị! Không có gì sai khi tải lại bitmap 106 * 17 lần, phải không? Tôi đã làm nó như là một chức năng để lưu một số byte, không chắc đó có hợp pháp không.

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 là tên tập tin đầu vào.

Ngoài ra, dưới dạng một biểu thức, chỉ vì nó là một biểu thức, iđược cung cấp hoặc chìm (167 byte)

(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
Câu hỏi cho biết "công việc của bạn là tạo ra một chương trình ..."
Sean Latham

1

Toán học 69 byte

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

Binarize @ có thể bị bỏ đi nếu hình ảnh có định dạng đơn sắc.

Chức năng này sẽ tái tạo hình ảnh:

   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}]]&
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.