Ini Masalah Rujukan Diri

49

Formula Referensi-Mandiri Tupper (disalin dari Wikipedia)

Rumus referensial-sendiri Tupper adalah rumus yang didefinisikan oleh Jeff Tupper bahwa, ketika digambarkan dalam dua dimensi di lokasi yang sangat spesifik di pesawat, dapat "diprogram" untuk mereproduksi rumus itu sendiri secara visual. Ini digunakan dalam berbagai kursus matematika dan ilmu komputer sebagai latihan dalam membuat grafik.

Formula Referensi-Mandiri Tupper

Di mana lantai fungsi lantai.

Biarkan kmenjadi nomor 543 digit berikut: 960939379918958884971672962127852754715004339660129306651505519271702802395266424689642842174350718121267153782770623355993237280874144307891325963941337723487857735749823926629715517173716995165232890538221612403238855866184013235585136048828693337902491454229288667081096184496091705183454067827731551705405381627380967602565625016981482083418783163849115590225610003652351370343874461848378737238198224849863465033159410054974700593138339226497249461751545728366702369745461014655997933798537483143786841806593422227898388722980000748404719

Jika salah satu grafik himpunan titik-titik (x, y)di 0 <= x < 106dan k <= y < k + 17memuaskan ketimpangan yang diberikan di atas, grafik penampilan yang dihasilkan seperti ini (catatan bahwa sumbu di plot ini telah terbalik, jika gambar keluar terbalik):

Hasil Formula Referensi-Diri Tupper

Terus?

Yang menarik dari rumus ini adalah dapat digunakan untuk membuat grafik gambar 106x17 hitam putih yang mungkin. Sekarang, benar-benar mencari melalui pencarian akan sangat membosankan, jadi ada cara untuk mengetahui nilai k di mana gambar Anda muncul. Prosesnya cukup sederhana:

  1. Mulai dari piksel bawah kolom pertama gambar Anda.
  2. Jika pikselnya putih, angka 0 akan ditambahkan ke nilai-k. Jika berwarna hitam, tambahkan 1.
  3. Pindah ke atas kolom, ulangi langkah 2.
  4. Setelah di akhir kolom, pindah ke kolom berikutnya dan mulai dari bawah, mengikuti proses yang sama.
  5. Setelah setiap piksel dianalisis, konversikan string biner ini menjadi desimal, dan kalikan dengan 17 untuk mendapatkan nilai k.

Apa pekerjaan saya?

Tugas Anda adalah membuat program yang dapat mengambil gambar 106x17 apa pun, dan menampilkan nilai-k yang sesuai. Anda dapat membuat asumsi berikut:

  1. Semua gambar akan berukuran 106x17
  2. Semua gambar hanya akan mengandung piksel hitam (# 000000) atau putih (#FFFFFF), tidak ada di antaranya.

Ada beberapa aturan juga:

  1. Output hanyalah nilai-k. Itu harus di dasar yang tepat, tetapi bisa dalam format apa pun.
  2. Gambar harus dibaca dari PNG atau PPM.
  3. Tidak ada celah standar.

Gambar Uji

[ Nintendo] harus menghasilkan ~ 1,4946x10 542

[ Sejumlah besar] harus menghasilkan ~ 7.2355x10 159

[ 2 ^ 1801 * 17] harus menghasilkan 2 1801 * 17

[ 2 ^ 1802 - 1 * 17] harus menghasilkan (2 1802 -1) * 17

Lihat Intisari ini untuk solusi yang tepat.

Ini adalah , jadi paling tidak jumlah byte yang menang.


Tautan Bermanfaat

Wikipedia

Wolfram Mathworld

Kade
sumber
Bisakah saya menerima PPM?
Maltysen
EDIT: Ya, format PPM diizinkan. Ketika saya datang dengan program saya bermaksud PNG untuk digunakan, tetapi memungkinkan PPM harus memungkinkan untuk lebih banyak bahasa golf untuk berpartisipasi.
Kade
3
Ketika saya membaca pertanyaan ini, sebelum sampai ke bagian "Apa pekerjaan saya", saya yakin saya akan melihat kata di quinesuatu tempat.
Yakub
Saya tidak akan berpura-pura menjadi seorang programmer yang dapat melakukan hal-hal semacam ini, sebagai gantinya saya hanya akan mengajukan pertanyaan yang polos dan tulus: Ya, tetapi bisakah itu dilakukan secara terbalik? Yaitu memberi makan dalam solusi dan melihat * .png dihasilkan sebagai hasilnya?
@NotAsSharpAsYouGuys: jika Anda memiliki aritmatika presisi sewenang-wenang itu sepele, Anda hanya perlu memeriksa hasil rumus untuk setiap piksel dan output gambar yang dihasilkan.
Matteo Italia

Jawaban:

12

CJam, 16

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

Dengan terima kasih banyak untuk Dennis. Cobalah online

Jika Anda mengalami masalah dengan url, ini adalah input yang saya uji:

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

Saya menggunakan format yang dihasilkan GIMP saat mengekspor sebagai ASCII pbm, dengan komentar dihapus.

Penjelasan:

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
aditsu
sumber
Saya mendapatkannya di URL untuk Anda.
mbomb007
@ mbomb007 terima kasih, tidak yakin apa yang salah.
aditsu
Jika Anda tidak harus berurusan dengan komentar, l;l~\qN-/W%zs:~2b*sebaiknya bekerja juga.
Dennis
@ Dennis OMG, ada beberapa tingkat kecemerlangan di sana :) ingin mempostingnya sendiri?
aditsu
Saya tidak berpikir jawaban yang terpisah akan cukup berbeda dari jawaban Anda.
Dennis
17

