Jika Anda tidak terbiasa dengan peretas hacker, lihat hackertyper.net . Singkatnya, ini adalah sebuah program yang mengeluarkan satu potongan basis kode per keystroke untuk efek komedi. TETAPI, versi hackertyper.net terlalu mudah untuk diimplementasikan. Ini hanya menghasilkan tiga karakter sekaligus dari sepotong kode sewenang - wenang . Untuk tantangan ini, suatu program harus mengeluarkan kode sumbernya sendiri, dan mencetak satu spasi yang dibatasi potongan kode per penekanan tombol.
Detail
- Seseorang tidak bisa membuat kode nama file untuk program; itu harus menentukan namanya secara dinamis. Jika program mengkompilasi ke executable, ia dapat menambahkan ekstensi file standar ke nama executable (tidak termasuk .exe jika menggunakan Windows) dan menganggap bahwa file sumber berada di dalam direktori executable. Sebagai contoh, jika C executable bernama "hacker", itu harus menarik kode sumbernya dari file bernama "hacker.c" di direktori yang sama. Jika sebuah program yang dikompilasi memiliki ekstensi, ia harus dibuang sebelum menentukan nama kode sumbernya ("typer.exe" -> "typer.cs").
- Program harus mengandung setidaknya 5 spasi, dengan setidaknya satu karakter di antara setiap ruang. Ini berarti bahwa ukuran terkecil yang mungkin untuk tantangan ini adalah 9 byte. Ruang tidak harus penting untuk berfungsinya program.
- Setiap pemformatan (indentasi, baris baru, dll.) Harus dipertahankan dalam output. Format ini dapat dicetak dengan kode yang menghasilkannya atau mengikutinya, yang penting format tetap dipertahankan.
- Hindari menggunakan komentar untuk memenuhi persyaratan 5 ruang kecuali jika tidak ada cara lain untuk mengimplementasikan ruang dalam bahasa pilihan Anda.
EDIT : Baris baru dapat digunakan sebagai pengganti, atau sebagai tambahan, spasi sebagai pemisah chunk.
Jawaban:
bash, 51
58sumber
2: read: Illegal option -s
)cat $0
dan tildes dengan$(<$0)
IFS=\
sebenarnya dibutuhkan jika Anda menghilangkan shebang? IFS default adalah sesuatu sepertiIFS=$'\n\t '
, dan karena Anda tidak lagi memiliki baris baru, saya rasa Anda tidak perlu membatasinya hanya pada ruang.for w in `<$0`;{ read \-sn1;printf $w\ ;}
HTML & JavaScript, 123
Ini berfungsi mirip dengan hacker typer, tetapi dengan kode sumbernya sendiri. Beri tahu saya jika saya salah mengerti aturan.
Dan inilah versi gaya (170 karakter):
Saya sudah membuat demo . Ini dimodifikasi karena JS Bin menambahkan banyak kode tambahan, tetapi ide umumnya sama.
sumber
<head>
adalah bahwa browser akan menambahkannya jika tidak ada di sana, sehingga akan selalu ditampilkan. Tapi aku lupa<html>
.Perl + Term :: ReadKey, 56 byte
Terima kasih kepada ThisSuitIsBlackNot untuk inspirasi orisinalnya, dan kepada primo untuk menyarankan
open 0
dan<0>
.Perhatikan bahwa baris baru setelahnya
for
sebenarnya tidak perlu, kecuali bahwa saya perlu menyertakan satu baris baru tambahan di suatu tempat untuk membawa jumlah spasi putih hingga minimum yang ditentukan lima.Juga perhatikan bahwa, seperti pengajuan ThisSuitIsBlackNot, program ini memerlukan modul Term :: ReadKey dari CPAN. Pada Debian / Ubuntu Linux, modul ini, jika belum ada, dapat dengan mudah diinstal dengan perintah
sudo apt-get install libterm-readkey-perl
.Selain itu, untuk menyimpan beberapa karakter, program ini tidak mengembalikan mode input ke normal saat keluar, sehingga Anda mungkin tidak dapat melihat apa yang Anda ketikkan setelahnya. Menjalankan perintah shell
stty sane
ataureset
harus memperbaikinya. Masalah ini dapat diperbaiki, dengan biaya 10 byte tambahan, dengan:Bonus: Pure quine, 81 byte
Sekali lagi, baris baru setelah koma hanya diperlukan untuk memenuhi minimum lima spasi putih.
Berbeda dengan program 56-byte di atas, versi ini sebenarnya tidak perlu membaca kode sumbernya sendiri, karena ini didasarkan pada quine - khususnya, pada quine ini:
Yang menyenangkan tentang quine ini adalah ia dapat dengan mudah membawa "payload" sewenang-wenang di dalam
q{ }
blok, tanpa harus mengulanginya. Meskipun tidak bisa mengalahkan<0>
dalam waktu singkat, itu cukup dekat.Catatan: Program ini menggunakan fitur Perl 5.10+
say
, dan karenanya perlu dipanggil dengan saklar baris perintah-M5.010
(atau-E
). Sesuai konsensus tentang meta, sakelar seperti itu yang digunakan untuk mengaktifkan fitur bahasa modern tidak dihitung sebagai karakter tambahan . Solusi terpendek yang dapat saya temukan tanpasay
83 byte:Kedua hal ini juga dapat dibuat lebih ramah terminal dengan (bergabung dengan dua baris terakhir dan) memasukkan:
sebelum yang terakhir
}
.sumber
stty sane
daripadareset
(yang bisa, pada beberapa os, kadang-kadang melakukan sesuatu lebih dari sekadar menyetel ulang beberapa parameter terminal ^^)open F,$0
dan<F>
bisa diganti denganopen 0
dan<0>
. Juga, saya berpendapat bahwa satu posting di meta tidak benar-benar merupakan konsensus. Opsi-M5.01
tidak "membawa bahasa ke titik tertentu" , seperti yang penulis sarankan, ia mengaktifkan fitur. Tidak ada versi perl yang fitur-fiturnya diaktifkan secara default.ruby golfscript.rb foo.gs
dihitung sebagai perintah yang valid untuk menjalankan program yang ditulis dalam GolfScript, makaperl -M5.010 foo.pl
harus dihitung sebagai perintah yang valid untuk menjalankan program yang ditulis dalam "Perl 5.10". Tetapi argumen seperti itu benar-benar berasal dari meta, bukan di sini.)Python 3 - 124 byte - 7 spasi
Kode:
Tidak Disatukan:
Versi gaya:
sumber
Ruby,
85, 71Sayang sekali itu
IO#raw
bukan bagian dari perpustakaan standar.Perbaikan
Yang ini menghilangkan panggilan untuk keluar # Kernel dan menggunakan variabel global untuk mempersingkat kode.
sumber
Befunge - 21
Saya cukup senang dengan ini, karena saya baru tahu tentang Befunge. Jika Anda tidak keberatan "mengetik" ke jendela sembulan, Anda dapat menjalankannya di sini atau di sini sampai saya menemukan juru bahasa online yang lebih baik.
sumber
Powershell, 89
sumber
Python 3 - 299
Ini quine. Dipersingkat dari 507 dengan menggunakan
exec
dan memindahkan beberapa pernyataan.sumber
C,
211186 byteSolusi saya di C menggunakan perpustakaan kutukan. Mungkin lebih lama dari solusi C lainnya, tetapi ini adalah quine. Meskipun tidak diharuskan oleh pertanyaan, itu masih cukup bagus. Ini juga bekerja dengan sangat baik:
Versi yang lebih mudah dibaca dengan beberapa komentar dan hal:
kompilasi dengan:
sumber
C -
136 135132 byte (hanya Windows)Catatan: ada ruang di akhir program, yang mungkin tidak akan muncul.
Saya tidak dapat menjamin program ini akan bekerja pada satu komputer selain saya sendiri karena ini sangat hacky. Segalanya akan jauh lebih sederhana ketika semua orang hanya memiliki mesin 32-bit. Maka saya tidak perlu khawatir tentang
sizeof(int*)
menjadi 8 (yang pasti; saya mencetaknya untuk memastikan) sedangkansizeof(int)
4.Untungnya, nama executable disimpan dalam string pertama di argv.
Namun, menempatkan pointer sebagai argumen ke fungsi berarti bahwa saya harus secara eksplisit menentukan jenis SEMUA argumen untuk fungsi - yang berarti saya harus mengetikUntungnya saya menemukan solusi. Saya memiliki argumen kedua untuk main,,int
dua kali - buang-buang karakter.q
hanya menjadi int lain. Kemudian menugaskanq
ke variabel tipeint**
entah bagaimana berhasil mengambil semua byte yang diperlukan dari stack.Saya tidak berhasil menemukan trik seperti itu untuk menafsirkan tipe kembali
fopen
sebagai pointer tanpa mendeklarasikan fungsinya.Sunting: Memperhatikan saya harus menggunakan
~fscanf(*v,"%s",b)
sebagai gantifscanf(*v,"%s",b)>0
karena pengembaliannya -1 ketika EOF tercapai.sumber
void **v;
) alih-alih prototypingfopen()
.fopen
. Saya tidak melihat mengapa mengganti void untuk int harus membuat perbedaan, karena semua pointer memiliki ukuran yang sama.b[1<<20];main(int *c,char **v){strcpy(b,*v);strcat(b,".c");c=fopen(b,"r");for(;fscanf(c,"%s",b)>0;printf("%s ",b))getch();}
(saya harus menggantigetchar()
untukgetch()
meskipun).*fopen()
bukan*fopen(a,b)
?Perl - 87 byte
Saya tidak melihat apa-apa dalam aturan tentang apa yang harus dilakukan setelah file dibaca hingga akhir, jadi ia hanya duduk menunggu input setelah mencetak potongan terakhir.
sumber
node.js dengan LiveScript:
versi asinkron:
sumber
Cobra - 147
CobraCore.exePath
sangat berguna!sumber
Javascript ES6, 154
Firefox 154 :
Chrome 175 :
Keduanya 274 :
Tidak disatukan (chrome):
Memiliki dua versi, karena Chrome tidak menangani fungsi panah dan konsol tidak dibersihkan dengan metode yang sama
Firefox satu bekerja dengan pembakar, sepertinya konsol pengembang default tidak dapat dihapus dari skrip.
sumber
Groovy - 379
Karena tidak ada
getch()
atau setara dalam bahasa Jawa dan bahasa Java-esque seperti Groovy ... pada dasarnya kode saya tidak menangani penekanan tombol. Itu saja: Dsumber
C, 248 karakter
Quine benar
Hanya berfungsi di unix, di windows itu akan diimplementasikan menggunakan _getch.
sumber
HTML dan Javascript, 232 byte
Quine Javascript tradisional, tetapi dimodifikasi.
JSFiddle di sini .
sumber
SmileBASIC,
7975 byteSangat mudah untuk mendapatkan LINE tertentu dari sebuah program di SmileBASIC, jadi saya hanya menempatkan spasi sebelum setiap jeda baris.Saya pikir saya sangat pintar, menempatkan spasi sebelum setiap jeda baris, tetapi tampaknya kami diizinkan untuk menggunakan jeda baris alih-alih spasi ...Penjelasan:
sumber
Haskell
sumber