Hata 404: Karakter Bulunamadı


74

senaryo

Arkadaşlarından biri bir ev ödevi için mücadele ediyor. İlk 404 doğal sayıyı basan basit bir programa ihtiyacı var:

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

Buradaki zorluk çok basit: Bu programı onun için yaz.

Ancak bağlantınız korkunç, bu nedenle programı her gönderdiğinizde 1 rastgele karakter kayboluyor. Bunun programınızı kırmasını önlemek için, herhangi bir tek karakteri kaldırmanın bir etkisi olmayacak şekilde yapmalısınız : program ne olursa olsun çalışır. (Orijinal program da çalışmalıdır.)

Bağlantı, büyük dosyalar göndermek için çok zayıf olduğundan, kodunuz mümkün olduğu kadar kısa olmalıdır.

TL: DR - 1 - 404 arası sayıları çıkarmak için radyasyonla sertleştirilmiş bir program yapın


Kurallar / Detaylar

  • Çıktı, herhangi bir makul formatta bir tamsayı listesi olabilir (boşluklarla, yeni satırlarla, virgüllerle vb. Ayrılır). Ancak, çıktınız tutarlı olmalı ve program değiştirildiğinde değiştirilmemelidir.
  • Mantık içeren, gerçek kodu çalıştıran, sayı listesini oluşturan vb. Komut satırı bayrakları yasaklandı.
  • Bu , bu yüzden en kısa teslim (bayt cinsinden) kazanır!


16
Orijinal program (karakter kaldırılmış olmadan) da çalışmak zorunda mı?
Adnan,

5
Program hala 1 - 404 yazdırırsa hatalar göz ardı edilebilir mi?
Jrich,

4
Belki de radyasyona zorlayıcı bir etiket olmalı ?
Vi.

5
Kapatmak için oy verin, ödevinizi sizin için yapmıyoruz XD
チ ー ズ パ ン

Yanıtlar:


16

05AB1E , 12 bayt

Kod:

XX440044ÔÔŸŸ

Normal kod açıklaması:

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.

Bu, aşağıdaki golf koduna yol açar: X404Ÿbu, elde etmek istediğimiz şeydir.

404 sayısı bu varyantların herhangi biri tarafından üretilir:

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

Kapsayıcı ürün yelpazesi aşağıdaki gibi çalışır:

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

Hangi hep ikinci kılan Ÿbir no-op .

CP-1252 kodlamasını kullanır . Çevrimiçi deneyin!


34

JavaScript, 228 bayt

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`///`

açıklama

Bir kod içinde kodun değerlendirilmesi setInterval, bir hata olsa bile programın devam etmesini sağlar. Tek bir karakter silinirse, iletilen kodun hata verdiğinden emin oluruz. Şablon dizesi sözdizimi, setIntervalparantez içermeyen sabit bir dizeyle çağrılmak için kötüye kullanılabilir . Neyse ki, şablon dizgisi bir sonraki satırda olsa bile, yine de bu sözdizimine sahip bir işlev çağrısı olarak ayrıştırır.

Karşılaştığımız ilk sorun, bu setIntervalbir işlevdir ve bu nedenle bir karakter kaldırılır ve program setIntevalbunun yerine çağırmaya çalışırsa , hata verir. Tabii ki, iki girintili çağrı olduğu için setInterval, hatadan kaçındığımız sürece, gerçekten doğru çalışması konusunda endişelenmemize gerek yok. Bu nedenle, ilk satır setTimeoutgeçerli bir fonksiyonun olası her "yanlış yazımını" tanımlar .

İlk satır, bu "yanlış yazımların" tümünü fonksiyona atayarak çalışır. top=>4 . ES6 sözdizimini not edin, bu sadece "top" adında bir paramater alır ve 4 değerini döndürür. Neden "top"? İlk satır, bir karakter kaldırılsa bile hiçbir zaman hata atmamalıdır. Bir =yapmak için kaldırılırsa top>4, bu boole ifadesi toptarayıcılarda önceden tanımlandığından geçerli olacak şekilde geçerli olacaktır false. 4 çıkarıldığında, işlev gövdesi yalnızca ilk setIntervalsegment haline gelir ve ikincisi zarar görmeden çalışır.

