Tulis program atau fungsi yang tidak kosong yang ketika dipanggil menampilkan nilai tunggal, 1 atau 0, dan ketika dipanggil berulang kali, nomor output menghasilkan representasi biner dari kode sumber program Anda (di halaman kode yang sama dari mana kode Anda dikompilasi / ditafsirkan).
Misalnya, jika kode sumber Anda abc
(dalam ASCII), hasilnya adalah:
1st call: 0 // ASCII letter 'a'
2nd call: 1
3rd call: 1
4th call: 0
5th call: 0
6th call: 0
7th call: 0
8th call: 1
9th call: 0 // ASCII letter 'b'
10th call: 1
11th call: 1
12th call: 0
13th call: 0
14th call: 0
15th call: 1
16th call: 0
17th call: 0 // ASCII letter 'c'
18th call: 1
19th call: 1
20th call: 0
21st call: 0
22nd call: 0
23rd call: 1
24th call: 1
After the 24th call, the behaviour is undefined.
Representasi biner dari sumber harus mengandung setidaknya satu 0 bit dan satu 1 bit.
Alih-alih 1 dan 0, Anda dapat menampilkan dua nilai yang berbeda dan konsisten (seperti true
dan false
).
Program modifikasi diri yang menghasilkan representasi biner dari sumber asli diizinkan, asalkan mereka tidak membaca kode sumber untuk mengetahui apa yang akan dicetak berikutnya.
Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang.
Bash , 105 byte
CATATAN : Pastikan Anda tidak memiliki file penting yang disebut
f
di direktori yang Anda uji ini.Jika Anda ingin menguji ini, Anda dapat menggunakan perintah berikut:
Yang mana harus memberikan output yang sama
xxd -c1 -b path/to/script.sh|cut -d\ -f2|tr -d \\n
.Penjelasan
Ini menggunakan
trap
trik - memanggiltrap
di dalamtrap
aksi hanya mencetak garis itu. Selanjutnya output disalurkan kexxd
yang mengonversinya menjadi biner (sayangnyaxxd -bp
tidak berfungsi - dengan demikian solusinya dengancut
&tr
):Dari situ kami hanya tertarik pada satu bit (katakanlah
N
) yang dapat kami pilihcut -cN
.Untuk mengetahui apa yang
N
kami gunakan (ingat itu bagian yang perlu ditambahkan setelah setiap panggilan), cukup coba setelx
ke konten filef
dan jika tidak ada setel ke 1:Hal terakhir yang harus dilakukan, adalah memperbarui file
f
- menulisx+1
padanya:sumber
TI-Basic (seri TI-83),
592357309 byteTabel ini adalah referensi yang mungkin untuk representasi biner kalkulator dari kode sumber, meskipun pada akhirnya saya hanya menggunakan debugger Virtual TI.
Untuk perbandingan dan / atau kepentingan historis: quine pertama ditulis dalam TI-Basic .
Bagaimana itu bekerja
Str1
menyimpan kode sumber (sekarang dalam heksadesimal yang mulia, menghemat banyak ruang di atas versi biner sebelumnya), meninggalkan bit-bit di mana kontenStr1
itu sendiri akan diwakili.Kami mengasumsikan bahwa program dimulai pada kalkulator yang ingatannya baru saja dihapus, demikian
X
juga halnya0
. Setiap kali melalui program, kami bertambahX
.Biasanya, kita hanya mencari setengah byte yang kita coba untuk mengekstrak sedikit dari, membacanya
Str1
, mengkonversi dari heksadesimal ke biner, dan mencetaknya. Jika kita pada bagian dari kode sumber yang menyimpanStr1
(yang dua-pertiga dari total panjang dari program), maka kita langkah pertama untuk bagian yang sesuai dari string menyimpan31
,32
dan sebagainya.sumber
Java 8,
249241237234148 byteMaaf sebelumnya untuk penjelasan panjang. :)
Coba di sini.
Penjelasan:
Penjelasan tambahan:
quine -part :
String s
berisi kode sumber yang tidak diformat%s
digunakan untuk menempatkan String ini ke dalam dirinya dengans.format(...)
%c
,%1$c
dan34
digunakan untuk memformat tanda kutip ganda ("
)s.format(s,34,s)
menempatkan semuanya bersama-samaCoba di sini dengan beberapa bagian dihapus / dimodifikasi untuk memverifikasi output quine itu kode sumber sendiri.
binary -part:
-i/8
akan secara otomatis terpotong pada pembagian integer, jadi ketikai
-7 ke 0, itu akan menjadi0
; jikai
-15 hingga -8, itu akan menjadi1
; dll.s.charAt(-i/8)
mengambil karakter kode sumber saat ini, delapan kali setelah satu sama lain. Cobalah di sini dengan versi yang dimodifikasi.--i&7
akan menjadi7,6,5,4,3,2,1,0,7,6,5,4,3,2,1,0,...
, di mana yang pertama7
adalah kapani=0
(yang menjadi yang-1
pertama karena--i
, dan akan terus menurun).s.charAt(-i/8)>>(--i&7)
akan menghasilkan urutan tergantung pada karakter. Beberapa contoh ('A'
(65) hingga'E'
(69) adalah):0,1,2,3,4,8,16,32,65,0,1,2,4,8,16,32,65,...
:;0,1,2,4,8,16,33,66,0,1,2,4,8,16,33,66,...
:;0,1,2,4,8,16,33,67,0,1,2,4,8,16,33,67,...
:;0,1,2,4,8,17,34,68,0,1,2,4,8,17,34,68,...
:;0,1,2,4,8,17,34,69,0,1,2,4,8,17,34,69,...
:;...&1
kemudian mengeluarkan a0
jika itu bilangan genap, dan1
jika itu bilangan ganjil, yang dikombinasikan dengan urutan di atas menghasilkan hasil yang benar.Old 233 byte menjawab:
Coba di sini.
Penjelasan:
Penjelasan tambahan:
quine -part :
Penjelasan yang sama seperti di atas, dengan tambahan:
%%
adalah bentuk lolos dari tanda-modulo (%
)Coba di sini dengan beberapa bagian dihapus / dimodifikasi untuk memverifikasi output quine itu kode sumber sendiri.
binary -part:
i/8
akan secara otomatis terpotong pada pembagian integer, jadi ketikai
0-7, itu akan menjadi0
; jikai
8-15, itu akan menjadi1
; dll.s.charAt(i/8)
mengambil karakter kode sumber saat ini, delapan kali setelah satu sama lain. Cobalah di sini dengan versi yang dimodifikasi.255
adalah0xFF
atau11111111
(nilai maksimum untuk byte yang tidak ditandatangani)256
adalah0x100
atau100000000
.&
upcasts ASCII karakter ke integer. Pada titik itu, ia berada di antara0
dan255
(00000000
ke11111111
).Long.toString(...,2)
mengubahnya menjadi representasi String biner 9-bit+256
dan.substring(1)
akan memastikan ada nol di depannya, dan akan mengubah 9-bit menjadi 8-bit.Coba di sini dengan beberapa bagian dihapus / dimodifikasi untuk memverifikasi seluruh byte.
sumber
int i;v->{String s="int i;v->{String s=%c%s%1$c;return 1&s.format(s,34,s).charAt(-i/8)>>(--i&7);}";return 1&s.format(s,34,s).charAt(-i/8)>>(--i&7);}
Javascript ES6,
735852 bytePenjelasan
Rincian kode:
o=_=>
: mendefinisikan suatu fungsi.`o=${o}`
: membangun string;o
dikonversi menjadi string, yang dalam hal ini adalah kode sumber fungsi..charCodeAt(
: dapatkan karakter dalam string sebagai kode karakter ASCII-nya.(o.n=1+o.n|0)/8
: pilih karakter. Ini juga tempat penghitung bertambah.)>>(7-o.n%8)
: menggeser kode karakter yang dihasilkan sehingga bit yang diinginkan berada di posisi yang tepat.&1
: setel semua bit lainnya ke 0.sumber
o=_=>(o+'').charCodeAt(('n'in top?++n:n=0)/8|0)>>(7-n%8)&1
o=_=>('o='+o).charCodeAt(('n'in top?++n:n=0)/8|0)>>(7-n%8)&1
'n'in top?++n:n=0
Anda dapat menggunakan++n||(n=0)
atau++n?n:n=0
ataun=++n||0
ataun=1+n||0
yang semua memanfaatkan falsiness dariNaN
yang dihasilkan oleh incrementingundefined
o=_=>('o='+o).charCodeAt((o.n=1+o.n|0)/8)>>(~o.n&7)&1
q / kdb + , 45 byte
Larutan:
Contoh:
Penjelasan:
Saya pikir saya mengerti briefnya.
Pertama, atur variabel global
a
dengan nilai awal-1
. Fungsif
membangun representasi biner dari representasi string dari fungsi (semuanya termasuk{}
) yang diuraikan dengana:-1;f:
sampah, dan mengindeks ke dalam daftar biner ini di indeks a (yang akan bertambah setiap panggilan).sumber
Python 2 , 164 byte
Cobalah online!
Penjelasan
Mari kita mulai dengan quine standar Python 2.
Oke, well, ini hasilnya begitu saja. Kami membutuhkan biner!
Benar, itu hanya mengubah segalanya menjadi biner. Namun judulnya mengatakan "sedikit demi sedikit". Kami membutuhkan sesuatu untuk bertahan melalui beberapa putaran. Saya tahu, mari kita jadikan fungsi!
Tunggu, itu tidak membantu ... Hmm, bagaimana kita bisa melacak indeks bit yang diperlukan untuk menjadi output? Ooh, ooh, mari kita memiliki bilangan bulat untuk melacak.
Um ... itu selalu menampilkan bit pertama. Oh, kita perlu menambah pelacak! Oh sial, Python tidak mengizinkan bilangan bulat sebagai argumen default untuk dimodifikasi. Dan tugas bukan ekspresi dalam Python, jadi Anda tidak bisa melakukannya dalam lambda. Yah, ini tidak mungkin dengan Python, case closed.
... Yah, tidak cukup. Python tidak memungkinkan daftar sebagai argumen default untuk dimodifikasi. (Dan itu menggigit programmer Python sepanjang waktu.) Mari kita gunakan panjangnya!
Itu masih belum memodifikasi pelacak ... Kita bisa menambahkan sesuatu padanya untuk menambah panjangnya ... Tapi bagaimana? Ah, ya sudah
list.append
.lst.append(1)
setara denganlst += [1]
. Bagus!Ups, ini melompati bit pertama karena panjang pelacak adalah 1 sebelum bit dikeluarkan. Kita perlu mengurangi panjang di mana itu digunakan.
Itu dia, teman-teman! Golf itu dan Anda punya solusi saya!
sumber
Perl 5 , 59 byte
Cobalah online!
sumber