Pure Sourcery - Membentuk program yang menampilkan angka 0 hingga 9

21

Berikut ini adalah font 5 oleh 7 piksel untuk digit 0 hingga 9:

.███.
█...█
█...█
█...█
█...█
█...█
.███.

..█..
███..
..█..
..█..
..█..
..█..
█████

.███.
█...█
....█
...█.
..█..
.█...
█████

.███.
█...█
....█
..██.
....█
█...█
.███.

█..█.
█..█.
█..█.
█████
...█.
...█.
...█.

█████
█....
█....
.███.
....█
█...█
.███.

.███.
█...█
█....
████.
█...█
█...█
.███.

█████
....█
....█
...█.
...█.
..█..
..█..

.███.
█...█
█...█
.███.
█...█
█...█
.███.

.███.
█...█
█...█
.████
....█
█...█
.███.

(Font ini dan halaman ini mungkin akan terlihat lebih baik jika Anda menjalankan kode JavaScipt ini di konsol browser Anda atau di bilah URL yang diawali oleh javascript::. $('#question pre,.answer pre').css('line-height',1))

Tulis dua blok persegi panjang teks berukuran sama, satu untuk merepresentasikan spasi kosong ( .) pada font di atas, dan satu untuk merepresentasikan spasi yang diisi ( ).

Ketika dua blok teks ini diatur dalam pola 5 × 7 yang sama dengan salah satu digit di atas, maka blok teks besar yang dihasilkan harus berupa program yang mencetak digit itu ke stdout. Ini harus bekerja untuk semua 10 digit.

Misalnya, jika .blok teks Anda adalah