Pyth - 21 byte

Mudah dilakukan dengan ikonversi basis pyth . Mengambil input sebagai PBMnama file dan membaca menggunakan 'perintah. Saya harus menggunakan !Muntuk meniadakan kulit hitam dan putih. Segala sesuatu yang lain sudah jelas.

*J17i!MsC_cJrstt.z7 2

Coba di sini online . (Web interpreter tidak dapat membaca file, jadi dimodifikasi dan mengambil file sebagai input).

Maltysen
sumber
60
Saya tidak berpikir apa pun di Pyth cukup jelas. : /
Alex A.
3
Tidak ada bahasa yang saya tahu bisa mengalahkan yang satu ini. Tapi sekali lagi tidak ada bahasa yang saya tahu "dibuat untuk golf".
Mahesh
Tidak dapat membuka tautan, jalurnya terlalu panjang, dang (Safari 8.1)
Kametrixom
Gambar contoh Anda tampaknya salah. Apakah Anda bermaksud menggunakan P2 daripada P3?
aditsu
Oh, tunggu, ini bahkan bukan P2, sepertinya P1 tetapi terbalik
aditsu
9

Python 2: 133 110 byte

Upaya pertama dengan python menggunakan 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

Berkat komentator yang sangat membantu di bawah ini

lucu
sumber
2
karena Anda hanya menggunakan sekali Image.open (input ()). memuat dan sepertinya Anda tidak memodifikasinya, bukankah lebih baik menggunakannya, daripada menggunakan var j? akan seperti inifrom 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
Melanjutkan pada poin @ Katenkyo, Anda juga bisa cukup mencolokkan a/17dan a%17di lokasi yang sesuai, dan Anda dapat menyalahgunakan fakta bahwa 1 adalah benar dan 0 adalah palsu. Inilah hasil dari perubahan ini, Anda akan turun ke 111 byte :)
Kade
@ Kateyenko, sedih input()dipanggil pada setiap iterasi dari loop dengan modifikasi itu. Editing dengan tips lain, terima kasih.
joc
1
(...<1) --> 0**...mungkin?
Sp3000
7

C #, 199

Ini sangat menyenangkan! Tidak ada yang salah dengan memuat ulang bitmap 106 * 17 kali, kan? Saya melakukannya sebagai fungsi untuk menyimpan beberapa byte, tidak yakin apakah itu legal.

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 adalah nama file input.

Juga, sebagai ekspresi tunggal, hanya karena itu adalah satu ekspresi, dengan yang idisediakan atau subtitle (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)
DLeh
sumber
1
Pertanyaannya mengatakan "pekerjaan Anda adalah membuat program ..."
Sean Latham
1

Mathematica 69 Bytes

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

Binarize @ dapat ditinggalkan jika gambar adalah format monokrom.

Fungsi ini akan mereproduksi gambar:

   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}]]&
Kelly Lowder
sumber