Tujuan Anda : untuk menulis sepotong kode yang akan menghasilkan hasil klasik "Halo, dunia!" dicetak ke STDOUT atau setara.
Aturan : Kode harus sepenuhnya dalam pencetakan ASCII. Semua kode harus fungsional - penghapusan karakter penghitungan tunggal apa pun harus mengubah hasil atau menyebabkan kode tidak berfungsi. Semua variabel harus digunakan setelah penugasan. Karakter dan Liter string harus diperlukan untuk output - yaitu, penggantian karakter literal atau karakter apa pun dalam string literal dengan karakter lain harus mampu mengubah hasil (dan bukan melalui efek urutan melarikan diri - mengganti karakter dengan backslash atau setara)
(CATATAN: Aturan final diedit pada)
Penilaian : Di sinilah ia menjadi menarik. Menang skor tertinggi sebagaimana ditentukan oleh jumlah karakter, sesuai aturan bowling kode yang khas. Tetapi penggunaan berulang karakter akan menghasilkan pengurangan poin. Secara khusus...
- Penggunaan berulang karakter alfanumerik apa pun (az, AZ, 0-9) akan menghasilkan pengurangan 3 poin per pengulangan (penggunaan pertama tidak menghasilkan pengurangan).
- Penggunaan tanda baca dasar berulang-ulang ([!? .-, ": ';]) - termasuk tanda kurung - akan menghasilkan pengurangan 2 poin per pengulangan.
- Penggunaan berulang karakter ASCII lainnya {`~ @ # $% ^ & * _ + = | \ /> <} - termasuk kurung keriting - akan menghasilkan pengurangan 4 poin per pengulangan.
- Penggunaan spasi, tab, dan baris baru yang berulang akan menghasilkan pengurangan 1 poin per pengulangan. Artinya, hanya penggunaan spasi, tab, atau baris baru pertama yang akan dihitung terhadap total Anda.
Catatan: komentar tidak dihitung terhadap total, meskipun karakter yang menandai awal / akhir dari suatu komentar dilakukan. Misalnya, dalam C / C ++, Jika sudah /* This is a comment */
, maka akan dihitung dua garis miring dan dua tanda bintang, tetapi tidak ada di antara keduanya.
Beberapa contoh (catatan: menggunakan Julia sebagai bahasa sampel) ...
print("Hello, world!");
Total karakter yang terlihat: 22
Berisi Ruang: +1
Alfanumerik
berulang : -12 untuk llor Tanda baca berulang: -2 untuk "
Skor akhir: 22 + 1-12-2 = 9
print("Hel",char(108),"o, wor",0x108,"d!"); # 0x108 makes a Uint8 that prints as ASCII
Total karakter: 43 (tidak menghitung karakter setelah #, yang merupakan karakter komentar)
Berisi Ruang: +1
Alfanumerik
berulang : -18 untuk rr1008 Tanda baca berulang: -24 untuk () "" "" "" ,,,
Final skor: 43 + 1-24-18 = 2
xy=STDOUT
m="Hello, world!"
print(xy,m);
Total karakter yang terlihat: 37
Berisi Baris Baru: +1
Berisi Spasi: +1
Alfanumerik
berulang : -18 untuk xyllor Tanda baca berulang: -4 untuk ",
ASCII berulang lainnya: -4 untuk =
Skor akhir: 37 + 1 + 1-18-4 -4 = 13
Beberapa potongan kode tidak valid ...
x=2;print("Hello,world!")
Masalah: x
ditugaskan, tetapi tidak digunakan.
print("Hello,"*" world!")
Masalah: *
tidak perlu, hasilnya akan sama tanpa itu.
k=1
if k>0
print("Hello, world!")
else
print("abcghjmquvxyzABCDEFGIJKLMNOPQRSTUVWXYZ_+*-&|")
end
Masalah: print
Perintah kedua tidak akan berjalan. Juga, menghapus karakter dalam kutipan di print
perintah kedua tidak akan mengubah output.
x="Hello, world!";
print(x)
Masalah: penghapusan baris baru tidak akan mengubah hasil atau menyebabkan kesalahan (di Julia, titik koma hanya diperlukan jika beberapa perintah berada di baris yang sama, jika tidak hanya menekan nilai balik).
print("Hellos\b, world!")
Masalah: s
karakter tidak memengaruhi hasil, karena terhapus oleh \b
. Ini dapat diterima jika dilakukan melalui kode ( "Hello",char(100),"\b, world!"
), tetapi tidak dapat dilakukan melalui string literal atau karakter literal.
Kalkulator skor nyaman - http://jsfiddle.net/4t7qG/2/ - terima kasih kepada Doorknob
Jawaban:
Perl - 96
(Cukup bagus, diberi skor teoretis maks 97)
(Perhatikan bahwa baris kedua dimulai dengan
\t
karakter tab yang sebenarnya )Kode tersebut terdiri dari 98 karakter dan berisi setiap karakter ascii tepat sekali, plus tambahan
-
.98 - 2 = 96
Tidak ada tali literal di sini, tapi penghapusan setiap karakter tunggal istirahat program.
Deobfusiasi
Ada 3 pernyataan dalam program ini (well, sebenarnya 2 tapi saya disalahgunakan
+
sebagai semacam pemisah pernyataan)s{}[Hel0o, w3$=d!]
Ini adalah kasus operator sed yang sangat luas. Ini lebih umum ditulis sebagai
s/a/b/
, ataus:a:b:
, tetapi perl memungkinkan lebih banyak fantasi di sini:,s(a)(b)
s(a)^b^
s(a)[b]
dan bahkans qaqbq
.Ini menggantikan string kosong (di dalam
{}
) denganHel0o w360d!
(di dalam[]
) ($=
interpolasi60
secara default). Karena kurangnya~=
operator, ia beroperasi$_
.y<"#%&'*.124578:?@BCDEFGIJKLMNOQ/-9>(\n\t6PRSTUVWXYZ^_`abfghjmqvxz|~\cAk-u)
Ini juga merupakan kasus yang sangat meluas, tetapi dari
tr
operator, yang juga disebuty
(y< >( )
).Mari kita lihat tabel pengganti:
" # %&'*.124578:?@BCDEFGIJKLMNOQ /-9
\n\t6PRSTUVWXYZ^_`abfghjmqvxz|~\cA k-u
Saya telah memindahkan beberapa karakter sehingga string yang ada tidak rusak. Satu-satunya bagian yang benar-benar berfungsi di sini adalah
/-9
->k-u
. Itu menggantikan0
denganl
,3
dengano
, dan6
denganr
.Sekali lagi karena kurangnya
~=
operator, ini beroperasi pada$_
Jadi sekarang kita memiliki frasa lengkap dalam
$_
variabel.print
Kurangnya argumen membuatnya hanya mencetak
$_
variabel.sumber
/-9
dank-u
sebenarnya digunakan untuk mengubah string. Sisanya adalah sampah berukuran sama . Jika Anda menghapus hanya satu char, set akan misalign dan program tidak akan menampilkan "Halo, dunia!" lagi.<...> removal of any single counting character must change the result or cause the code to not function.
Penghapusan 1 karakter di mana saja mematahkannya. Anda dapat membuatnya berfungsi dengan menghapus 2 karakter, tetapi itu tidak ada dalam aturan.All code must be functional
. Anda jelas menekuk aturan, setidaknya. Saya tidak mengatakan "itu melanggar aturan" secara langsung, tetapi jelas dipertanyakan.Jawaban ini dibuat sebelum menambahkan aturan tentang string literal dan tidak berpartisipasi dalam kontes.
Ini sepenuhnya sah. : P Jika Anda menghapus karakter apa pun dari string itu, karakter itu akan dicetak
ello, world!
.sumber
<<
harus dihapus.if 'x'>'w'
teknik, tetapi memblokir "k \ bH" untuk menghasilkan "H", misalnya. Jangan ragu untuk berkontribusi jawaban kedua setelah pembatasan ditambahkan.CJam, 94
Cobalah online! Perhatikan bahwa harus ada tabulator tepat sebelum linefeed. SE tidak suka tabulator, jadi Anda harus memasukkannya secara manual.
Total skor: 94
Saya telah menggunakan kode berikut untuk memeriksa bahwa tidak ada karakter di dalam string yang dapat dihapus:
Ini mencetak array yang menunjukkan berapa kali Halo, dunia! akan dicetak jika karakter yang sesuai dengan indeks dihapus.
sumber
254b
). Modulus 7 hasil akhir harus 1, sehingga blok kode sebelumnya dieksekusi sekali. Saya membutuhkan modulus untuk membuat setiap karakter diperlukan.Z
, yangT
, atau mungkin beberapa karakter lain tidak mengubah hasilnya.Ruby,
2841Untuk memulai jawaban dengan solusi dalam semangat pertanyaan:
Mencetak gol (saya pikir saya benar):
orli
)"'
)sumber
.
di3.1
dapat dihapus tanpa masalah. Seperti halnyax
dalam0x4
atau-
dalam8-5
.PHP, 1 (ya, satu poin!)
Menggunakan karakter ajaib untuk menghasilkan checksum, yang dalam bentuk biner cocok dengan "Neraka", "o, w", "orld", dan "!".
Biasanya saya suka mencari celah, tapi kali ini saya memutuskan untuk bermain dengan semangat dan niat dari kontes. Setiap karakter dan posisinya sangat penting untuk output. Satu-satunya tempat yang bisa Anda gantikan adalah nama variabel yang bukan nilai literal, spasi putih di antara
php
danforeach
yangPHP
memperlakukannya sama, dan penggunaan'
vs"
yangPHP
memperlakukannya serupa.FYI, ini adalah beberapa string sihir dan hash yang menarik:
sumber
\t
,\n
atau ruang. Bukan ahli PHP, tetapi;
tampaknya opsional juga.Befunge-98 , 97 poin!
Cobalah online!
Tab berada di antara
q
dann
.Menggunakan trik yang mirip dengan jawaban Befunge sebelumnya untuk membuat garis dengan karakter yang tersisa, tetapi hindari menggunakan karakter duplikat di bagian pelaksana. Menghapus salah satu karakter yang tidak mengeksekusi menghasilkan bagian yang mengeksekusi tidak pada tempatnya, biasanya berakhir dalam loop tak terbatas atau mencetak output yang salah.
Bagaimana itu bekerja
Sungguh, satu-satunya bagian yang mengeksekusi seperti:
Pertama menggunakan string pembungkus literal untuk ditambahkan
, world!
ke stack. Ini menghindari dua"
s.Ini menambah
Hello
tumpukan menggunakan berbagai metode untuk menghindari duplikat karakter.$
muncul kelebihan ruang yang disebabkan oleh string pembungkus literal.7+
menambahkan 7 keh
dari ujung string literal untuk membuato
.ba*46\%:
menghitung 111, nilai asciil
dan menduplikatnya.'e
menambahkan e ke tumpukan.f1g
mendapat karakter di 1,15 yang merupakanH
Kemudian menggunakan kembali
,
dalam string untuk mencetak keseluruhanHello, world!
. Sisanya hanyalah perubahan arah untuk menavigasi ke akhir@
.sumber
Ruby, 78
Lebih banyak aturan penyalahgunaan, saya merasa seperti, tidak yakin persis apa tambalan itu. Mengambil string panjang dan memeriksa jumlah hasil, sehingga penghapusan atau perubahan apa pun akan menyebabkan program gagal. Mungkin bisa sedikit dioptimalkan untuk menghapus duplikasi beberapa surat dan mendapatkan spasi di sana.
sumber
if
bisa dihapus.if
tidak benar-benar berfungsi dan hal-hal setelah itu tetap mematuhi aturan.puts('Hello, world!')
akan bekerja. Saya pikir aturan perlu diperjelas jika ini sah.PHP, 2257
Loophole: backslash dihilangkan dari spesifikasi dan kalkulator skor!
Kode ini menghitung jumlah kemunculan garis miring terbalik di setiap string dan mencetak ASCII yang setara. Mengganti backslash dengan karakter lain, atau menghapus backslash, bisa menyebabkan kesalahan parse atau mengubah hasilnya.
Fitur yang rapi tentang garis miring terbalik dan
PHP
mereka harus diloloskan, sehingga menggandakan skor secara otomatis! Anda dapat menggandakan, melipattigakan, dll., Skor dengan mengalikan jumlah garis miring terbalik, tetapi tidak ingin menjadi serakah, dan saya pikir itu mungkin melebihi batas dari apa yang dapat Anda masukkan.sumber
Befunge - 87
Baris pertama bernilai empat poin karena semua pengulangan, tetapi tidak ada karakter duplikat di baris kedua. Satu-satunya string literal dalam kode ini adalah
dlrow ,olleH
, yang dibalik dan dicetak sebagai output. Menghapus salah satu karakter akan memutuskan sambunganv
di akhir baris pertama dari@
pada akhir baris kedua, menyebabkan program tidak pernah berakhir. Jikav
itu sendiri dihapus, maka kode akan masuk ke loop tak terbatas mencetak output yang benar.sumber
Aceto , 3
Akhirnya berhasil mendapatkan skor positif!
Cobalah online!
sumber
∑
tidak ada dalam pencetakan ASCIIAcc !!, -138 (dan ya itu negatif 138)
Meskipun ini mungkin bukan skor terbaik yang pernah saya dapatkan di PPCG, saya ragu itu bisa lebih tinggi dari ini di Acc !!
Cobalah online!
sumber