---
'''

dan blok teks Anda tadinya

ABC
123

lalu programnya

---ABCABCABC---
'''123123123'''
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
---ABCABCABC---
'''123123123'''

harus keluar 0. Begitu pula dengan programnya

------ABC------
''''''123''''''
ABCABCABC------
123123123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
ABCABCABCABCABC
123123123123123

harus menampilkan 1, dan seterusnya hingga program untuk 9.

Anda dapat menggunakan potongan stack ini untuk membuat program berbentuk digit:

<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>

Detail

  • Tak satu pun dari 10 program blok teks besar harus memerlukan input. Hanya menampilkan satu digit plus satu baris tambahan opsional. Output ke stdout atau alternatif serupa.
  • Tidak ada program yang dapat membaca atau mengakses kode sumbernya sendiri. Perlakukan ini seperti tantangan quine yang ketat .
  • Blok teks mungkin tidak identik dan harus memiliki dimensi bukan nol.
  • Blok teks dapat berisi karakter apa pun kecuali terminator baris .
  • 10 program harus merupakan program lengkap yang ditulis dalam bahasa yang sama, mereka bukan cuplikan REPL . Anda dapat secara opsional menambahkan trailing newline ke semuanya atau tidak sama sekali.

Mencetak gol

Skor Anda adalah area (tinggi kali tinggi) dari salah satu blok teks Anda. (Mereka memiliki ukuran yang sama sehingga tidak ada gunanya menghitung kedua blok.) Area contoh ini adalah 3 dengan 2, untuk skor 6.

Skor terendah menang. Dalam hal ikatan, jawaban yang terpilih tertinggi menang.

Hobi Calvin
sumber
Pada kode Anda, Anda dapat banyak meningkatkannya. var t=parseInt(document.getElementById("digit").value[0]);if(isNaN(t))return void alert("Invalid digit.");dapat ditulis sebagai var t=document.getElementById("digit").value[0]/1;if(t!=t)return void alert("Invalid digit.");, yang sama tetapi lebih pendek. Ada beberapa hal lagi yang dapat Anda tingkatkan di dalamnya, tetapi itu memang terlihat hebat!
Ismael Miguel
4
@IsmaelMiguel TBH Saya memasukkannya melalui JS minifier untuk mendapatkannya di satu baris. Itu tidak pernah dimaksudkan untuk bermain golf.
Calvin Hobbies
Oh, kawan ... Itu agak malas ... Dalam pertanyaan golf, Anda memposting kode non-golf ... Tapi hei, saya mengerti dan saya hanya mengatakan ini. Anda tidak harus mengikuti apa yang saya katakan. Tapi itu hal yang baik untuk dilakukan.
Ismael Miguel
6
@IsmaelMiguel Saya memposting kode utilitas yang tidak dikenali , yang bisa dibilang semudah mungkin dibaca sehingga bug lebih mudah dikenali. Tapi sungguh, selama ini berhasil, ukuran kode snippet stack tidak memiliki hasil apa pun dari tantangan.
Calvin Hobbies
3
text blocks may not be identicalsangat? Saya ingin melihat seseorang melanggar aturan ini, dengan memberikan dua kode kunci yang identik, yang secara ajaib mengembalikan angka yang berbeda, ketika setiap angka persis kode yang sama ^^
Falco

Jawaban:

13

CJam, 20 18 14 13 12 * 1 = 12

Cobalah online: 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9

Blok kosong

];BG*K+ :BD%

Blok padat

];B9+33%:B4/

Penjelasan

Saya menggunakan strategi yang mirip dengan solusi Sp3000 , sehingga setiap blok melakukan perkalian, penambahan, dan (mungkin) operasi modulo pada variabel dan menyimpan nilai kembali. Untuk menemukan solusi optimal, saya menggunakan kekuatan kasar yang baik. Saya menulis sebuah program yang mencari ruang dari semua nilai awal yang mungkin (nilai awal variabel CJam) dan jutaan kemungkinan pasangan fungsi transformasi sehingga output untuk setiap bentuk digit unik. Kemudian, saya memfilter hasil untuk yang sedemikian rupa sehingga hasil akhir untuk bentuk digit yang berakhir dengan blok kosong, yang ada 8, dapat dipetakan kembali ke hasil yang benar melalui multiply, add, dan modulo formula lainnya.

Setelah beberapa hari mencari CPU, hasil terbaik sejauh ini adalah ke ukuran 12! Solusi ini dimulai dengan nilai 11, fungsi transformasi blok kosong adalah x * 16 + 20, fungsi hasil blok kosong adalah x % 13, fungsi transformasi blok padat (x + 9) % 33, dan fungsi hasil blok padat adalah x / 4.

Runer112
sumber
23

> <> (Ikan) , 5 * 10 = 50

Blok kosong

   \   !9 
4n;    n/ 
1n;\      
       \  
0n;n7\\\  

Blok padat

   \; n8/ 
     /!/!v
     \  ;6
3n;\ ! /nn
2n;n5<  8;

Kode ini tidak mengandung logika atau aritmatika hanya menggunakan pengarahan ulang statis>>> pointer instruksi 2D (IP) dengan 'mirror' ( /dan \) dan dua 'panah' ( <dan v). Satu-satunya pengontrol aliran lainnya adalah 'trampolin' ( !) yang melompati karakter berikutnya.

IP dimulai dari sudut kiri atas menuju Timur. Setelah beberapa pengalihan mencapai angka itu didorong ke tumpukan dan dicetak dengan ndan program berakhir ;.

Alur program

Blok 'mengenali' keadaan saat ini dari program dari fakta bahwa titik mana IP masuk dan berdasarkan negara itu memutuskan ke arah mana harus mengeluarkan pointer (blok mana yang harus dieksekusi berikutnya) dan di mana posisi yang tepat pointer harus pergi (yang akan menjadi status baru). Tentu saja blok tidak melakukan logika apa pun semua perilaku ini berasal dari pengalihan.

randomra
sumber
Saya berharap jawaban seperti ini. Sihir murni.
EagleV_Attnam
11

CJam, 23 22 19 * 1 = 19

Blok kosong:

];G)B%:G"73860594"=

Blok padat:

];GW*B+3*D%:G    7-

Cobalah online .

Saya mencoba untuk beruntung dengan kebetulan matematika dan gagal, jadi inilah pendekatan yang sedikit berbeda untuk pemetaan keunikan dari solusi Martin.

Mulailah dengan 16. Blok kosong tambahkan 1 dan ambil modulo 11. Blok padat dikalikan dengan -1, tambahkan 11, kalikan dengan 3 lalu ambil modulo 13. Ini secara ajaib memetakan 03456789(digit yang berakhir di blok kosong) ke 41753026, yang kami gunakan untuk mengindeks untuk mendapatkan yang benar. 12peta dengan rapi 89, yang bisa kita perbaiki dengan mengurangi 7.

Sp3000
sumber
7

CJam, 28 27 x 1 = 27

Ini awal.

Blok kosong

U):U;                       

Blok padat

];U):UW+:WF%"1302986_7_54"=

Uji di sini. Saya tidak dapat memberi Anda tautan permanen dengan kode tersebut, karena kodenya terlalu panjang, jadi Anda harus menyalinnya secara manual dari cuplikan dalam tantangan.

Idenya adalah untuk hash bentuknya sebagai berikut:

  • Untuk setiap "pixel", tambahkan penghitung U.
  • Untuk setiap "piksel" hitam, tambahkan Uke total berjalan W(yang dimulai dari -1). Pada akhirnya, kita ambil modulo ini 15, yang kebetulan memberikan hasil unik, yang digunakan untuk mengindeks ke dalam string pencarian.
Martin Ender
sumber