Memprogram Dunia yang Murni

87

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, `8telah 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 Worldatau EARTHtidak 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>

Hobi Calvin
sumber
1
@geokavel Ya. Menangkap pengecualian berarti ini bukan lagi kesalahan.
Calvin Hobbies
33
Dua kali lebih banyak jawaban yang dihapus sebagai tidak terhapus. Itu sebuah prestasi!
DLosc
1
Bisakah suatu program membaca kode sumbernya sendiri?
Shelvacu
2
Di mana melihat kuburan jawaban "dekat tapi tidak ada cerutu" dan komentar mereka?
Vi.
1
@ Vi. Dapatkan 2.000 rep sehingga Anda dapat melihat posting yang dihapus .
Gugatan IniBiru Tidak

Jawaban:

46

Rail , 24 byte

$'main'    #
 -[world]o/

Saya pikir ini berhasil. Dan itu pendek dan mudah dibaca (sejauh Rail pergi).

  • Jika substring dihapus termasuk setiap bagian dari $'main'kita Internal Error: Crash: No 'main' function found.
  • Jika substring yang dihapus termasuk #, tidak ada cara bagi program untuk keluar dengan bersih, sehingga akan selalu berakhir dengan Crash: No valid move. Saya percaya bahwa tidak mungkin untuk menghapus substring sedemikian rupa sehingga trek membentuk loop (tidak terbatas) yang valid.
  • Jika substring yang dilepas berada di depan, substring #akan terputus dari ujung lintasan, sehingga kereta akan menabrak (dengan kesalahan yang sama seperti di atas).
  • Jika substring yang dilepas adalah setelah #, 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:

$          #
 -[world]o/

The -dan /hanya potongan-potongan rel yang kita perlu membiarkan kereta mengambil orang-orang 45 ° bergantian.

[world]mendorong string worlddan omencetaknya. #menandai akhir dari trek - satu-satunya cara untuk menghentikan program Rail dengan aman.

Menariknya, solusi ini hanya mungkin karena Rail memungkinkan trek melewati maingaris - jika itu tidak mungkin #terjadi setelah baris baru pertama dan kode selalu dapat disingkat menjadi

$'main'
 #

yang 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 worlditu tidak akan jauh lebih pendek atau sederhana:

$'main'
 -[world]o#
Martin Ender
sumber
4
Bagaimana jika saya menghapus char di antara [dan]?
Martin Lütke
@ MartinLütke itu akan memutuskan sambungan /dari #.
Martin Ender
2
@ MartinLütke Anda tidak hanya dapat menghapus tanda kurung karena tidak berdekatan.
Hobi Calvin
Bagaimana jika menghapus baris baru di antara dua baris?
Vi.
1
@ Vi. Itu memutus hubungan $dari awal lintasan, sehingga kereta langsung mogok (Rail mengharapkan lintasan untuk melanjutkan Tenggara $).
Martin Ender
43

Funciton ( 186 136 bytes dalam UTF-16)

╔══════════════╗
║19342823075080╟
║88037380718711║
╚══════════════╝

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:

 ╔══════════════╗
|║19342823075080╟  (remove this whole line)
|║88037380718711║
 ╚══════════════╝
 ╔══════════════╗
 ║|19342823075080╟   ← substring starts at | here
 ║|88037380718711║   ← substring ends at | here
 ╚══════════════╝
... ↕ or anything in between these that removes a whole line’s worth ↕ ...
 ╔══════════════╗
 ║19342823075080|╟   ← substring starts at | here
 ║88037380718711|║   ← substring ends at | here
 ╚══════════════╝
 ╔══════════════╗
|║19342823075080╟
 ║88037380718711║  (both lines entirely)
|╚══════════════╝
 ╔══════════════╗
 ║19342823075080╟
|║88037380718711║  (remove this whole line)
|╚══════════════╝

Sebagian besar dari ini menghilangkan ujung menggantung di kanan atas kotak, yang merupakan konektor output. Tanpa ujung yang longgar ini, kotak hanyalah komentar:

╔══════════════╗
║88037380718711║
╚══════════════╝

Ini bukan lagi program yang valid karena parser mengharapkan program dengan tepat satu keluaran:

Kesalahan: File sumber tidak mengandung program (program harus memiliki output).

Satu-satunya kemungkinan yang meninggalkan konektor output adalah yang terakhir di atas, yang meninggalkan ini:

╔══════════════╗
║19342823075080╟
╚══════════════╝

Namun, nomor ini tidak menyandikan string Unicode yang valid di UTF-21 esoterik Funciton. Coba jalankan ini, Anda mendapatkan:

Pengecualian Tidak Tertangani: System.ArgumentOutOfRangeException: Nilai UTF32 yang valid adalah antara 0x000000 dan 0x10ffff, inklusif, dan tidak boleh menyertakan nilai-nilai codepoint pengganti (0x00d800 ~ 0x00dfff).

Karena itu, program ini masih asli.

Timwi
sumber
3
Saya merasa seperti Anda beruntung pada kasus terakhir (bukan karena mudah untuk secara tidak sengaja mendapatkan urutan Unicode yang valid, tetapi masih ...)
Esolanging Fruit
34

Visual C ++ - 96 95 byte

#include<iostream>
#define I(a,b)a<<b
int main()I({std::cout,I('w',I('o',I('r',I('l','d';)))))}

Properti:

  1. Anda tidak dapat menghapus bagian mana pun int main()tanpa kesalahan kompilasi.
  2. Anda tidak dapat menghapus modifikasi ekspansi makro sama sekali, menghapus asemua caramain() tidak pernah mendapat {, menghapus bsama sekali berarti baris kami tidak berakhir dalam ;, menghapus <cara std::cout<'w'menyebabkan kesalahan, dan menghapus <<penyebab std::cout'w', 'w''o', dll
  3. Anda tidak dapat menghapus parameter dari definisi makro atau doa, satu-satunya nama yang valid untuk definisi itu adalah I(a), I(b)yang tidak pernah cocok dan Imana yang diperluas sebelumnya (; di sisi lain menggunakan I(,penyebab <<<<, dan ,)menjatuhkan titik koma (kecuali ada kesalahan lain).
  4. Anda tidak dapat menghapus sebagian dari semuanya std::couttanpa berlari ke sebuah arahan <<, dan karena itu tidak dapat menghapus salah satu #include<iostream>di awal tanpa kesalahan kompilasi.
  5. Anda tidak dapat menghapus bagian mana pun dari karakter tunggal, ''memiliki kesalahan karakter kosong dan 'w,, dll ... mencoba membuat semuanya menjadi satu karakter.
  6. Anda tidak dapat menghapus sisi kiri / kanan makro tanpa meninggalkan terlalu banyak ) atau (di sisi lain, misalnya Anda tidak dapat melakukan hal-hal seperti I('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 clkompiler dari Visual C ++ 2010. Berharap saya repot-repot menulis ini lebih cepat:

#include <fstream>
#include <iostream>
char *S = "#include<iostream>\n#define I(a,b)a<<b\nint main()I({std::cout,I('w',I('o',I('r',I('l','d';)))))}";
//uncomment to print source code before compile
// #define prints
int main(){
   for(int i=0; i<95; i++)
      for(int j=i; j<95; j++){
         std::fstream fs;
         fs.open ("tmptst.cpp",std::fstream::out);
         for(int k=0; k<95; k++)
         if(k<i || k>j){
            fs << S[k];
            #ifdef prints
               std::cout<<S[k];
            #endif
         }
         fs.close();
         #ifdef prints
            std::cout<<'\n';
         #endif
         //Compile and surpress/pipe all output
         //if it doesn't compile we get a nonzero errorlevel (i.e.true) from system.
         if(!system("cl -nologo tmptst.cpp >x"))
            return 0;
      }
      std::cout<<"PRISTINE!";
}
Linus
sumber
1
Kami mencatat bahwa sementara ini masih asli pada kompiler ini, tidak demikian pada semua kompiler.
Joshua
1
Tolong beri contoh ....
Linus
3
Pada beberapa kompiler, program C ++ kosong menghasilkan program yang tidak melakukan apa-apa. Bergantung pada implementasi iostream, #include <iostream> mungkin juga dikompilasi.
Yosua
5
@ Yosua Hanya subprogram dengan panjang 1 atau lebih tinggi, jadi tidak relevan dengan apa yang dilakukan oleh program kosong.
ThisSuitIsBlackNot
2
@ Comintern, tidak juga. Jika Anda tidak mencentang kotak untuk menjalankan executable, /copsi 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".
Linus
32

Python 3, 79 33

if 5-open(1,'w').write('world'):a

open(1,'w')membuka output standar, lalu kami mencetak string. writemengembalikan 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 menyebabkan if-saya dieksekusi dan atidak 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:

try:
 q="print('world');r=None"
 if exec('e=q')==eval(q[17:]):exec(e)
finally:r

Untuk memverifikasi bahwa itu benar-benar program yang murni:

w=r'''try:
 q="print('world');r=None"
 if exec('e=q')==eval(q[17:]):exec(e)
finally:r'''
exec(w)
for j in range(1,len(w)):
 for i in range(len(w)+1-j):
  e=w[:i]+w[i+j:]
  try:exec(e,{});print('WORKED',e)
  except:pass

Beberapa poin penting:

  • Setiap pernyataan yang dieksekusi dapat dihapus. Memverifikasi yang qtelah dieksekusi memerlukan pernyataan di luar q. Itutry memecahkan yang baik, dengan mengharuskan setidaknya dua pernyataan, yang tidak dapat dihapus sepenuhnya.
  • Verifikasi yang qtelah dieksekusi terjadi dengan mengevaluasi rdi akhir.
  • Verifikasi yang qtidak dimodifikasi dicapai oleh eval(q[17:]), yang harus dievaluasi Noneuntukq untuk dieksekusi.
  • The ifKondisi ini agak sulit untuk mendapatkan hak. Untuk memastikan bahwa itu dievaluasi itu memiliki efek samping pengaturan yang bagus e, yang diperlukan untuk mengatur r. (Ini adalah alasan saya menggunakan Python 3, exprkarena suatu fungsi tidak heran untuk efek samping tingkat ekspresi.)
Philipp
sumber
Bukankah tantangan bahwa tidak ada penghapusan akan menghasilkan kesalahan sintaksis? Anda tampaknya memicu kesalahan runtime.
Martin Lütke
5
@ MartinLütke Semua jenis kesalahan baik-baik saja.
Hobi Calvin
1
Um, bukankah ini 79 byte?
The Matt
@TheMatt Ya? Saya hanya menghitungnya lagi dan Anda tampaknya benar. Mungkin lewat saya menghitung baris CRLF ... Memalukan. Terima kasih!
Philipp
25

Haskell, 61

x=uncurry(:)
main=putStr$x('w',x('o',x('r',x('l',x('d',[])))))

Apa jenis kesalahan apa-apa? Dalam hal itu:

Haskell, 39

main=putStr$take 5$(++)"world"undefined
Martin Lütke
sumber
Apakah ini berhasil jika Anda menghapus salah satu surat?
lirtosiast
Ini akan macet selama eksekusi. Karena itu akan berusaha mengevaluasi yang tidak terdefinisi.
Martin Lütke
Ini luar biasa. Evaluasi malas FTW, tampaknya!
DLosc
1
Saya berharap 'inits' ada di pembuka :(. Kemudian: main = putStr $ inits "world" !! 5 (27 bytes)
Martin Lütke
16

JavaScript, 74 73 35 byte

if((alert(a="world")?x:a)[4]!="d")x

Ternyata jawabannya jauh lebih sederhana dari yang saya kira ...

Penjelasan

if(
  (
    alert(a="world") // throws a is not defined if '="world"' is removed
        ?x           // throws x is not defined if 'alert' or '(a="world")' is removed
        :a           // throws a is not defined if 'a="world"' or 'a=' is removed
  )
  [4]!="d"           // if "world" is altered fifth character will not be "d"
                     // if 'd' is removed it will compare "world"[4] ("d") with ""
                     // if '[4]' is removed it will compare "world" with "d"
                     // if '(alert(a="world")?x:a)' is removed it will compare [4] with "d"
                     // if '?x:a' is removed [4] on alert result (undefined[4]) will error
                     // if '[4]!="d"' is removed the if will evaluate "world" (true)
                     // if '!', '!="d"' or '(alert...[4]!=' is removed the if will
                     //     evaluate "d" (true)
)x                   // throws x is not defined if reached

// any other combination of removing substrings results in a syntax error
pengguna81655
sumber
hapus semuanya kecuali a="world", jangan salah
anOKsquirrel
3
@anOKsquirrel Hanya satu substring yang dapat dihapus.
Dennis
4
Saya telah melalui ini seperti "Bisakah saya menghapus ini? Tidak, kesalahan ini akan terjadi. Bisakah ini dihapus? Yah, saya kira itu akan menyebabkan kesalahan lain ini. Aha! Karakter itu dapat dihapus! Oh, tunggu ..." +1
ETHproduksi
if(a="world")["bol"+a[4]]tidak salah.
anOKsquirrel
4
Astaga, sekarang dua kali lebih mengesankan! Seandainya saya bisa memberi +1 lagi ...
ETHproduksi
15

Java 8, 301 byte

Karena setiap pertanyaan membutuhkan jawaban Java.

class C{static{System.out.print(((((w='w')))));System.out.print((((o='o'))));System.out.print(((r='r')));System.out.print((l='l'));System.out.print(d='d');e=(char)((f=1)/((g=8)-C.class.getDeclaredFields()[h=0].getModifiers()));}public static void main(String[]a){}static final char w,o,r,l,d,e,f,g,h;}

Diperluas

class C {
    static {
        System.out.print(((((w = 'w')))));
        System.out.print((((o = 'o'))));
        System.out.print(((r = 'r')));
        System.out.print((l = 'l'));
        System.out.print(d = 'd');
        e = (char) ((f = 1) / ((g = 8) - C.class.getDeclaredFields()[h = 0].getModifiers()));
    }

    public static void main(String[] a) { }

    static final char w, o, r, l, d, e, f, g, h;
}

Penjelasan

  • public static main(String[]a){} diperlukan.
  • Jika deklarasi bidang dihapus (atau dibuat tidak statis), blok statis pertama tidak dapat menemukannya.
  • Jika blok statis dihapus (atau dibuat non-statis), bidang tidak diinisialisasi.

Bagian tersulit:

  • Jika finalkata kunci dihapus, baris kedua dievaluasi menjadi 1/(8-8), menyebabkan / by zeropengecualian.
Ypnypn
sumber
Mengapa Anda tidak bisa menghapus bagian dalam dari pernyataan cetak?
Nic Hartley
2
@QPaysTaxes Tidak ada System.out.print()metode kosong . Ada untuk println(), tetapi tidak untuk print(). Jadi, jika Anda akan menghapusnya d='d'akan memberikan The method print(boolean) in the type PrintStream is not applicable for the arguments ()kesalahan (Dan jika Anda akan menghapusnya d=akan memberikan The blank final field d may not have been initializedkesalahan).
Kevin Cruijssen
15

Funciton , 143 142 136 byte

Skor dalam UTF-8 seperti biasa, karena UTF-16 akan dua byte lebih besar (karena BOM).

╔══════════╗
║1934282307║╔╗
║5080880373╟╚╝
║80718711  ║
╚══════════╝

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:

  • Kami tidak mungkin menghapus baris ketiga, karena kami akan menghapus konektor output.
  • Jika kita menghapus baris kedua, blok komentar kehilangan tepi atasnya dan putus.

Itu menyisakan dua opsi (terima kasih kepada Steve karena menunjukkannya):

  • Hapus baris keempat. Yang meninggalkan kedua kotak dengan bijaksana. Namun, ketika bilangan bulat yang dihasilkan19342823075080880373 diterjemahkan, string yang sesuai akan berisi titik kode 0x18D53Byang bukan karakter Unicode yang valid, System.Char.ConvertFromUtf32lumpuh dengan ArgumentOutOfRangeException.
  • Hapus garis penuh mulai dari sudut kanan atas. Sekali lagi, kedua kotak dibiarkan dalam kebijaksanaan, tetapi bilangan bulat yang dihasilkan508088037380718711 akan berisi dua poin kode yang tidak valid 0x1B0635dan 0x140077, 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 193428037380718711misalnya, yang tidak akan menyebabkan kesalahan.

Martin Ender
sumber
Apa yang terjadi jika Anda menghapus substring dimulai dengan karakter setelah konektor output dan menyelesaikan tepat 1 baris kemudian? yaitu menghapus garis tengah dari blok komentar dan baris yang mengandung "80718711" di blok utama, tetapi membiarkan sudut kedua kotak tetap utuh.
Steve
@ Seve Saya telah mengubah jawaban untuk menutupi kasus itu. Setelah melihat lebih dalam lagi, ini sebenarnya memungkinkan saya untuk menyimpan dua karakter / enam byte.
Martin Ender
10

Ruby, 36

eval(*[(s="planet")[$>.write(s)^6]])

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 mengiris sdengan indeks itu. Hanya karakter ke-0 dari s, "p", adalah string kode yang valid (no-op). Kami meneruskannya ke eval, 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

histokrat
sumber
Omong kosong Ini luar biasa.
bertepuk tangan
Apa yang terjadi jika Anda menghapus *?
LegionMammal978
Kemudian Anda melewatkan array untuk eval alih-alih string, yang merupakan ArgumentError.
histokrat
9

C #, 128 118 101 byte

Berpikir untuk menyalahgunakan aturan substring yang berdekatan.

Kode

class h{static void Main()=>System.Console.Write(new char[1
#if!i
*5]{'w','o','r','l','d'
#endif
});}

Mengapa Ini Bekerja?

  1. class hdan static void Main()wajib diisi.
  2. Menghapus salah satu karakter 'w','o','r','l','d'menyebabkan kesalahan karena array char diinisialisasi dengan panjang 1*5.
  3. Anda tidak dapat menghapus konten di dalam Main () tanpa melanggar aturan karakter yang berdekatan karena bagian-bagian dipisahkan oleh preprocs. (Lihat di bawah)

Sebelum Golf dan Pemisahan

class h
{
    static void Main() =>
        System.Console.Write(new char[1 * 5]{'w','o','r','l','d'});
}

Diverifikasi dengan

https://ideone.com/wEdB54

SUNTING:

  • Menyimpan beberapa byte dengan menggunakan #if !xalih-alih#if x #else .
  • =>Sintaks func yang digunakan . #if!xdari pada#if !x . Kredit ke @JohnBot.
  • Karena =>sintaks func, kondisi preproc ekstra dapat dihapus.
Helix Quar
sumber
Hai helix! Apakah Anda pikir Anda bisa menjelaskan bagaimana dan mengapa jawaban Anda bekerja sedikit lebih?
isaacg
@isaacg Diedit. Bukti untuk diikuti.
Helix Quar
Aku tidak bisa mendapatkannya untuk berjalan tanpa staticdi Main.
Johnbot
@ Johnbot Ya. Pasti salah pilih. Tetap.
Helix Quar
Anda dapat menyimpan karakter dengan membuat Mainsebuah 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.
Johnbot
9

MATLAB, 37 36 33 byte

feval(@disp,reshape('world',1,5))

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

reshape('world',1,5)
slvrbld
sumber
saya benar-benar harus belajar lebih banyak tentang fungsi-fungsi
bawaan
2
Itu benar-benar tergantung pada seberapa ketat aturannya. Mereka menyatakan bahwa hanya 'world' (+ opsional trailing newline) yang harus dicetak, jadi 33 byte.
slvrbld
Ya, kami akan menghitung ini sebagai 33. Terima kasih atas pengertiannya :)
Calvin's Hobbies
9

> <> , 17 byte

e"ooooo7-c0pBhtra

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 menggunakan pperintah untuk memodifikasi program untuk dimasukkan ;selama eksekusi. Menghapus bagian mana pun dari kode menyebabkan ;tidak pernah diproduksi yang menyebabkan kesalahan melalui instruksi yang tidak valid B, hdant , 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:

code = 'e"ooooo7-c0pBhtra'
count = {"invalid":0, "underflow":0, "memory":0}
for l in range(1, len(code)):
    for x in range(0, len(code)-l+1):
        print(code[:x] + code[x+l:], "\t\t", end='')
        try:
            interp = Interpreter(code[:x]+code[x+l:])
            for _ in range(0,1000):
                interp.move()
            print(len(interp._stack), "< ", end='')
            interp2 = Interpreter(code[:x]+code[x+l:])
            for _ in range(0,2000):
                interp2.move()
            print(len(interp2._stack))
            count["memory"] += 1
        except Exception as e:
            print(e)
            if str(e) == "pop from empty list": count["underflow"] += 1
            else: count["invalid"] += 1
print(count) 
#don't judge me

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-c0pAhtramemiliki beberapa sub-program aneh yang berhasil menggunakan perintah put ke tempat [yang akan menghapus tumpukan, di tempat instruksi yang tidak valid A. Juga, "earth" adalah satu-satunya frasa yang akan bekerja dengan metode ini, karena huruf pertama, eadalah instruksi yang valid di ><>. Kalau tidak, "perintah harus ditempatkan di depan program, dan subprogram yang valid bisa saja "dengan sendirinya.

Jo King
sumber
8

Ruby, 34

eval(*[($>.write("world")-1).chr])

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 memanggil methoddengan nilai arrsebagai argumen. Alasan ini diperlukan di sini adalah karena ini hanya valid sebagai parameter untuk suatu metode, sehingga jika evaldihapus, (*[expr])adalah kesalahan sintaksis. Jika expr dihapus, evalmengeluh tentang tidak memiliki cukup argumen

$>.write("world")-1tidak 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 -1dihapus atau string dipendekkan) maka akan mengembalikan satu dari -1,0,1,2,3, atau 5 . Kerusakan lainnya menghasilkan kesalahan sintaksis.

Memanggil chrnomor 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 \x04sebagai karakter spasi, yang berarti ungkapan itu valid (program ruby ​​kosong tidak melakukan apa-apa). Namun, salah satu karakter lain ( \x00- \x03dan \x05) menghasilkan Invalid char '\x01' in expression. Saya menemukan ini dengan hanya mengulangi kemungkinan matematika yang bisa saya lakukan untuk nomor yang dikembalikan. Sebelumnya saya pernah menggunakan

$>.write("planet
")*16

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


Sebutan 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"*5menghasilkan 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:

s = 'eval(*[($>.write("world")-1).chr])'
puts s.size
(1...s.length).each do |len| #how much to remove
  (0...len).each do |i| #where to remove from
    to_test = s.dup
    to_test.slice!(i,len)
    begin #Feels so backwards; I want it to error and I'm sad when it works.
      eval(to_test)
      puts to_test
      puts "WORKED :("
      exit
    rescue SyntaxError
      #Have to have a separate rescue since syntax errors
      #are not in the same category as most other errors
      #in ruby, and so are not caught by default with 
      #a plain rescue
    rescue
      #this is good
    end
  end
end
Shelvacu
sumber
Penjelasan di sepanjang baris jawaban histokrat akan menyenangkan. Sepertinya Anda menggunakan pendekatan dasar yang sama, tetapi karena saya tidak tahu Ruby, saya tidak bisa memahami detailnya.
ThisSuitIsBlackNot
@ ThisSuitIsBlackNot Tidak melakukan yang terbaik, apa pun yang tidak Anda mengerti?
Shelvacu
Penjelasan yang bagus, terima kasih!
ThisSuitIsBlackNot
6

Python 3 , 43 byte

for[]in{5:[]}[open(1,"w").write("world")]:a

Cobalah online!

Bagaimana itu bekerja

Untuk melindungi dari penghapusan substring, kami menggunakan open(1,"w").writesebagai ganti print. Dalam Python 3, writemengembalikan jumlah karakter tertulis, yang akan kami verifikasi adalah 5untuk memastikan bahwa tidak ada bagian dari string yang dihapus. Kami melakukan ini dengan mencari nilai kembali dalam kamus {5:[]}, dan mengulang hasilnya for[]in…:a, yang akan gagal jika kami tidak mendapatkan iterable kosong atau jika forpernyataan dihapus.

Anders Kaseorg
sumber
4

Javascript (Node.js), 93 95 byte

if(l=arguments.callee.toString().length,l!=158)throw l;console.log("world");if(g=l!=158)throw g

Periksa 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

Naouak
sumber
4

Perl 5.10+, 71 63 byte

(${open 0;@{\(read(0,$a,63)!=63?die:@_)};say"world"});{$a//die}

Mencetak worlddengan baris baru yang tertinggal. Jalankan seperti ini:

perl -M5.010 file

Ini bergantung pada jumlah byte dari kode sumber, jadi fileharus berisi kode di atas dan tidak ada yang lain (tidak ada shebang, tidak ada trailing newline). Perl 5.10+ diperlukan untuk saydan operator yang ditentukan atau //.


Sangat sulit untuk membuat program murni dengan Perl, karena:

  • Identifier bareword (misalnya foo, a, _) adalah pernyataan yang sah dengan no 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 (misalnya say"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 readeksekusi 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 diediubah (untuk d, e, di, de, atau ie, yang semua pengidentifikasi valid), cek panjang menjadi:

@{\(read(0,$a,63)!=63?di:@_)};

yang mengevaluasi ke:

@{\'di'};

Ini mengambil referensi ke string dan mencoba untuk mengubah referensi sebagai array, menghasilkan kesalahan:

Not an ARRAY reference

Jika ada pernyataan lain yang diubah, pemeriksaan panjang akan gagal dan program akan mati.


Diverifikasi murni dengan program berikut:

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

use File::Temp;
use List::MoreUtils qw(uniq);

sub delete_substr {
    my ($str, $offset, $len) = @_;

    my $tmp = $str;
    substr($tmp, $offset, $len) = '';

    return $tmp;
}

sub generate_subprograms {
    my ($source) = @_;

    my $tot_len = length $source;
    my @subprograms;                                             

    foreach my $len (1 .. $tot_len - 1) { 
        foreach my $offset (0 .. $tot_len - $len) {
            push @subprograms, delete_substr($source, $offset, $len);
        }                                                        
    }                                                            

    return uniq @subprograms;                                    
}                                                                

chomp(my $source = <DATA>);                                                                                                       
my $temp = File::Temp->new;                                                                                        

foreach my $subprogram ( generate_subprograms($source) ) {       
    print $temp $subprogram;

    my $ret = system(qq{/usr/bin/perl -M5.010 $temp > /dev/null 2>&1});
    say($subprogram), last if $ret == 0;

    truncate $temp, 0;
    seek $temp, 0, 0;
}

__DATA__
(${open 0;@{\(read(0,$a,63)!=63?die:@_)};say"world"});{$a//die}
IniSuitIsBlackNot
sumber
4

Ruby + coreutils, 33 27 26 byte

`base#{$>.write"world
"}4`

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

