Kesalahan 404: Karakter Tidak Ditemukan

74

Skenario

Salah satu teman Anda sedang berjuang dalam tugas pekerjaan rumah. Dia membutuhkan program sederhana yang mencetak 404 angka pertama:

1 2 3 4 5 6 7 8 9 10 11 ... 401 402 403 404

Tantangan Anda sederhana: tuliskan program ini untuknya.

Namun, koneksi Anda buruk, jadi 1 karakter acak hilang setiap kali Anda mengirim program. Untuk mencegah hal ini merusak program Anda, Anda harus membuatnya sehingga menghapus satu karakter tidak akan berpengaruh: program bekerja, apa pun itu. (Program aslinya juga harus bekerja.)

Karena koneksi terlalu buruk untuk mengirim file besar, kode Anda harus sesingkat mungkin.

TL: DR - buat program pengerasan radiasi untuk menampilkan angka 1 hingga 404


Aturan / Detail

  • Outputnya dapat berupa daftar bilangan bulat dalam format apa pun yang wajar (dipisahkan oleh spasi, baris baru, koma, dll). Namun, output Anda harus konsisten dan tidak berubah ketika program diubah.
  • Bendera baris perintah yang berisi logika, mengeksekusi kode aktual, menghasilkan daftar nomor, dan sebagainya, dilarang.
  • Ini adalah , jadi pengiriman terpendek (dalam byte) menang!
FlipTack
sumber
2
Terkait
FlipTack
16
Apakah program asli (tanpa karakter apa pun dihapus) juga perlu bekerja?
Adnan
5
Apakah kesalahan dapat diabaikan jika program masih mencetak 1-404?
jrich
4
Mungkin harus ada label seperti radiasi-pengerasan ?
Vi.
5
Voting untuk ditutup, kami tidak mengerjakan pekerjaan rumah Anda untuk Anda XD
チ ー ズ パ ン

Jawaban:

16

05AB1E , 12 byte

Kode:

XX440044ÔÔŸŸ

Penjelasan kode normal:

X             # Pushes the number 1.
 X            # Pushes the number 1 again.
  440044      # Pushes the number 440044.
        Ô     # Connected uniquify.
         Ô    # Connected uniquify.
          Ÿ   # Inclusive range of the top two elements.
           Ÿ  # Inclusive range on the array, which leaves it intact.

Ini mengarah pada kode golf berikut:, X404Ÿyang ingin kami capai.

Angka 404 dihasilkan oleh salah satu varian ini:

440044ÔÔ
40044ÔÔ
44044ÔÔ
44004ÔÔ
440044Ô

Rentang inklusif berfungsi sebagai berikut pada dua angka:

`1 5Ÿ`             ->    [1, 2, 3, 4, 5]
[1, 5]Ÿ            ->    [1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]Ÿ   ->    [1, 2, 3, 4, 5]

Yang selalu membuat kedua Ÿsebuah no-op .

Menggunakan pengkodean CP-1252 . Cobalah online!

Adnan
sumber
34

JavaScript, 228 byte

etInterval=stInterval=seInterval=setnterval=setIterval=setInerval=setIntrval=setInteval=setInteral=setIntervl=setInterva=top=>4

setInterval
`405>(i=this.i?i:1)?alert(i++):0`///`
setInterval
`405>(i=this.i?i:1)?alert(i++):0`///`

Penjelasan

Mengevaluasi kode dalam setIntervalmemungkinkan program untuk melanjutkan bahkan jika ada kesalahan. Kami memastikan bahwa kode yang dikirimkan akan kesalahan jika ada karakter tunggal yang dihapus. Sintaks string template dapat disalahgunakan untuk memanggil setIntervaldengan string konstan tanpa tanda kurung. Untungnya, bahkan jika string template ada di baris berikutnya, ia tetap diurai sebagai pemanggilan fungsi dengan sintaksis seperti itu.

Masalah pertama yang kita hadapi adalah bahwa itu setIntervaladalah fungsi, dan dengan demikian jika sebuah karakter dihapus dan program mencoba untuk memanggil setInteval, itu kesalahan keluar. Tentu saja, karena ada dua doa indentik setInterval, kita tidak perlu khawatir itu benar-benar berfungsi dengan benar selama kita menghindari kesalahan. Jadi, baris pertama mendefinisikan setiap kemungkinan "kesalahan ejaan" setTimeoutuntuk fungsi yang valid.