Şimdi endişelenecek tek şey bir `kaldırılmış mı '.

Baştan çıkarılırsa setInterval, hiçbir şey yapmaz, kendini kendi ifadesi olarak değerlendirir. Ardından, ikinci satırın geri kalanı basitçe döngünün tek bir yinelemesini çalıştırır ve diğer setIntervalparçanın işi bitirmesine izin verir . Sontan kaldırılırsa, kalan geri tepme yorumun sonundan alınır.

Yeni satırlar, kaldırmanın program davranışını etkilemeyeceği şekilde yerleştirilir, ancak öndeki geriye doğru hareket gibi bazı karakter kaldırmaları durumunda hataları önler.


3
Bir rakamdaki rakam 405çıkarıldıysa kırılacak şeyin ne olduğunu düşündüm, ama sonra farkettim ki: hiçbir şey, çünkü 404 sayının tamamı zaten basıldı ya da ikinci döngü eksik olanları yazdıracak. Muhteşem iş.
ETHProductions

"Top" un bir kısmı kaybolursa ne olur?
Scimonster

@Scimonster Halen "geri" ya da "op" ya da "tp" adlı kullanılmamış parametresiyle 4 döndüren bir işlev olarak ayrıştırıyor
jrich

1
Tabii ki. Beyin krampı. : P
Scimonster

Bir kısmını kaybedersen ne olur this?
dkudriavtsev

25

Pyth - 16 bayt

Bunun arkasındaki temel fikir, bir rakamı çektiğinizde 404sadece sayıyı daha küçük hale getirmesidir, bu yüzden 404doğru sayıya sahip olduğumuzdan emin olmak için en fazla iki rakamı elde etmemiz gerekir. Açıkçası, daha fazla işten çıkarma var.

SSsetSS[404  404

Açıklama:

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

Burada çevrimiçi deneyin .


23

Befunge-98 , 37 bayt

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

Çevrimiçi deneyin!

açıklama

Befunge-98'de radyasyonla sertleştirilmiş kod yapmak çok kötü değil , çünkü "delta" yı (yani, işaretçinin adım boyutunu) manuel olarak ayarlayabilirsiniz x. Eğer deltayı ayarlarsanız, (2,0)o zamandan itibaren diğer her karakter atlanır ve tüm komutları ikiye katlayabiliriz. İşin zor yanı, 2 0yığının üstüne güvenilir bir şekilde yaklaşmak. Aslında 0 2 0programın geri kalanının doğru çalışması için ihtiyacımız olacak, ancak bunu ücretsiz olarak yapacağız. İşte bunu nasıl yapıyoruz:

20020xx

Her basamağın kendisini ittiğine dikkat edin, bu nedenle tam programda bir başlangıç ​​olacaktır. 2 0 basitçe görmezden .

Sonuç olarak, programdan birinci veya ikinci karakteri bırakmak önemsizdir çünkü bu rakamları bir daha kullanmayacağız. Aynı şekilde, üçüncü karakteri çıkarmak, ikinciyi kaldırmakla aynıdır, bu yüzden endişelenmemize gerek yoktur.

Diğer iki durumda ne olacağını düşünelim. Dördüncü karakteri bırakmak:

2000xx

Delta'nın ayarlandığını unutmayın (0,0). Ancak bu komut göstergesini hiç oynatmaz, bu yüzden aynı xişlem derhal tekrar gerçekleştirilir ve bu süre açılır.(2,0) hepsi ve her şey .

Bunun yerine beşinci karakteri bırakalım:

2002xx

Şimdi delta ayarlandı (0,2). Ancak, hala yatay bir hareket yok, bu yüzden IP hemen gerix tekrar ve doğru delta ayarlanır.

Bu noktadan itibaren temelde karakter çoğaltmasını ve bu ilk parçayı yok sayabiliriz çünkü her zaman atlanır:

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

Bir ;sonraki ;ile karşılaşılana kadar her şeyi atlayan bir tür yorum komutudur . Bununla birlikte, birinciden atlayacağız ;, #bu nedenle yalnızca ;irade arasındaki kısım o noktadan itibaren yürütülecektir.

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

16

> <> , 103 60 51 bayt

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

Burada test edildi.

Bu programla aynı taktiği kullanır . İlk satırda bir karakter silinirse, 2. satır hala çalışacaktır. 2. satırdaki bir karakter silinirse, v2. satır bir karakter kısa olduğundan yürütmeyi 3. satıra taşır. 3. satırdaki bir silme işleminin program kontrolü üzerinde etkisi yoktur, çünkü yalnızca 2. satırdaki bir silme işleminden sonra gerçekleştirilir.

Program ayrıca, bir satır sonunun silinmesi durumunda da çalışacaktır:

Dava 1:

2. satır çalıştırılacak.

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

Durum 2:

Her iki satır da iki kez komutla bir satır haline gelir.

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

Açıklama:

Programın özü aşağıdaki gibidir. A 1yığınının ilk satırından önce itildiğine dikkat edin.

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)

Eğer kullanabilir miyim o" e"?
Martin Ender

Ve +1senin yerine kullanabilirsin l. Ayrıca fishlanguage.com yorumlayıcısı biraz garip (ve hata ayıklama özelliği elbette faydalı olsa da, kullanımı sinir bozucu). TIO biraz saner Python yorumlayıcısı kullanır, sanırım: tio.run/nexus/fish#@m9oqIAMysq4AMuxtrfVMslXUkhVssqzsrHBEPj/HwA
Martin Ender

@MartinEnder İlk satırdaki s'lerden birini kaldırırsanız çalışmaz 1.
mbomb007


12

> <> , 42 38 34 bayt

Çevrimiçi Deneyin!

@Martin Ender ve @Teal Pelican'a 8 byte tıraş için teşekkürler !

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

Mbomb007 kullanıcısının yanıtına benzer , ancak sadece 2 satır kullanır.

Tek bir bellek değeri kullanarak 1 ila 404 arasında saymak yerine, yığının uzunluğunu sürekli olarak ittim. Bu, döngü başlamadan önce yığına bir şey koymam gerekmediğinden, işleri daha kolay hale getirmememi sağladı.

Orijinal kod

<Ler etrafında IP açın ve /IP sarar ve normal yol var boyunca devam ettikçe, no-operasyon. Böylece, ilgili kod:

          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

Ve bu tekrarlar.

Silme

Buradaki büyük anahtar ayna /. İkinci satır değiştirilirse hiçbir şey yapmaz - yalnızca kendi kendine geri döner ve esasen bir operasyon dışıdır. Ancak, ilk satırdaki bir karakter kaldırılırsa, satır aşağıya kayar, böylece ayna oka çarpar.< aynı, değiştirilmemiş bir döngüye neden olur.

Diğer tek önemli silme \nkarakter olacaktır. Bu, bu kodu ürettiği için de hesaba katılır:

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

Şimdi, sadece orijinal döngünün bir kopyasını ;?=*4o" e"lnllkendine ekledik. Bu bir döngü olduğundan, yürütmede fark yaratmaz ve hiçbir şey değişmemiş gibi çalışır.


1
2 çizgiye düşürmenin gerçekten güzel bir yolu. Görebildiğim tek sorun 38 bayt değil 42. İç kodun düşürülmesi; ;? = * "E": n: + 1l olsa onu 38 byte'a indirger. Bu, yalnızca 84 * işaretinizi ayrı yerine "e" dizesinin içine yerleştirir.
Peal Pelikan

1
Ayrıca :+1diğerini :de biriyle değiştirebilirsiniz l.
Martin Ender,

Evet, ikinize de teşekkürler!
MildlyMilquetoast,

;?=*4o" e"n:llde çalışır.
mbomb007

11

Bir Armut Ağacı , 34 bayt

Program kontrol karakterlerini içeriyor, bu yüzden burada bir xxddökümü:

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

Bir Armut Ağacı temel olarak bazı "ilginç" özelliklere sahip bir Perl türevidir. Bunu bir şaka olarak fırlattım (poliglotumun a partridgeArmut Ağacı'nda basılmış olduğunu söyleyebilirim ; aslında neredeyse tüm programlar yapar). Ancak, Turing tamamlandı ve bu tür bir mücadelede aslında bir nevi iyi.

Burada en çok önem verdiğimiz özellik, Armut Ağacı'nın yalnızca bir kodun bir alt harfinin bir CRC-32'si olması durumunda bir programı çalıştırmasıdır 00000000. Kod, söz konusu alt dizeyi başlangıçta koymak için döndürülür. Olduğu gibi, kodun iki (özdeş) yarısının her biri söz konusu CRC-32'ye sahiptir (sonunda şüpheli görünen ikili yorum nedeniyle), yani kaynaktan bir karakter silerseniz (CRC'yi kırarsanız), diğer yarısı başlangıcına döner ve# ucunun işaret, ikili hurdaya ek olarak hasarlı yarısını yorumlayacaktır.

Diğer bir özellik ise programı biraz daha küçük hale getiriyor: Armut Ağacı çoğunlukla Perl olarak yorumlanmasına rağmen, Python gibi çalışmasını sağlamak için bazı küçük değişiklikler var. Burada ilgili olan şey, Perl'in printifadesinden farklı olarak (sadece rakamları bir arada çalıştıran), Armut Ağacı'nın printifadesinin argümanları boşluklarla ayırması ve son bir yeni satır basmasıdır. Bu bize güzel bir şekilde ayrılmış çıktılar veriyor, bu da biçimlendirme için bayt harcamak zorunda kalmayacağımız anlamına geliyor. (Programa giriş yapmamanız gerektiğini unutmayın; eğer dil giriş alırsa, varsayılan olarak onunla bir şeyler yapması gerektiğini varsayar.)

Elbette, bu gerçek golf dilleriyle rekabet edemez (beklemesini bile beklemem), ama insanların ilginç bulabileceğini düşündüm.


9

Befunge 98 , 34 bayt

Çevrimiçi Deneyin!

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

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

Bu, benim <<> cevabımla çok benzer şekilde çalışır , ancak ayna yerine, /sola dönüş işlemini kullanır [ve sonra bu durumda işlevsel olarak bir aynaya eşdeğer olan IP yönünü tersine çeviririm.

Orijinal kod

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

Silme

İkinci satırdaki bir şey silinirse, üst üste etki etmeyecek ve üstünü etkilemeyecektir.

İlk satırdaki herhangi bir şey silinirse, [IP <özdeş bir döngüyü başlatan IP'ye gönderilir (bunun haricinde ile birlikte kullanılanları 2j^^önler )^[

2 yeni satır bulunduğundan, silinirse kodda bir fark yoktur ( bunun için @ masterX244'e teşekkürler !)


Koddaki boş satırlara ne olur? Belki de bağışıklık
kazanması için kalıbı ikiye katlayabilirsiniz

Tamamen haklısınız @ masterX244 teşekkürler! Bunun hakkında düşünmedim.
MildlyMilquetoast,

lol, dili hiç kullanmadım ama nedense 6. duyu bana bu fikri verdi ...
masterX244

5

Befunge-93, 54 51 bayt

Bana 3 byte kazandırdığı için Mistah Figgins'e teşekkürler .

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

Çevrimiçi deneyin!

Bu temelde, Hataya Dayanıklı Hello World yarışmasında kullanılan aynı numaradır . İlk satır dizinin başlangıcında yığının üstünde 1 olduğundan emin olarak başlar ve ardından vsatırın sonundaki oklardan biri kod yolunu satır 2'deki ana yordamın başlangıcına yönlendirir , sağdan sola yürütme.

Bir karakteri ilk satırdan kaldırmak, vokları birer birer kaydırır , ancak yine de kodun ikinci satıra başarıyla yönlendirilmesine izin verir. İkinci satırdan bir karakterin çıkarılması <, satırın sonundaki okun yukarıdaki satırın dışına kaymasına neden olur v, böylece kod yolu 3. satırdaki yedekleme yordamına yönlendirilir.

İlk satır sonunun kaldırılması zarar vermez, çünkü bu ikinci satırın yerine üçüncü satırın yerine geçer. Ve ikinci satırın bitiminden sonra herhangi bir şeyi çıkarmanın bir etkisi olmaz, çünkü bu sadece yedek koddur.


The first line starts by making sure there is a 1 on the top of the stack...İlk satır bu açıdan kendinden oldukça emin. Ayrıca, <code> _ @ #! </code> to _ @ # - `ve 3 bayttan tasarruf etmek için yazdırmadan önce koyun.
MildlyMilquetoast

5

JavaScript + HTML + Yığın Parçacıkları, 167 158 154 bayt

Stack Snippets'teki JavaScript'in kötüye kullanılması, bir <script>öğenin içindeki bir web sayfasına yerleştirilir .

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)


@ Flp.Tkc Sabit.
user2428118 16:16

4

Aslında , 18 bayt

:404::404kMkMMRRSS

Aslında bir yığın tabanlı golf dilidir.

İlgili komutların açıklaması (yukarıdaki bağlamda çalıştıkları gibi):

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])
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.