system("base" + (STDOUT.write("world\n")).to_s + "4")

IO#writemengembalikan 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 satu base04melalui base54akan 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(*[(s="ec%co earth")%s[10]])

execMengganti proses ruby ​​saat ini dengan perintah yang ditentukan. Lihat jawaban saya yang lain untuk penjelasan tentang meth(*[])sintaks dan kebutuhannya.

(s="ec%co earth")menetapkan string "ec% co earth" ke variabel s. Tugas mengembalikan apa yang ditugaskan, sehingga string juga dikembalikan.

"format string %d" % 5adalah gula sintaksis untuk sprintf("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, jadi s[10]kembali nil, dan "%c" % nilmenyebabkan kesalahan.

jika %s[10]dihapus, maka ruby ​​mencoba menjalankan perintah ec%co earthyang tidak berfungsi.

Mengubah 10ke 1atau 0juga menghasilkan perintah yang tidak dikenal (salah satu eceoatau ecco). 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 valid
  • exec(*[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

Shelvacu
sumber
Pendekatan keren! Anda dapat (dan karena itu harus) menghapus ruang antara writedan awal string, tapi saya tidak berpikir itu mempengaruhi keaslian. Juga, di komputer saya base64akan menunggu input, yang mungkin melanggar aturan.
histokrat
@ histokrat Wow, saya terkejut bahwa itu $>.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.
Shelvacu
3

PowerShell, (97 byte + 5 untuk nama program) = 102 Bytes

"$(try{if(($a=(gc .\c.ps1).Length)-eq97){"world";a}}catch{if($a-ne97){a}$error.clear();exit}a)";a

Cek sendiri sebelum rusak sendiri ... dua kali.

Mengharapkan untuk disimpan sebagai c.ps1dan dilaksanakan dari direktori lokal seperti:
PS C:\Tools\Scripts\Golfing\> .\c.ps1.

Alias gcadalah kependekan dari Get-Contentdan mirip dengan catmembaca file (dalam hal ini, jalur eksekusi kami .\c.ps1). Kami mendapatkan .Lengthfile, 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 valid a. Ini memaksa catchuntuk 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 kemudian clear()kesalahan dan exitbiasanya.

Sudah jelas bahwa jika salah satu ifpernyataan dirusak, yang lain akan memiliki kesalahan. Jika ada bagian "world";yang dirusak, yang pertama ifakan menyebabkan kesalahan. Karena harus bersebelahan, kami tidak dapat menghapus kedua ifpernyataan. String di tengah akan menghasilkan kurung tidak cocok, atau akan menghasilkan yang kedua {a}dieksekusi. Tanda try/ catchadalah untuk menangkap kesalahan dari ifpernyataan pertama sehingga kita dapat menghapusnya dengan benar. Bagian luar "$( )"mencegah string dari kedua ujungnya terpotong. Yang terakhir ;aadalah untuk mencegah bagian dari potongan terpotong yang akan menghasilkan program yang valid (misalnya "it}a)";a, yang akan mencetak it}a)dan kemudian kesalahan).

Ada beberapa keadaan khusus:

  • Jika gc, gc<space>atau gc .\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.
  • Jika <space>.\c.ps1atau .\c.ps1dihapus, program akan berhenti dan meminta input pengguna. Tidak peduli apa yang dimasukkan pengguna, program masih akan error karena jumlah ukurannya akan salah.
  • Jika substring mulai dari $dan berakhir sebelum yang terakhir "dipotong, program akan menampilkan apa pun yang tersisa dan kemudian kesalahan karena atidak valid.

Diverifikasi dengan yang berikut:

$x='"$(try{if(($a=(gc .\c.ps1).Length)-eq97){"world";a}}catch{if($a-ne97){a}$error.clear();exit}a)";a'
$yy='"$(try{if(($a=( .\c.ps1).Length)-eq97){"world";a}}catch{if($a-ne97){a}$error.clear();exit}a)";a'
$yyy='"$(try{if(($a=(.\c.ps1).Length)-eq97){"world";a}}catch{if($a-ne97){a}$error.clear();exit}a)";a'
$yyyy='"$(try{if(($a=(c.ps1).Length)-eq97){"world";a}}catch{if($a-ne97){a}$error.clear();exit}a)";a'

for($i=1;$i-lt$x.Length;$i++){
  for($j=0;$j-lt($x.Length-$i);$j++){
    $y=($x[0..$j]+$x[($i+$j+1)..$x.Length])-join''
    $y>.\c.ps1
    $error.clear()
    if(!($y-in($yy,$yyy,$yyyy))){try{.\c.ps1}catch{};if(!($error)){exit}}
    $q++;
    write-host -n "."
    if(!($q%150)){""}
  }
}
"No success."

(Terima kasih kepada Martin untuk bantuannya yang luas!)

AdmBorkBork
sumber
3

C (gcc) (Linux, -Werror=undef), 66 byte

main(a){a
=
1
/
(puts("world")/
6);
#if(7^__LINE__)
#else
}
#endif

Cobalah 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 mainhanya disertakan jika __LINE__==6. Ini juga membuat Anda tidak hanya membersihkan mainseluruhnya, karena itu membuat #endifmengambang (jadi penting yang #endifberada di luar main).

Saya menggunakan #elsekarena aku sudah menjadi cukup yakin tidak ada versi __LINE__==6yang tidak dapat memiliki substring dihapus dan masih menjadi kenyataan, karena keduanya 6dan __LINE__dengan sendiri truthy. Itu juga menggunakan -Werror=undefsehingga sesuatu seperti #ifdef(LINE__)tidak mengevaluasi menjadi salah, tetapi merupakan kesalahan.

Dengan gcc (di Linux, setidaknya), putsmengembalikan jumlah karakter yang dicetak (termasuk baris baru), jadi menghapus bagian mana pun dari string akan puts("...")/6mengembalikan 0, sehingga 1/0menyebabkan pengecualian floating point. Perhatikan bahwa pengecualian ini tidak disebabkan kecuali 1/0ditugaskan untuk sesuatu, jadi a=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 nyatakan asebagai int. Cobalah online! (C ++)

Chris
sumber
Kecuali saya salah, Anda dapat menghapus 1/sambil meninggalkan baris baru dan itu akan tetap berjalan .
gastropner
@gastropner Benar Anda. 1seharusnya pada baris sebelumnya saya percaya.
Chris
Sayangnya, hal yang sama berlaku. Anda kemudian dapat menghapus =1. Saya pikir Anda perlu menempatkan 1 pada garisnya sendiri.
gastropner
@ropropner Saya pikir Anda benar. Saya akan melihat lagi nanti. Terima kasih!
Chris
2

PHP, 73 byte

<?=call_user_func(($p='ns')|(($f="u{$p}erialize"))?$f:'','s:5:"world"');

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 unserializedan skrip hanya akan menampilkan string serial. Untuk mengatasi ini saya gunakan call_user_func. Menghapus salah satu params akan menghasilkan kesalahan.

'<?=call_user_func('unserialize','s:5:"world"');

Namun Anda dapat menghapus un, untuk memanggil serializefungsi. Jadi kami menghapus 'ns`. Menghapus karakter apa pun tidak akan menghasilkan nama fungsi yang salah.

<?=call_user_func(($p='ns')&&($f="u{$p}erialize")?$f:'','s:5:"world"');

Kami akan menggunakan inline jika menggunakan penugasan variabel dengan tag output. Alih-alih menggunakan, &&kami menggunakan '|' untuk mencegah menghapus satu &atau menghapus $ftugas

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

Jasny - Arnold Daniels
sumber
2
Tentang catatan terakhir Anda, file teks biasa masih akan menjadi program PHP yang valid, kan? Jadi saya tidak yakin ini valid.
Hobi Calvin
Bukan lagi PHP, melainkan plaintext / html, jadi bukan lagi program php-valid
Martijn
1

Matlab (77)

bsxfun(@(c,b)arrayfun(@(x)getfield(c,{x}),conv(b,ismember(4,b))),'world',1:5)

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 sebelumnya feval(@(a)arrayfun(@(x)a(x),prod(b,ismember(4,1:5))),'world') tidak menghasilkan bug! juga, untuk edisi yang sama baru-baru ini, ada bsxfun(@(a,b)arrayfun(@(x)(x),prod(b,ismember(4,b))),'world',1:5)dan bsxfun(@(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:

b=0;string='bsxfun(@(c,b)arrayfun(@(x)getfield(c,{x}),conv(b,ismember(4,b))),''world'',1:5)'
for u=1:numel(string),for j=u:numel(string)-2,try a=eval([string(1:u) string(j+2:end)]);catch(b); a=0;end; if a~=0, ['here is it : ' string(1:u) string(j+2:end)],end;end;end

Contoh program nonpristine

sunting:

Terima kasih kepada semua orang di samping @Martin karena menunjukkan kode saya sebelumnya (bukan kesalahan).

Abr001am
sumber
1

SmileBASIC, 63 byte

REPEAT
A=1/(PRGSIZE(0,1)==63)?"world
UNTIL 1/(PRGSIZE(0,1)==63)
12Me21
sumber
1

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 xxdhexdump yang dapat dibalik:

00000000: 7072 696e 7427 776f 726c 6427 23cd 4290  print'world'#.B.
00000010: bf                                       .

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.

ais523
sumber