Baris pertama berfungsi dengan menugaskan semua "kesalahan ejaan" ini ke fungsi top=>4. Perhatikan sintaks ES6, ini hanya mengambil paramater bernama "top" dan mengembalikan 4. Mengapa "top"? Nah, baris pertama tidak boleh melempar kesalahan bahkan jika karakter dihapus. Jika suatu =dihapus untuk membuat top>4, ekspresi boolean ini akan valid karena topsudah ditentukan sebelumnya di browser, cukup menghasilkan false. Jika 4 dihapus, tubuh fungsi hanya menjadi setIntervalsegmen pertama , dan yang kedua berjalan tanpa cedera.

Sekarang, yang perlu dikhawatirkan adalah jika `dihapus.

Jika dihapus dari awal, setIntervaltidak melakukan apa-apa, mengevaluasi dirinya sendiri sebagai ekspresinya sendiri. Kemudian, sisa dari baris kedua hanya menjalankan satu iterasi dari loop, membiarkan setIntervalfragmen lainnya menyelesaikan pekerjaan. Jika dihapus dari akhir, backtick yang tersisa diambil dari akhir komentar.

Baris baru ditempatkan sehingga penghapusan satu tidak akan mempengaruhi perilaku program, tetapi mereka mencegah kesalahan dalam hal beberapa penghapusan karakter seperti backtick terkemuka.

Jrich
sumber
3
Saya merenungkan apa yang akan pecah jika salah satu digit dalam a 405dihapus, tetapi kemudian saya menyadari: tidak ada, karena semua nomor 404 sudah dicetak, atau loop kedua akan mencetak yang hilang. Karya spektakuler.
ETHproductions
Apa yang terjadi jika bagian dari "atas" hilang?
Scimonster
@Scimonster Masih mengurai sebagai fungsi, mengembalikan 4, hanya dengan parameter yang tidak digunakan bernama "to" atau "op" atau "tp"
jrich
1
@ tentu saja kaya. Kram otak. : P
Scimonster
Apa yang terjadi jika Anda kehilangan sebagian this?
dkudriavtsev
25

Pyth - 16 byte

Ide dasar di balik ini adalah bahwa ketika Anda melepas satu digit 404, itu hanya membuat angka lebih kecil, jadi kami hanya harus mendapatkan maksimum dua 404untuk memastikan kami memiliki nomor yang tepat. Jelas, ada banyak lagi redudansi.

SSsetSS[404  404

Penjelasan:

SS                       First one does 1-index range, second one sorts, which is no-op 
 s                       If the e is there, this is no-op, if only t is there, it sums a one element list, which is the item
  et                     e picks last element in list, and if e is gone, then t gets you the list without the first element which is good enough when combined with s
   SS                    Sorting twice is no-op
    [                    Start list, this can't be two element because if we get rid of initial 4, the 0 becomes third element which neeeds to be captured
     404                 One of the 404's
     <space><space>404   Need two spaces for redundancy, because 404404 *is* bigger than 404

Cobalah online di sini .

Maltysen
sumber
23

Befunge-98 , 37 byte

20020xx##;;11++::''ee44**``kk@@::..;;

Cobalah online!

Penjelasan

Membuat kode yang dikeraskan dengan radiasi di Befunge-98 tidak terlalu buruk, karena Anda dapat mengatur "delta" (yaitu ukuran langkah dari penunjuk instruksi) secara manual x. Jadi jika mengatur delta ke (2,0), sejak saat itu setiap karakter lain dilewati dan kita bisa menggandakan semua perintah. Yang sulit adalah mendapatkan 2 0di atas tumpukan dengan cara yang dapat diandalkan. Kita akan benar-benar membutuhkan 0 2 0sisa program untuk bekerja dengan benar, tetapi kita akan melakukannya secara gratis. Inilah cara kami melakukan ini:

20020xx

Perhatikan bahwa setiap digit mendorong dirinya sendiri, sehingga dalam program lengkap, akan ada awal 2 0yang hanya akan kita abaikan.

Akibatnya, menjatuhkan karakter pertama atau kedua dari program tidak relevan karena kita toh tidak akan menggunakan angka itu. Demikian juga, menghapus karakter ketiga identik dengan menghapus yang kedua, jadi kita tidak perlu khawatir tentang itu juga.

Mari kita perhatikan apa yang terjadi dalam dua kasus lainnya. Menjatuhkan karakter keempat:

2000xx

Perhatikan bahwa delta diatur ke (0,0). Tapi ini sama sekali tidak menggerakkan pointer instruksi, jadi hal yang sama xdieksekusi lagi dengan segera dan kali ini muncul (2,0)dan semuanya baik-baik saja (ada nol implisit di bagian bawah tumpukan untuk keperluan kita nanti).

Sebagai gantinya, lepaskan karakter kelima:

2002xx

Sekarang delta diatur ke (0,2). Namun, masih tidak ada gerakan horizontal, sehingga IP membungkus segera kembali ke xdan lagi, delta yang benar akan diatur.

Dari titik ini dan seterusnya kita pada dasarnya dapat mengabaikan duplikasi karakter serta bagian awal ini karena akan selalu dilewati:

...#;1+:'e4*`k@:.;

