Mari kita mendefinisikan program murni sebagai program yang tidak memiliki kesalahan itu sendiri tetapi akan kesalahan jika Anda memodifikasinya dengan menghapus substring N karakter yang berdekatan, di mana 1 <= N < program length
.
Misalnya, program tiga karakter Python 2
`8`
adalah program murni ( terima kasih, Sp ) karena semua program yang dihasilkan dari menghapus substring dengan panjang 1 menyebabkan kesalahan (kesalahan sintaks sebenarnya, tetapi semua jenis kesalahan akan dilakukan):
8`
``
`8
dan juga semua program yang dihasilkan dari menghapus substring panjang 2 menyebabkan kesalahan:
`
`
Jika, misalnya, `8
telah menjadi program non- kesalahan maka `8`
tidak akan murni karena semua hasil penghapusan substring harus kesalahan.
Tugas Anda dalam tantangan ini adalah menulis program terpendek yang mungkin yang tidak memerlukan input tetapi mengeluarkan salah satu dari lima kata berikut:
world
earth
globe
planet
sphere
Kata mana yang Anda pilih sepenuhnya terserah Anda. Satu-satunya kata plus baris tambahan opsional harus dicetak ke stdout (atau alternatif terdekat bahasa Anda). Program terpendek dalam byte menang.
Catatan:
- Diperlukan program mandiri, bukan fungsi.
- Kata-katanya peka huruf besar-kecil; keluaran
World
atauEARTH
tidak diizinkan. - Peringatan kompiler tidak dihitung sebagai kesalahan.
- Subprogram yang error dapat mengambil input atau memberikan output atau melakukan hal lain selama mereka akhirnya selalu error.
Berikut cuplikan tumpukan yang akan mencantumkan program apa yang perlu dikoreksi mengingat program yang mungkin masih asli:
<script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>function go() { var s = $('#i').val(), e = []; for (var i = 1; i < s.length; i++) { for (var j = 0; j <= s.length - i; j++) { e.push(s.substring(0, j) + s.substring(j + i)); } } $('#o').val(e.join('\n---\n')); }</script>Program:<br><textarea id='i' rows='16' cols='80'>`8`</textarea><br><button onclick='go()' type='button'>Go</button><br><br>Programs that should error: (--- separated)<br><textarea id='o' rows='16' cols='80'></textarea><br>
sumber
Jawaban:
Rail , 24 byte
Saya pikir ini berhasil. Dan itu pendek dan mudah dibaca (sejauh Rail pergi).
$'main'
kitaInternal Error: Crash: No 'main' function found
.#
, tidak ada cara bagi program untuk keluar dengan bersih, sehingga akan selalu berakhir denganCrash: No valid move
. Saya percaya bahwa tidak mungkin untuk menghapus substring sedemikian rupa sehingga trek membentuk loop (tidak terbatas) yang valid.#
akan terputus dari ujung lintasan, sehingga kereta akan menabrak (dengan kesalahan yang sama seperti di atas).#
, substring juga akan memutus sambungan#
dari ujung trek (dan berpotensi bahkan awal trek dari titik masuk$
). Jadi sekali lagi kesalahan yang sama.Adapun program yang sebenarnya: setiap program Rail perlu memiliki
$'main'
(atau varian yang lebih panjang, tapi kami bermain golf di sini) sebagai titik masuk ke dalam fungsi dan kereta mulai$
berjalan di Tenggara. Segala sesuatu di baris pertama itu bisa menjadi bagian dari trek, jadi menghapus'main'
trek adalah:The
-
dan/
hanya potongan-potongan rel yang kita perlu membiarkan kereta mengambil orang-orang 45 ° bergantian.[world]
mendorong stringworld
dano
mencetaknya.#
menandai akhir dari trek - satu-satunya cara untuk menghentikan program Rail dengan aman.Menariknya, solusi ini hanya mungkin karena Rail memungkinkan trek melewati
main
garis - jika itu tidak mungkin#
terjadi setelah baris baru pertama dan kode selalu dapat disingkat menjadiyang merupakan program yang valid yang tidak melakukan apa-apa. (Karakter non spasi antara
'
dan#
tidak akan memengaruhi itu.)Juga cukup menarik: jika saya baru saja golf tugas pencetakan
world
itu tidak akan jauh lebih pendek atau sederhana:sumber
/
dari#
.$
dari awal lintasan, sehingga kereta langsung mogok (Rail mengharapkan lintasan untuk melanjutkan Tenggara$
).Funciton (
186136 bytes dalam UTF-16)Program ini mencetak "dunia".
Sebagian besar substring yang Anda hapus dari ini akan menghentikannya menjadi kotak lengkap, yang akan dikeluhkan oleh pengurai. Satu-satunya kemungkinan penghapusan yang meninggalkan kotak lengkap adalah:
Sebagian besar dari ini menghilangkan ujung menggantung di kanan atas kotak, yang merupakan konektor output. Tanpa ujung yang longgar ini, kotak hanyalah komentar:
Ini bukan lagi program yang valid karena parser mengharapkan program dengan tepat satu keluaran:
Satu-satunya kemungkinan yang meninggalkan konektor output adalah yang terakhir di atas, yang meninggalkan ini:
Namun, nomor ini tidak menyandikan string Unicode yang valid di UTF-21 esoterik Funciton. Coba jalankan ini, Anda mendapatkan:
Karena itu, program ini masih asli.
sumber
Visual C ++ -
9695 byteProperti:
int main()
tanpa kesalahan kompilasi.a
semua caramain()
tidak pernah mendapat{
, menghapusb
sama sekali berarti baris kami tidak berakhir dalam;
, menghapus<
carastd::cout<'w'
menyebabkan kesalahan, dan menghapus<<
penyebabstd::cout'w'
,'w''o'
, dllI(a)
,I(b)
yang tidak pernah cocok danI
mana yang diperluas sebelumnya(
; di sisi lain menggunakanI(,
penyebab<<<<
, dan,)
menjatuhkan titik koma (kecuali ada kesalahan lain).std::cout
tanpa berlari ke sebuah arahan<<
, dan karena itu tidak dapat menghapus salah satu#include<iostream>
di awal tanpa kesalahan kompilasi.''
memiliki kesalahan karakter kosong dan'w,
, dll ... mencoba membuat semuanya menjadi satu karakter.)
atau(
di sisi lain, misalnya Anda tidak dapat melakukan hal-hal sepertiI('w',I('r'
.Kompilasi online menggunakan Visual C ++ .
Sekali lagi ini bukan bukti lengkap. Jika Anda pikir Anda bisa melakukannya juga tanpa bagian pastikan untuk memberi tahu saya.
Versi sebelumnya menggunakan pendekatan yang sangat berbeda dan terbukti tidak murni jadi saya telah menghapus skor tersebut.
Verifikasi:
Program berikut telah mengonfirmasi versi ini yang masih asli menggunakan
cl
kompiler dari Visual C ++ 2010. Berharap saya repot-repot menulis ini lebih cepat:sumber
/c
opsi secara otomatis disertakan dan dikompilasi (seolah-olah membuat perpustakaan dan bukan program). Jika Anda mencentang kotak run situs yang tidak termasuk/c
, Anda tidak akan mendapatkan pesan sukses, dan sebaliknya menemukan "LINK: fatal fatal LNK1561: entry point harus ditentukan".Python 3,
7933open(1,'w')
membuka output standar, lalu kami mencetak string.write
mengembalikan jumlah karakter yang ditulis. Ini digunakan untuk menguatkan terhadap penghapusan substring: Menghapus bagian dari string menyebabkan sesuatu selain 5 dikembalikan, dan 5 minus nilai itu kemudian dievaluasi menjadi true. Tetapi itu menyebabkanif
-saya dieksekusi dana
tidak terdefinisi.Ini didasarkan pada Quine yang murni dan pintar Anders Kaseorg di sini .
Karena hanya satu pernyataan yang perlu diverifikasi, ini jauh lebih pendek daripada solusi yang lama, tetapi juga kurang umum.
Solusi lama:
Untuk memverifikasi bahwa itu benar-benar program yang murni:
Beberapa poin penting:
q
telah dieksekusi memerlukan pernyataan di luarq
. Itutry
memecahkan yang baik, dengan mengharuskan setidaknya dua pernyataan, yang tidak dapat dihapus sepenuhnya.q
telah dieksekusi terjadi dengan mengevaluasir
di akhir.q
tidak dimodifikasi dicapai oleheval(q[17:])
, yang harus dievaluasiNone
untukq
untuk dieksekusi.if
Kondisi ini agak sulit untuk mendapatkan hak. Untuk memastikan bahwa itu dievaluasi itu memiliki efek samping pengaturan yang baguse
, yang diperlukan untuk mengaturr
. (Ini adalah alasan saya menggunakan Python 3,expr
karena suatu fungsi tidak heran untuk efek samping tingkat ekspresi.)sumber
Haskell, 61
Apa jenis kesalahan apa-apa? Dalam hal itu:
Haskell, 39
sumber
JavaScript,
747335 byteTernyata jawabannya jauh lebih sederhana dari yang saya kira ...
Penjelasan
sumber
a="world"
, jangan salahif(a="world")["bol"+a[4]]
tidak salah.Java 8, 301 byte
Karena setiap pertanyaan membutuhkan jawaban Java.
Diperluas
Penjelasan
public static main(String[]a){}
diperlukan.Bagian tersulit:
final
kata kunci dihapus, baris kedua dievaluasi menjadi1/(8-8)
, menyebabkan/ by zero
pengecualian.sumber
System.out.print()
metode kosong . Ada untukprintln()
, tetapi tidak untukprint()
. Jadi, jika Anda akan menghapusnyad='d'
akan memberikanThe method print(boolean) in the type PrintStream is not applicable for the arguments ()
kesalahan (Dan jika Anda akan menghapusnyad=
akan memberikanThe blank final field d may not have been initialized
kesalahan).Funciton ,
143142136 byteSkor dalam UTF-8 seperti biasa, karena UTF-16 akan dua byte lebih besar (karena BOM).
Jadi, saya telah merenungkan jawaban Funciton untuk sementara waktu dan saya pikir itu tidak mungkin, karena Anda selalu dapat menghapus baris penuh dan kode masih akan membentuk blok yang valid. Lalu saya berbicara dengan Timwi tentang hal itu, dan dia mencari tahu bahwa Anda bisa meletakkan seluruh nomor dalam satu baris, sehingga menghapusnya akan merusak program karena kurangnya konektor output.
Tetapi literal pada satu baris terkenal mahal, baik karena jumlah karakter yang lebih besar dan karena jumlah karakter non-ASCII yang lebih besar. Dan penyebutannya tentang blok "komentar kosong" membuat saya berpikir ...
Jadi saya datang dengan solusi yang lebih efisien ini yang menggunakan blok komentar kosong tambahan yang rusak ketika Anda mencoba menghapus apa pun yang akan meninggalkan blok literal dalam kebijaksanaan:
Itu menyisakan dua opsi (terima kasih kepada Steve karena menunjukkannya):
19342823075080880373
diterjemahkan, string yang sesuai akan berisi titik kode0x18D53B
yang bukan karakter Unicode yang valid,System.Char.ConvertFromUtf32
lumpuh denganArgumentOutOfRangeException
.508088037380718711
akan berisi dua poin kode yang tidak valid0x1B0635
dan0x140077
, mengarah ke pengecualian yang sama.Perhatikan bahwa bahkan tanpa blok komentar kosong, menghapus baris kedua akan menyebabkan titik kode yang tidak valid. Tetapi blok komentar mencegah kita mengambil garis dari dalam baris kedua, untuk mendapatkan bilangan bulat seperti
193428037380718711
misalnya, yang tidak akan menyebabkan kesalahan.sumber
Ruby, 36
Kami menetapkan
s="planet"
, lalu menulis string itu ke STDOUT. Ini mengembalikan jumlah karakter yang ditulis. Kami menggantinya dengan 6, sehingga jika ada selain 6 karakter yang ditulis, kami akan mendapatkan bilangan nol. Lalu kami mengiriss
dengan indeks itu. Hanya karakter ke-0 daris
, "p", adalah string kode yang valid (no-op). Kami meneruskannya keeval
, menggunakan(*[argument])
sintaks yang setara dengan adil(argument)
kecuali bahwa itu tidak valid di luar pemanggilan metode.Pristineness diverifikasi secara terprogram pada Ruby 1.9.3 dan 2.2
sumber
*
?C #,
128118101 byteBerpikir untuk menyalahgunakan aturan substring yang berdekatan.
Kode
Mengapa Ini Bekerja?
class h
danstatic void Main()
wajib diisi.'w','o','r','l','d'
menyebabkan kesalahan karena array char diinisialisasi dengan panjang1*5
.Sebelum Golf dan Pemisahan
Diverifikasi dengan
https://ideone.com/wEdB54
SUNTING:
#if !x
alih-alih#if x #else
.=>
Sintaks func yang digunakan .#if!x
dari pada#if !x
. Kredit ke @JohnBot.=>
sintaks func, kondisi preproc ekstra dapat dihapus.sumber
static
diMain
.Main
sebuah anggota fungsi Ekspresi bertubuh dan 2 lainnya menghapus spasi sebelum kondisi preprocessor:class h{static void Main()=>System.Console.Write(new char[1\n#if!l\n*5]{'w','o','r','l','d'\n#if!o\n});\n#endif\n}\n#endif
. Itu menurut perhitungan saya.MATLAB,
373633 byteKarena saya tidak yakin apakah kita diperbolehkan juga output ans = , saya harus mencari cara untuk menghasilkan dengan cara yang tepat. Menggunakan fprintf dengan sendirinya tidak berhasil, karena apa pun yang saya coba, ia hanya menolak kesalahan. Menggunakan disp dengan sendirinya bukanlah suatu pilihan, karena hanya akan mengambil 1 argumen dan argumen itu sendiri juga akan mengeksekusi tanpa kesalahan.
Jika tidak ada masalah untuk memasukkan ans = dalam output, maka MATLAB dapat dilakukan dengan 20 byte :
sumber
> <> , 17 byte
Cobalah online!
Mencetak "bumi".
Satu-satunya cara
><>
program keluar tanpa kesalahan adalah mengeksekusi;
karakter, yang merupakan masalah karena Anda bisa menghapus semua karakter sebelum itu, sehingga itu;
adalah karakter pertama yang dieksekusi. Anda dapat menyiasatinya dengan menggunakanp
perintah untuk memodifikasi program untuk dimasukkan;
selama eksekusi. Menghapus bagian mana pun dari kode menyebabkan;
tidak pernah diproduksi yang menyebabkan kesalahan melalui instruksi yang tidak validB
,h
dant
, tumpukan underflow, dan loop tak terbatas membuatnya akhirnya kehabisan memori. Saya hanya harus memastikan bahwa semua loop tak terbatas terus mengisi tumpukan.Semua varian diuji menggunakan potongan python ini:
ditambahkan ke (versi yang sedikit dimodifikasi) fish.py resmi penerjemah oleh pencipta> <>. Dari 152 kemungkinan sub-program, 92 kesalahan karena instruksi yang tidak valid, 18 dari stack underflow, dan 42 kehabisan memori.
Fakta lucu, versi pertama ini
e"ooooo6-c0pAhtra
memiliki beberapa sub-program aneh yang berhasil menggunakan perintah put ke tempat[
yang akan menghapus tumpukan, di tempat instruksi yang tidak validA
. Juga, "earth" adalah satu-satunya frasa yang akan bekerja dengan metode ini, karena huruf pertama,e
adalah instruksi yang valid di><>
. Kalau tidak,"
perintah harus ditempatkan di depan program, dan subprogram yang valid bisa saja"
dengan sendirinya.sumber
Ruby, 34
Ini memiliki beberapa komponen:
eval(*[
expr])
dipinjam dari jawaban histocrat , dan masih asli serta memverifikasi nilai kembali dari expr adalah program ruby yang valid yang tidak salah.method(*arr)
adalah sintaks ruby yang memanggilmethod
dengan nilaiarr
sebagai argumen. Alasan ini diperlukan di sini adalah karena ini hanya valid sebagai parameter untuk suatu metode, sehingga jikaeval
dihapus,(*[expr])
adalah kesalahan sintaksis. Jika expr dihapus,eval
mengeluh tentang tidak memiliki cukup argumen$>.write("world")-1
tidak bisa hancur kecuali di dalam string dan pengurangan.$>.write("world")
menulis "world" ke STDOUT dan mengembalikan jumlah karakter yang ditulis, kemudian kurangi 1. Oleh karena itu jika program ini tidak terurai nilainya akan tepat 4 . Jika rusak (baik-1
dihapus atau string dipendekkan) maka akan mengembalikan satu dari -1,0,1,2,3, atau 5 . Kerusakan lainnya menghasilkan kesalahan sintaksis.Memanggil
chr
nomor mengembalikan karakter yang diwakili oleh nomor itu. Jadi, ketika dipanggil pada hasil dari contoh di atas, kesalahan pada -1, dan mengembalikan string karakter tunggal sebaliknya.Saya tidak benar-benar yakin mengapa ini terjadi, tetapi tampaknya bahwa ruby mengartikan
\x04
sebagai karakter spasi, yang berarti ungkapan itu valid (program ruby kosong tidak melakukan apa-apa). Namun, salah satu karakter lain (\x00
-\x03
dan\x05
) menghasilkanInvalid char '\x01' in expression
. Saya menemukan ini dengan hanya mengulangi kemungkinan matematika yang bisa saya lakukan untuk nomor yang dikembalikan. Sebelumnya saya pernah menggunakandi mana "planet" ditambah garis baru adalah 7 karakter, waktu 16 untuk mendapatkan 112 untuk
p
, satu-satunya fungsi huruf tunggal di ruby yang didefinisikan secara default. Ketika tidak diberi argumen, itu efektif no-opSebutan terhormat:
$><<"%c"*5%%w(w o r l d)
sangat dekat tetapi tidak murni. Menghapus"%c"*5%
hasil tanpa kesalahan. Penjelasan mini:$>
adalah stdout, dan<<
merupakan fungsi yang dipanggil di atasnya."%c"*5
menghasilkan string format"%c%c%c%c%c"
, yang kemudian mencoba diformat (%
) oleh array:%w(w o r l d)
yang merupakan versi lebih pendek dari['w','o','r','l','d']
. Jika ada terlalu sedikit atau terlalu banyak elemen dalam array sehingga tidak cocok dengan format string, kesalahan terjadi. Tumit achilles adalah itu"%c"*5
, dan%w(w o r l d)
keduanya dapat eksis secara independen, dan$><<
hanya membutuhkan argumen keduanya. Jadi ada beberapa cara untuk mengubah program ini menjadi sepupu yang tidak salah.Divalidasi menggunakan ini:
sumber
Python 3 , 43 byte
Cobalah online!
Bagaimana itu bekerja
Untuk melindungi dari penghapusan substring, kami menggunakan
open(1,"w").write
sebagai gantiprint
. Dalam Python 3,write
mengembalikan jumlah karakter tertulis, yang akan kami verifikasi adalah5
untuk memastikan bahwa tidak ada bagian dari string yang dihapus. Kami melakukan ini dengan mencari nilai kembali dalam kamus{5:[]}
, dan mengulang hasilnyafor[]in…:a
, yang akan gagal jika kami tidak mendapatkan iterable kosong atau jikafor
pernyataan dihapus.sumber
Javascript (Node.js),
9395 bytePeriksa ukurannya sendiri dua kali jadi jika ada karakter yang hilang, kesalahan akan terjadi. Panjangnya adalah 156 karena Node.js menambahkan
function (exports, require, module, __filename, __dirname) {
kode pada saat runtime.Terima kasih Martin Büttner karena menunjukkan kesalahan. Diperbaiki sekarang
sumber
Perl 5.10+,
7163 byteMencetak
world
dengan baris baru yang tertinggal. Jalankan seperti ini:Ini bergantung pada jumlah byte dari kode sumber, jadi
file
harus berisi kode di atas dan tidak ada yang lain (tidak ada shebang, tidak ada trailing newline). Perl 5.10+ diperlukan untuksay
dan operator yang ditentukan atau//
.Sangat sulit untuk membuat program murni dengan Perl, karena:
Identifier bareword (misalnya
foo
,a
,_
) adalah pernyataan yang sah denganno strict 'subs';
(default). Ini berarti program tidak dapat memulai atau mengakhiri dengan huruf, angka, atau garis bawah.Seperti yang dijelaskan tchrist , "Identifier yang ditentukan melalui simbol dereferencing sama sekali tidak memiliki batasan apa pun pada nama mereka." Ini berarti program tidak bisa mulai dengan salah satu sigils
$
,@
,%
, atau*
, karena menghapus semua kecuali karakter pertama dan terakhir akan selalu meninggalkan nama variabel yang valid.Banyak fungsi
$_
bawaan (termasuk sebagian besar fungsi yang mampu menghasilkan keluaran) berfungsi secara default, jadi panggilan akan sering bekerja bahkan jika Anda menghapus argumen (misalnyasay"world"
vs.say
).Bagaimana itu bekerja
Solusi ini terinspirasi oleh jawaban Naouak's Node.js , yang memeriksa panjangnya sendiri untuk memastikan karakter belum dihapus.
Program ini memiliki dua bagian, satu di dalam tanda kurung dan yang lainnya di dalam sebuah blok:
Bagian pertama membaca file sumber dan mati jika kurang dari 63 karakter. Bagian kedua memeriksa apakah
read
eksekusi berhasil. Jika salah satu bagian dihapus (dengan atau tanpa kurung kurung atau kurung kurawal), bagian lain akan mengeluarkan pengecualian.Menghapus bagian tengah atau kiri atau kanan program akan menghilangkan tanda kurung dan / atau kurung kurawal, yang menyebabkan kesalahan sintaksis.
Jika yang pertama
die
diubah (untukd
,e
,di
,de
, atauie
, yang semua pengidentifikasi valid), cek panjang menjadi:yang mengevaluasi ke:
Ini mengambil referensi ke string dan mencoba untuk mengubah referensi sebagai array, menghasilkan kesalahan:
Jika ada pernyataan lain yang diubah, pemeriksaan panjang akan gagal dan program akan mati.
Diverifikasi murni dengan program berikut:
sumber
Ruby + coreutils,
332726 byteCobalah online!
Backticks di ruby menjalankan perintah di dalamnya dan mengembalikan apa pun yang dimasukkan program ke dalam STDOUT sebagai string. The
#{expr}
sintaks memungkinkan embedding ekspresi dalam string dan tanda kutip mundur. Program ini dapat ditulis ulang (non-murni) sebagai:IO#write
mengembalikan jumlah byte yang ditulis, jadi jika string dipersingkat maka itu tidak akan menjadi angka yang tepat.#{}
embedding secara otomatis membuat angka menjadi string. Jika beberapa bagian dihapus, dan itu tidak menghasilkan kesalahan sintaks, perintah yang salah akan dijalankan. Jika bagian dari"world"
dihapus dari salah satubase04
melaluibase54
akan mencoba dijalankan.Baris baru, baik di dalam maupun di luar string, diperlukan. Kalau tidak 5 karakter pertama (
`base
) dapat dihapus, membuat seluruh baris komentar. Juga harus ada satu atau lebih karakter antara backtick pertama dan#
, jika tidak,{
bisa dihapus untuk membuat semuanya menjadi komentar shell .exec
Mengganti proses ruby saat ini dengan perintah yang ditentukan. Lihat jawaban saya yang lain untuk penjelasan tentangmeth(*[])
sintaks dan kebutuhannya.(s="ec%co earth")
menetapkan string "ec% co earth" ke variabels
. Tugas mengembalikan apa yang ditugaskan, sehingga string juga dikembalikan."format string %d" % 5
adalah gula sintaksis untuksprintf("format string %d",5)
, tetapi ruang di sekitar%
tidak perlu.s[10]
mendapatkan karakter dalam string pada indeks 10. Ketika un-mangled, karakter ini adalah "h", huruf terakhir dalam string. Namun, menghapus karakter apa pun di string berarti string lebih pendek, sehingga tidak ada karakter di indeks 10, jadis[10]
kembalinil
, dan"%c" % nil
menyebabkan kesalahan.jika
%s[10]
dihapus, maka ruby mencoba menjalankan perintahec%co earth
yang tidak berfungsi.Mengubah
10
ke1
atau0
juga menghasilkan perintah yang tidak dikenal (salah satueceo
atauecco
). Menghapusnya sepenuhnya secara teknis bukan kesalahan sintaks karena memanggil metode#[]
pada string, tetapi kemudian mengeluh tentang tidak cukup argumen.Catatan tentang pemecahan masalah ini secara umum: Anda harus memiliki beberapa pembungkus yang memverifikasi kode di dalamnya dalam arti abstrak sambil tetap murni. Misalnya, program dengan divisi di akhir (
blablabla/somevar
) tidak akan pernah berhasil karena divisi selalu dapat dihapus (blablabla
). Ini adalah beberapa pembungkus yang saya gunakan sejauh ini:eval(*[
kode yang])
digunakan oleh histokrat dan jawaban pertama saya. Memvalidasi bahwa output adalah program ruby yang validexec(*[
kode yang])
digunakan di atas, memvalidasi bahwa respons adalah perintah yang valid`#{
kode}`
Sintaks backtick juga menjalankan perintah (dan karenanya memvalidasi bahwa itu valid), namun STDOUT ditangkap sebagai string alih-alih menjadi output sebagai proses induk '(Rubi) STDOUT.
Karena ini saya tidak dapat menggunakannya untuk jawaban ini,EDIT: Saya membuatnya bekerja. Keterbatasan yang diuraikan di atas.Sunting: Terima kasih kepada @histocrat karena menunjukkan beberapa kekurangan
sumber
write
dan awal string, tapi saya tidak berpikir itu mempengaruhi keaslian. Juga, di komputer sayabase64
akan menunggu input, yang mungkin melanggar aturan.$>.write"world"
berhasil, terima kasih! Sedangkan untuk base64 menunggu input, tampaknya bervariasi berdasarkan sistem. TIO bekerja dengan baik. Itu membuatnya semakin kabur apakah mengikuti aturan.PowerShell, (97 byte + 5 untuk nama program) = 102 Bytes
Cek sendiri sebelum rusak sendiri ... dua kali.
Mengharapkan untuk disimpan sebagai
c.ps1
dan dilaksanakan dari direktori lokal seperti:PS C:\Tools\Scripts\Golfing\> .\c.ps1
.Alias
gc
adalah kependekan dariGet-Content
dan mirip dengancat
membaca file (dalam hal ini, jalur eksekusi kami.\c.ps1
). Kami mendapatkan.Length
file, mengaturnya$a
, dan memeriksa apakah itu tidak sama dengan 97 dengan-eq97
. Jika sama (yaitu, program belum dimodifikasi), kami mencetak dengan"world"
, dan menjalankan perintah yang tidak valida
. Ini memaksacatch
untuk berlaku, yang memungkinkan kita untuk memeriksa diri kita lagi. Kali ini, jika kode kami tidak sama dengan 97, kami melemparkan perintah yang tidak valid sehingga program kami memiliki kesalahan dan mencetak teks kesalahan ke output. Kami kemudianclear()
kesalahan danexit
biasanya.Sudah jelas bahwa jika salah satu
if
pernyataan dirusak, yang lain akan memiliki kesalahan. Jika ada bagian"world";
yang dirusak, yang pertamaif
akan menyebabkan kesalahan. Karena harus bersebelahan, kami tidak dapat menghapus keduaif
pernyataan. String di tengah akan menghasilkan kurung tidak cocok, atau akan menghasilkan yang kedua{a}
dieksekusi. Tandatry
/catch
adalah untuk menangkap kesalahan dariif
pernyataan pertama sehingga kita dapat menghapusnya dengan benar. Bagian luar"$( )"
mencegah string dari kedua ujungnya terpotong. Yang terakhir;a
adalah untuk mencegah bagian dari potongan terpotong yang akan menghasilkan program yang valid (misalnya"it}a)";a
, yang akan mencetakit}a)
dan kemudian kesalahan).Ada beberapa keadaan khusus:
gc
,gc<space>
ataugc .\
dihapus, program pada akhirnya akan error dengan beberapa rasa kesalahan memori (karena panggilan eksekusi diri berulang) dan kemungkinan crash shell (dan mungkin komputer). Tidak diuji.<space>.\c.ps1
atau.\c.ps1
dihapus, program akan berhenti dan meminta input pengguna. Tidak peduli apa yang dimasukkan pengguna, program masih akan error karena jumlah ukurannya akan salah.$
dan berakhir sebelum yang terakhir"
dipotong, program akan menampilkan apa pun yang tersisa dan kemudian kesalahan karenaa
tidak valid.Diverifikasi dengan yang berikut:
(Terima kasih kepada Martin untuk bantuannya yang luas!)
sumber
C (gcc) (Linux,
-Werror=undef
), 66 byteCobalah online!
Tantangan besar! Ini sangat sulit, tetapi saya cukup yakin saya memiliki program yang valid sekarang!
Menggunakan perintah preprocessor sehingga tidak ada baris baru yang dapat dihapus, karena braket penutup
main
hanya disertakan jika__LINE__==6
. Ini juga membuat Anda tidak hanya membersihkanmain
seluruhnya, karena itu membuat#endif
mengambang (jadi penting yang#endif
berada di luarmain
).Saya menggunakan
#else
karena aku sudah menjadi cukup yakin tidak ada versi__LINE__==6
yang tidak dapat memiliki substring dihapus dan masih menjadi kenyataan, karena keduanya6
dan__LINE__
dengan sendiri truthy. Itu juga menggunakan-Werror=undef
sehingga sesuatu seperti#ifdef(LINE__)
tidak mengevaluasi menjadi salah, tetapi merupakan kesalahan.Dengan gcc (di Linux, setidaknya),
puts
mengembalikan jumlah karakter yang dicetak (termasuk baris baru), jadi menghapus bagian mana pun dari string akanputs("...")/6
mengembalikan0
, sehingga1/0
menyebabkan pengecualian floating point. Perhatikan bahwa pengecualian ini tidak disebabkan kecuali1/0
ditugaskan untuk sesuatu, jadia=
diperlukan.Tidak ada bagian lain dari baris apa pun yang dapat dihapus tanpa membuat kesalahan, biasanya kesalahan sintaksis atau kesalahan penghubung.
Sebagai bonus, ini memberikan solusi 86 byte untuk C ++ cukup sepele, cukup tambahkan
#include <cstdio>
dan nyatakana
sebagaiint
. Cobalah online! (C ++)sumber
1/
sambil meninggalkan baris baru dan itu akan tetap berjalan .1
seharusnya pada baris sebelumnya saya percaya.=1
. Saya pikir Anda perlu menempatkan 1 pada garisnya sendiri.PHP, 73 byte
Penjelasan
Saya menganggap konfigurasi default php.ini. Jadi short_tags dinonaktifkan. Ini berarti Anda tidak dapat menghapus
=
dari tag pembuka.Ini pada dasarnya
<?=unserialize('s:5:"world"');
.Jika Anda menghapus bagian mana pun dari string serial, Anda akan mendapatkan kesalahan.
Anda cukup menghapus
unserialize
dan skrip hanya akan menampilkan string serial. Untuk mengatasi ini saya gunakancall_user_func
. Menghapus salah satu params akan menghasilkan kesalahan.Namun Anda dapat menghapus
un
, untuk memanggilserialize
fungsi. Jadi kami menghapus 'ns`. Menghapus karakter apa pun tidak akan menghasilkan nama fungsi yang salah.Kami akan menggunakan inline jika menggunakan penugasan variabel dengan tag output. Alih-alih menggunakan,
&&
kami menggunakan '|' untuk mencegah menghapus satu&
atau menghapus$f
tugasAnda dapat menghapus
='ns')&&($f="u{$p}erialize"
dan berakhir dengan($p)?$f:''
. Karenanya saya menambahkan tanda kurung tambahan di sekitar$f="u{$p}erialize"
.Catatan
Secara teknis Anda dapat menghapus tag pembuka tanpa menghasilkan kesalahan. Namun ini bukan lagi skrip PHP tetapi hanya file teks biasa.
sumber
Matlab (77)
Cobalah
catatan:
Mengikuti saran Pengoptimal @ merancang CPR atau sesuatu, saya dihadapkan pada substring yang tidak terduga yang tidak menyebabkan kesalahan kompilasi ketika dihapus, contoh: menghapus
arrayfun(@(x)a(x),prod(b,ismember(4,1:5))),
dari suntingan sebelumnyafeval(@(a)arrayfun(@(x)a(x),prod(b,ismember(4,1:5))),'world')
tidak menghasilkan bug! juga, untuk edisi yang sama baru-baru ini, adabsxfun(@(a,b)arrayfun(@(x)(x),prod(b,ismember(4,b))),'world',1:5)
danbsxfun(@(a,b)a,'world',1:5)
, jika Anda bertanya tentang bagaimana saya ketika menemukan mereka di konsol output saya, saya menangis seperti bayi, jadi inilah programnya:Contoh program nonpristine
sunting:
sumber
SmileBASIC, 63 byte
sumber
Pohon Pir , 17 byte
Program ini berisi byte dengan set bit tinggi (yang tidak valid UTF-8 dan karenanya tidak dapat diposting di TIO), jadi inilah
xxd
hexdump yang dapat dibalik:Penjelasan
Ini hanya
print'world'
dengan checksum yang ditambahkan. Saya telah diverifikasi oleh brute force bahwa tidak ada penghapusan yang mungkin memberikan program dengan checksum yang valid, sehingga Anda mendapatkan kesalahan setelah penghapusan yang mungkin.Cukup membosankan, tetapi mengikat pemimpin saat ini, jadi saya merasa itu layak posting.
sumber