Ini ;adalah semacam perintah komentar yang melewatkan semuanya sampai yang berikutnya ;ditemui. Namun, kami melompati yang pertama ;dengan #hanya bagian di antara yang ;akan dieksekusi sejak saat itu.

1+    Increment the top of the stack.
:     Duplicate it.
'e    Push 101.
4*    Multiply by 4 to get 404.
`     Greater-than check. Pushes 1 once the top
      reaches 405, otherwise 0.
k@    Terminate the program that many times.
:.    Print a copy of the top of the stack (and a space).
Martin Ender
sumber
16

> <> , 103 60 51 byte

               vv
;?=*4o" e"n:ll<<
;?=*4o" e"n:ll<<

Diuji di sini.

Gunakan taktik yang sama dengan program ini . Jika sebuah karakter dihapus di baris pertama, baris ke-2 masih akan dijalankan. Jika karakter di baris ke-2 dihapus, maka veksekusi akan dipindahkan ke baris ke-3, karena baris ke-2 adalah karakter yang lebih pendek. Penghapusan di baris ke-3 tidak berpengaruh pada kontrol program, karena hanya eksekusi setelah penghapusan di baris 2.

Program ini juga akan berfungsi jika jeda baris dihapus:

Kasus 1:

Baris ke-2 akan dijalankan.

               vv;?=*4o" e"n:ll<<
;?=*4o" e"n:ll<<

Kasus 2:

Kedua baris menjadi satu baris dengan dua kali instruksi.

               vv
;?=*4o" e"n:ll<<;?=*4o" e"n:ll<<

Penjelasan:

Inti dari program ini adalah sebagai berikut. Perhatikan bahwa a 1didorong pada tumpukan yang sudah oleh baris pertama.

ll:n        Push length of the stack twice, duplicate, print as number
"e "o       Push 101, 32, output 32 as space
4*          101 * 4 is 404
=?;         Pop twice, if equal, halt
            (Execution wraps around)
mbomb007
sumber
Dapatkah Anda menggunakan o" e"?
Martin Ender
Dan bukannya +1Anda bisa menggunakannya l. Juga juru bahasa fishlanguage.com agak aneh (dan menjengkelkan untuk digunakan, meskipun fitur debugging tentu saja berguna). TIO menggunakan penerjemah Python yang agak lebih waras, saya pikir: tio.run/nexus/fish#@m9oqIAMysq4AMuxtrfVMslXUkhVssqzsrHBEPj/HwA
Martin Ender
@ MartinEnder Itu tidak berfungsi jika Anda menghapus salah satu dari 1s di baris pertama.
mbomb007
Ah benar, mereka memang mengganggu saya: tio.run/nexus/fish#@q@ACsrKuKztAbPVMslXUkhVysnLybGxwRD4/x8A
Martin Ender
12

> <> , 42 38 34 byte

Cobalah secara Online!

Terima kasih kepada @Martin Ender dan @Teal Pelican untuk mencukur 8 byte!

<<;?=*4o" e"lnll/
 ;?=*4o" e"lnll<

Mirip dengan jawaban mbomb007 , tetapi hanya menggunakan 2 baris.

Alih-alih menghitung dari 1 hingga 404 menggunakan nilai memori tunggal, saya terus mendorong panjang tumpukan. Ini membuatnya sehingga saya tidak perlu meletakkan apa pun di tumpukan sebelum loop dimulai, membuat segalanya jauh lebih mudah.

Kode asli

The <giliran IP sekitar, dan /adalah tidak-op, sebagai IP membungkus dan terus sepanjang jalan itu normal. Dengan demikian, kode yang relevan adalah:

          lnll   Prints the size of the stack + 1 and pushes the stack size twice
     o" e"       Prints a space and pushes 101
   *4            Multiplies to get 404
;?=              If the number we just printed was 404, end the program

Dan ini berulang.

Penghapusan

Kunci besar di sini adalah cermin /. Itu tidak melakukan apa-apa jika baris kedua diubah - hanya membungkus kembali ke dirinya sendiri dan pada dasarnya adalah no-op. Tetapi jika karakter dari baris pertama dihapus, garis akan bergeser ke bawah, sehingga cermin menyentuh panah <, mengarah ke loop identik dan tidak dimodifikasi.

Satu-satunya penghapusan signifikan lainnya adalah \nkarakter. Ini juga diperhitungkan, karena menghasilkan kode ini:

<<;?=*4o" e"lnll/ ;?)*4o" e"lnll<

Sekarang, kita baru saja menambahkan salinan dari loop asli ;?=*4o" e"lnllke dirinya sendiri. Karena ini adalah perulangan, tidak ada bedanya dengan eksekusi, dan berjalan seolah-olah tidak ada yang berubah.

MildlyMilquetoast
sumber
1
Cara yang sangat bagus untuk menguranginya menjadi 2 baris. Satu-satunya masalah yang bisa saya lihat adalah bukan 38 byte tetapi 42? Mengurangi kode dalam menjadi; ;? = * 4o "e": n: + 1l akan menguranginya hingga 38 byte. Ini hanya menempatkan 84 * Anda dalam string "e" alih-alih terpisah.
Teal pelican
1
Anda juga dapat mengganti :+1dan yang lain :dengan satu lmasing-masing.
Martin Ender
Ya terima kasih semuanya!
MildlyMilquetoast
;?=*4o" e"n:llbekerja juga.
mbomb007
11

Pohon Pir , 34 byte

Program ini berisi karakter kontrol, jadi inilah xxddump:

00000000: 7072 696e 7420 312e 2e34 3034 2327 108a  print 1..404#'..
00000010: af70 7269 6e74 2031 2e2e 3430 3423 2710  .print 1..404#'.
00000020: 8aaf                                     ..

Pear Tree pada dasarnya adalah turunan Perl, dengan beberapa fitur "menarik". Saya melemparkannya bersama sebagai lelucon (sehingga saya bisa mengatakan bahwa polyglot saya dicetak a partridgedi A Pear Tree; pada kenyataannya, hampir semua program melakukannya). Namun, Turing-lengkap, dan benar-benar bagus dalam tantangan semacam ini.

Fitur yang paling kami pedulikan di sini adalah A Pear Tree hanya akan menjalankan program jika beberapa substring dari kode memiliki CRC-32 00000000. Kode diputar untuk menempatkan substring tersebut di awal. Seperti yang terjadi, dua bagian (identik) dari kode masing-masing memiliki CRC-32 dalam pertanyaan (karena komentar biner yang mencurigakan di akhir), jadi jika Anda menghapus karakter dari sumber (melanggar CRC), separuh lainnya diputar ke awal dan #tanda di dekat akhir akan mengomentari setengah yang rusak, di samping sampah biner.

Fitur lain membuat program sedikit lebih kecil: meskipun A Pear Tree sebagian besar diartikan sebagai Perl, ia memiliki beberapa perubahan kecil untuk membuatnya bekerja lebih seperti Python. Salah satu yang relevan di sini adalah bahwa tidak seperti printpernyataan Perl (yang hanya menyatukan angka-angka), printpernyataan A Pear Tree memisahkan argumen dengan spasi dan mencetak baris baru akhir. Itu memberi kita hasil yang dipisahkan dengan baik, artinya kita tidak perlu membuang byte pada pemformatan. (Perhatikan bahwa Anda harus memberi program tidak ada input; jika bahasa menerima input, ia menganggap secara default bahwa ia seharusnya melakukan sesuatu dengannya.)

Tentu saja, ini tidak dapat bersaing dengan bahasa golf yang sebenarnya (saya juga tidak mengharapkannya), tetapi saya pikir orang mungkin menganggapnya menarik.


sumber
9

Melewati 98 , 34 byte

Cobalah secara Online!

<<.:@k`*4e':+1[

2.:@k`*4e':+1<^^j

Ini bekerja sangat mirip dengan jawaban >>> saya , tetapi alih-alih mirror /, saya menggunakan operasi belok kiri [dan kemudian membalikkan arah IP, yang secara fungsional setara dengan mirror dalam kasus ini.

Kode asli

<<                 Reverses code direction, sending IP to right
               [   Turns the IP left, into the ^, which reverses it.
                   It then hits this again, turning left to go West. (No-op)
            :+1    Adds 1 to the sum
        *4e'       Pushes 404
     @k`           Ends the program if (sum > 404)
   .:              Prints the sum

Penghapusan

Jika sesuatu di baris kedua dihapus, itu akan bergeser, dan tidak mempengaruhi bagian atas sama sekali.

Jika ada sesuatu di baris pertama dihapus, [akan mengirim IP ke <, yang memulai loop identik (dengan pengecualian 2j^^yang menghindari ^s digunakan bersama-sama dengan [)

Karena ada 2 baris baru, tidak ada bedanya dengan kode jika ada yang dihapus (terima kasih kepada @ masterX244 untuk ini!)

MildlyMilquetoast
sumber
apa yang terjadi pada baris kosong dalam kode ?. Mungkin Anda bisa menggandakan linefeed untuk membuatnya kebal juga
masterX244
Anda sepenuhnya benar @ masterX244 terima kasih! Tidak memikirkan itu.
MildlyMilquetoast
lol, tidak pernah menggunakan bahasa sama sekali tetapi karena alasan tertentu indra ke-6 memberi saya gagasan itu ...
masterX244
5

Befunge-93, 54 51 byte

Terima kasih kepada Mistah Figgins karena telah menyelamatkan saya 3 byte.

111111111111111vv
+1_@#-*4"e":.:<<
+1_@#-*4"e":.:<<

Cobalah online!

Ini pada dasarnya trik yang sama seperti yang digunakan dalam tantangan Hello World Fault-Tolerant . Baris pertama dimulai dengan memastikan ada 1 di atas tumpukan untuk memulai urutan, dan kemudian salah satu vpanah di ujung baris mengarahkan jalur kode ke awal rutinitas utama pada baris 2 , mengeksekusi dari kanan ke kiri.

Menghapus karakter dari baris pertama hanya akan menggeser vpanah melintas satu per satu, tetapi itu masih memungkinkan kode untuk mengarahkan ulang ke baris kedua dengan sukses. Menghapus karakter dari baris kedua menyebabkan <panah di ujung garis bergeser keluar dari jalur vdi atasnya, sehingga jalur kode akan diarahkan ke rutinitas cadangan di baris 3.

Menghapus jeda baris pertama tidak ada salahnya, karena itu hanya memindahkan baris ketiga ke tempatnya untuk menggantikan baris kedua. Dan menghapus apa pun setelah akhir baris kedua tidak akan berpengaruh, karena itu hanya kode cadangan.

James Holderness
sumber
The first line starts by making sure there is a 1 on the top of the stack...Baris pertama cukup yakin tentang hal itu. Anda juga dapat mempersingkat <code> _ @ #! </code> to _ @ # - `dan letakkan sebelum pencetakan untuk menghemat 3 byte.
MildlyMilquetoast
5

JavaScript + HTML + Stack Snippets, 167 158 154 byte

Menyalahgunakan fakta bahwa JavaScript dalam Stack Snippets ditempatkan di halaman web di dalam <script>elemen.

or(x="",i=405,d=document;--i;)d[i]||(x=d[i]=i+' '+x);d.write(x)</script></script><script>for(x="",i=405,d=document;--i;)d[i]||(x=d[i]=i+' '+x);d.write(x)

pengguna2428118
sumber
@ Flp.Tkc Diperbaiki.
user2428118
4

Sebenarnya , 18 byte

:404::404kMkMMRRSS

Sebenarnya adalah bahasa golf berbasis stack.

Penjelasan dari perintah yang terlibat (saat mereka bekerja dalam konteks di atas):

Numbers are indicated by round brackets () and lists by square brackets []

:         - pushes the longest string of characters in '0123456789+-.ij' as a numeric
k         - pop all the elements on the stack into a list [l] and push [l]
M         - pop [l], push max([l])
            pop (a), push (a)
R         - pop [l], push reverse([l])
            pop (a), push range([1,a])
S         - pop [a], push sorted([a])
Cobi
sumber