Bir Geiger Sayacı Yap


29

Bir Geiger sayacı radyasyonu tespit etmek için kullanılan bir cihazdır.

Bir Geiger sayacı programı yapacağız.

Hepimizin bildiği gibi, radyasyon bir bilgisayar programına çarptığında rastgele 1 baytı kaldırır. Bu nedenle, bir Geiger sayaç programı hiçbir şey yapmayan bir programdır, ancak herhangi bir byte silindiğinde, değiştirilen program beep, radyasyonun varlığını göstermek için yazdırır .

Yanıtlar, baytlarda daha az bayt daha iyi olacak şekilde puanlanacaktır. Cevaplar en az 1 byte olmalıdır.

Programınız, beepsürekli çıktığı sürece, yeni bir satır izleyerek veya boş çıktı için tek bir yeni satır yazdırabilir. Ayrıca farklı bir durum kullanabilir Programınız beepgibi BEEP, bEEPya da Beepbu kadar uzun o kadar tutarlı olduğu gibi.



7
Gerçek bir bip sesi çıkarmak için BEL kontrol karakterini kullanabilir miyiz?
Jo King,

2
@JoKing Bu fikirle oynamıştım, eğlenceli, ama hayır demek zorundayım. Bu çok büyük ölçüde farklı.
Buğday Sihirbazı,

2
Retina'da bir çözüm görmek istiyorum.
mbomb007

3
Bunu SMBF'de nasıl yapacağımı bulmaya çalışıyorum ... ama iki hücreyi karşılaştırmanın tek yolu onları değiştirmeyi gerektiriyor. SMBF'de, kontrol etmeniz gereken hücreler, programın üzerinde çalıştığı hücrelerdir. Demek Heisenberg Belirsizlik İlkesi gibi. Bu nedenle, yalnızca kontrol akışını kullanarak bir şeyin değiştiğini belirlemek zorundasınız.
mbomb007

Yanıtlar:


24

Kayıp , 303 293 263 253 238 228 bayt

v^"peeb"<\>"beepvv"((>@@>>%%>>(((((([[[[[[\
>>>>>>>>>//>>>>>>>>>>>>>>/>>/>>>>>>>>>>>>>\\
>>>>>>>>//>>>>\>>>>>>>>>>/>>>>>>>>>>>>>>>>>\\
>/>>>>>>>/>>>>>>>>>>>>\>>>>>>>>>>>>>>>>>>>>>\\
>>>>>>>>>>>>>>>>>>>>>>\\>>>>\>>>>>>>>>>>>>>>>\

Çevrimiçi deneyin!

Doğrulama betiği ( 202729 kullanıcısının yanıtından ödünç alındı ). Ne yazık ki bu, bir kerede yalnızca kodun yarısını test edebilir, ancak tüm programı test ettiğime emin olabilirsiniz.

Ah, bu zordu. WW'nin silinmiş cevabını alıntılayacağım:

Kayıp belki de bu meydan okuma için en ilginç dil. Kayıp'ta başlangıç ​​konumu ve işaretçinin yönü tamamen rastgeledir, bu nedenle deterministik programlar yapmak için her olası başlangıç ​​konumunu ve yönünü hesaba katmanız gerekir. Aynı zamanda, bu zorluğun doğası gereği, çıkartılan her bir baytı da hesaba katmanız gerekir.

Ne yazık ki, cevabı her şeyi batırdıran yeni hatları kaldırmayı dikkate almadı.

Açıklama:

(burada bir kaç bayt olabileceğini unutmayın)

İlk önce kodun genel yapısı hakkında konuşalım:

v^^"peeb"<<\/"beepvv"((>>>@@>>%%>>(((((([[[[[[[\       Processing line
>>>>>>>>>>>//>>>>>>>>>>>>>>>>>>>/>>>>>>>>>>>>>>\\      Beep line
>>>>>>>>>//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\\     Back-up beep line
>//>>>>>>>>>>>>>>>>>>>>\\>>>>>>>>>>>>>>>>>>>>>>>>\\    Back-up return line
>>>>>>>>>>>>>>>>>>>>>>>>\\>>>>>>\>>>>>>>>>>>>>>>>>\    Return line

İşleme çizgisi dışındaki her şey, tamamen >veya bir taneden oluşmalıdır \/. Niye ya? Peki, bir örnek olarak, yeni bir satırı kaldıralım:

v^^"peeb"<<\/"beepvv"((>>>@@>>%%>>(((((([[[[[[[\>>>>>>>>>>>//>>>>>>>>>>>>>>>>>>>/>>>>>>>>>>>>>>\\
>>>>>>>>>//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\\
>//>>>>>>>>>>>>>>>>>>>>\\>>>>>>>>>>>>>>>>>>>>>>>>\\
>>>>>>>>>>>>>>>>>>>>>>>>\\>>>>>>\>>>>>>>>>>>>>>>>>\

İlk satır artık yolu bloğun geri kalanından daha uzun. Bir işaretçi, >\/dikey hareket ile karakter olmayan bir yere doğacak olsaydı, sonsuz bir döngüde sıkışıp kalırdı.


En büyük radyasyon dedektörü kısmı, her hattın sonundaki kısımdır.

 \
 \\
 >\\
 >>\\
 >>>\

Normalde bundan ilk satırdan geçen bir IP son satırdan çıkar. Bununla birlikte, satırdaki herhangi bir karakter kaldırılırsa, o satır bir satır aşağı kaydırılır, örneğin:

 \
 \\
 >\\
 >\\
 >>>\

IP ise bayt olmayan satırdan çıkar (sondan ikinciden çıktığı son satır hariç).

Oradan, ilk dört satırın her biri ikinci satıra yönlendirilecektir:

v
>>>>>>>>>>
>>>>>>>>//
>/

Bu daha sonra ikisinden birine yol açacaktır beep.

v^"peeb"<<\/"beepvv"((>
>>>>>>>>>>//

İlk beepsatırdaki baytlardan herhangi biri kaldırılmışsa, bunun yerine ikinciye gider:

v^^"peb"<<\/"beepvv"((>
>>>>>>>>>>>//

Her iki beepers daha sonra ilk çizgiye ve sonlandırmaya geri döner @.

Diğer bazı diğer parçalar:

(((((([[[[[[[İşaretçi yığına bütün ilk satırı itme kadar tırnak ve uçları bir çift iç başladığında yığın temizlemek için kullanılır. Maalesef çok uzun olması gerekiyor, çünkü ilk yeni satır ilk çizgiyi iki kat boyutlandırmak için kaldırılabilir. beepTırnak işaretleri yerine aritmetik kullanılarak deneme yapılması daha uzun sürdü.

Satırlara dağılmış olan \s ve /s'leri, işaretçiyi doğru satırlara yönlendirerek kodun üst satırında golf baytları vardır. Alt çizgilerin çoğu sadece dolgu maddesi olduğu için, sadece üst sıra golfe atılabilir. Herhangi birisinin radyasyona karşı daha kısa bir yığın yığını için daha net bir fikri varsa, şimdi sahip olduğum şeyi yorum yapmaktan çekinmeyin.


Merakım bittiğinde, sohbete gönderdiğim kısmi cevap ne kadar yardımcı oldu? Daha önceki sürümlerde bazı benzerlikler gördüm ve doğru yolda olup olmadığımı bilmek isterdim.
Buğday Sihirbazı

@WW O zamana kadar üzerinde çalışmıştım, ama ittifakları \/ayırmak beepve tırnaklardan sadece birinin bir çıkış cümlesi gerektirdiği gerçeğini çözmek
Jo King

20

Altıgen , 38 bayt

.....;p;<>b;e;/<b;e;;p...@@.......;@..

Çevrimiçi deneyin!

Doğrulama programı.


açıklama

Burada Hexagony'nin altıgen kenar uzunluğunu otomatik olarak algılamasını kullanıyoruz.

Bayt kaldırılmazsa, programın kenar uzunluğu 4'tür ve şöyle görünür:

Program without any bytes removed

Ancak, bir bayt kaldırılır. 2 vaka var.

  1. Kaldırılan bayt saniyeden sonra < .

    Yürütme akışı şöyle olacaktır:

    Program with last byte removed

    @5. çizgide art arda 2 tane vardır , bu yüzden onlardan biri çıkarılsa bile IP güvenli bir şekilde a'ya çarpacaktır @.

  2. Kaldırılan bayt ikinci veya daha önce <.

    Sonra ikinci yarı sağlam kalır ve IP bundan sonra yukarı doğru yönlendirilmez <. Yürütme akışının görüntüsü:

    Program with the second <code><</code> removed


19

Altıgen , 34 29 bayt

//..>;e;<b@;p;/|/;e;;\.b@;p<@

Çevrimiçi deneyin! Doğrulama!

Açıklama:

HexagonyColorer kullanarak uygun bir altıgene biçimlendirilmiş normal kod :

No Cancer...

Baştaki duble //, bu yolun daima alınmasını sağlar. Herhangi bir karakter kaldırılırsa, @yoldan kaldırılır, biri geriye kaydırılır veya kendisi kaldırılır:

Cancer!

Bu durumda, bundan sonra bir karakteri kaldırdık |; bu, bu yolu izliyor, yazdırıyor beep:

First beep

Bunun yerine |(veya |kendisinden) önce bir karakteri kaldırırsak , diğer bip yazıcısını takip ederiz:

Second beep

Daha sonra tüm olasılıkları hesaba beepkattık ve programın sadece ışınlanmamış bölümlerini kullanıyoruz.


13

Kendini değiştiren Brainfuck , 73 63 bayt

<<[[[[<<]]>[[.>>..>>.[,>]]]]   bbeepp+[<<<]>>[[>]>>>.>>..>>.,+]

Çevrimiçi deneyin! Doğrulama!

Kodun ortasındaki boşluklar aslında NUL baytını temsil ediyor.

Açıklama:

Kod ortada 3 NUL bayt ile iki bölüme ayrılır. Her ikisi de temel beepolarak diğer bölüm ışınlanırsa (birkaç istisna dışında) yazdırır .

İlk olarak, <<[[başlangıçtaki herkesin ]istediği zaman eşleşmesini sağlamaktır . [ler bir eşleştirme aramaya denemez ]ise hücre, pozitif ise ]ler yapmak . Herhangi bir ]bu braketlerden birine atlarsa, genellikle hücre doğrudan olduğu için hemen geri atlar 0.

Bir sonraki bölüm, [[<<]]>2. bölümün uzunluğunun eşit olup olmadığını kontrol eder. Eğer öyleyse, bölüm 2'nin başlangıcını beepkullanarak basan bölüm 1'in diğer yarısını yürütür bbeepp.

[[.>>..>>.[,>]]]]

Daha sonra tüm bölüm 2'yi temizler, böylece çalışmaz.

Bölüm 2'de, 1. bölümde uzunluğu kontrol ve NULL bölünemeyen bir bayt 3ile +[<<<]>>.

[[>]>>>.>>..>>.,+]

Benzer şekilde basıyoruz beep.


10

Z80Golf , 53 36 34 bayt

@Neil sayesinde @Lynn -2 byte sayesinde -16 bayt

Bu sadece Z80 makine kodu olduğu için, bunda yazdırılamaz bir çok şey var, bu nedenle geri xxd -rdönüşlü bir hexdump var :

00000000: ddb6 2120 10dd b615 280c 003e 62ff 3e65  ..! ....(..>b.>e
00000010: ffff 3e70 ff76 003e 62ff 3e65 ffff 3e70  ..>p.v.>b.>e..>p
00000020: ff76                                     .v

Çevrimiçi deneyin! (Python'da ayrıntılı test)

açıklama

z80golf Anarşi Golf'ün varsayımsal Z80 makinesi vardır call $8000, bir putchar olan call $8003bir getchar olduğunu haltprogramınızı yerleştirilir, tercüman çıkış yapar $0000ve tüm diğer bellek sıfır ile doldurulur. Programların montajda radyasyon geçirmez hale getirilmesi oldukça zordur, ancak genel olarak kullanışlı bir teknik, bir baytlık bağımsız komutlar kullanıyor. Örneğin,

or c        ; b1    ; a = a | c

sadece bir bayttır ve a | c | c == a | csadece talimatı tekrarlayarak radyasyon geçirmez hale getirilebilir. Z80'de, 8 bitlik bir anlık yük iki bayttır (hemen sonraki ikinci bayttadır), böylece bazı değerleri güvenilir bir şekilde yazmaçlara da yükleyebilirsiniz . Programın başında ilk başta yaptığım şey buydu, bu nedenle yanıtın altında arşivlediğim daha uzun varyantları analiz edebilirsiniz, ancak daha sonra daha basit bir yol olduğunu anladım.

Program, birinin radyasyondan zarar görebileceği iki bağımsız yükten oluşuyor. Mutlak bellek adreslerinin değerlerini kontrol ederek bir baytın kaldırılıp kaldırılmadığını ve kaldırılan baytın yükün ikinci kopyasından önce olup olmadığını kontrol ederim.

İlk olarak, radyasyon gözlenmediyse çıkmamız gerekir:

    or a, (ix+endbyte) ; dd b6 21 ; a |= memory[ix+0x0021]
    jr nz, midbyte     ; 20 10    ; jump to a halt instruction if not zero

Herhangi bir bayt kaldırıldıysa, tüm baytlar kayacak ve $0020sonuncuyu içerecektir 76, bu yüzden $0021sıfır olacaktır. Hemen hemen hiçbir fazlalık olmasa da, programın başlangıcını yaymayı göze alabiliriz:

  • Atlama ofseti $10kaldırılırsa, radyasyon doğru bir şekilde algılanır, atlama alınmaz ve ofset önemli olmaz. Bir sonraki komutun ilk baytı tüketilecektir, ancak bayt çıkartmalarına karşı dayanıklı olması için tasarlandığından, bunun önemi yoktur.
  • Atlama işlem kodu ise $20çıkarılır, sonra ofset atlama $10olarak deşifre edecek djnz $ffe4(bir sonraki komut bayt alıcı ofset - yukarıya bakınız) - sonuç sıfır değilse eksiltme B ve atlama bir döngü talimat olan. ffe4-ffffSıfır ( noplar) ile dolu olduğundan ve program sayacı etrafına dolandığından, bu programın başlangıcını 256 kez çalıştırır ve sonra devam eder. Bu işleri hayrete düşürüyorum.
  • İsteğin kaldırılması $ddparçacığın geri kalanının kodunu çözmesini sağlar or (hl) / ld ($1020), hlve ardından programın bir sonraki bölümüne kaydırılır. orHerhangi önemli kayıtlarını değişmeyecek ve HL bu noktada sıfır olduğu için, yazma da iptal edecektir.
  • $b6İstirahati kaldırmak istirahatin kodunu çözmesini sağlar ld ($1020), ixve yukarıdaki gibi devam eder.
  • İradenin kaldırılması $21kod çözücünün yemesini $20ve djnzdavranışını tetiklemesini sağlar .

or a, (ix+*)Sıfırdaki ld a, (**) / and a / and abütünleşik kontrol sayesinde kullanımın iki byte tasarrufu sağladığını unutmayın .

Şimdi yükün iki kopyasından hangisinin yürütüleceğine karar vermemiz gerekiyor:

    or (ix+midbyte)  ; dd b6 15
    jr z, otherimpl  ; 28 0c
    nop              ; 00
    ; first payload
    ld a, 'b'        ; 3e 62
    rst $0038        ; ff
    ld a, 'e'        ; 3e 65
    rst $0038        ; ff
    rst $0038        ; ff
    ld a, 'p'        ; 3e 70
    rst $0038        ; ff
midbyte:
    halt             ; 76
otherimpl:
    nop              ; 00
    ld a, 'b'        ; 3e 62
    ; ...            ; ...
    rst $0038        ; ff
endbyte:
    halt             ; 76

İki kopya bir nop ile ayrılır, çünkü aralarında seçim yapmak için nispi bir sıçrama kullanılır ve radyasyon, atlamanın hedeften sonraki ilk baytı atlamasını sağlayacak şekilde kaydırmış olabilir. Ek olarak, nop sıfır olarak kodlanmıştır, bu da değişen baytların tespit edilmesini kolaylaştırır. Anahtarın kendisi bozuksa hangi yükün seçildiği önemli değildir, çünkü her iki kopya da güvenlidir. Yine de, başlatılmamış belleğe atlamayacağından emin olalım:

  • Silme $dd, sonraki iki baytın şifresini çözmesini sağlar or (hl) / dec d. Clobbers D. Hiç önemli değil.
  • Silme $b6, belgelenmemiş daha uzun bir kodlama oluşturur dec d. Yukarıdaki gibi.
  • Silme yerine ofset olarak $15okuyacak $28ve yürütme $0caşağıdaki gibi devam edecektir .
  • Ne zaman $28kaybolur, $0colarak deşifre edilir inc c. Yükü umursamıyor c.
  • Silme $0c- Nop bunun için. Aksi takdirde, yükün ilk baytı atlama kayması olarak okunur ve program başlatılmamış belleğe atlanırdı.

Yükün kendisi oldukça basittir. İpin küçük boyutunun bu yaklaşımı bir döngüden daha küçük hale getirdiğini düşünüyorum ve bu şekilde pozisyondan bağımsız hale getirmek daha kolay. eİçinde beeptekrarlar, bu yüzden bir tane kapalı tıraş edebilirsiniz ld a. Arasındaki tüm bellek çünkü Ayrıca, $0038ve $8000sıfırlanır, bunun üzerinden düşmesine ve daha kısa kullanabilir rstvaryantını callsadece çalışır talimat, $0, $8, $10ve benzeri, en fazla $38.

Daha eski yaklaşımlar

64 bayt

00000000: 2e3f 3f2e 3f3f 7e7e a7a7 201f 1e2b 2b1e  .??.??~~.. ..++.
00000010: 2b2b 6b00 7ea7 2814 003e 62cd 0080 3e65  ++k.~.(..>b...>e
00000020: cd00 80cd 0080 3e70 cd00 8076 003e 62cd  ......>p...v.>b.
00000030: 0080 3e65 cd00 80cd 0080 3e70 cd00 8076  ..>e......>p...v

58 bayt

00000000: 2e39 392e 3939 7e7e a7a7 2019 3a25 00a7  .99.99~~.. .:%..
00000010: 2814 003e 62cd 0080 3e65 cd00 80cd 0080  (..>b...>e......
00000020: 3e70 cd00 8076 003e 62cd 0080 3e65 cd00  >p...v.>b...>e..
00000030: 80cd 0080 3e70 cd00 8076                 ....>p...v

53 bayt

Bunun düzenleme geçmişinde bir açıklaması var, ancak çok da farklı değil.

00000000: 3a34 00a7 a720 193a 2000 a728 1400 3e62  :4... .: ..(..>b
00000010: cd00 803e 65cd 0080 cd00 803e 70cd 0080  ...>e......>p...
00000020: 7600 3e62 cd00 803e 65cd 0080 cd00 803e  v.>b...>e......>
00000030: 70cd 0080 76                             p...v

Ya eğer: boş olmayan herhangi bir çıkış bip yerine iyi oldu

1 bayt

v

haltNormalde program, ancak radyasyon kaldırırsa, bellek sıfırla dolu olacaktır, böylece $8000sonsuz sayıda defa çalıştırılır, çok sayıda boş bayt yazdırılır.


aSıfırdan beri , or a, (N);yerine kullanamazsınız ld a, (N); and a;? Bu şekilde birkaç bayt kaydedebilirsin gibi görünüyor.
Neil

@Neil İyi soru! Ne yazık ki, Z80'de yalnızca yükleme talimatları bu gibi adresleri alabilir.
NieDzejkob

Z80 programcılığımdan beri çok uzun zaman oldu ... belki de düşünüyordum or a, (ix + N)?
Neil

Var ve IX o bölgede bir bayt şekilde kaymayı bayt yapar tasarrufu maalesef ... çok sıfırdan başladığını, aslında @Neil 20 19başında olur 20 18ve kaldırma 20a nedenle, koşulsuz atlama geriye doğru yaratır Programdaki ilk atlamadan sonra, bayt tasarrufunu tersine çevirerek nop eklenmelidir.
NieDzejkob

Ah, bu utanç verici. Yine de kontrol ettiğiniz için teşekkürler!
Neil


4

KleinHer topolojiden biri olan , toplam 291 bayt

Kullanarak WW'nin cevabını gördükten sonra001 topolojiyi , her topoloji için bir Geiger Sayacı yapmanın ne kadar zor olduğunu görmeye karar verdim. (Spoiler: çok zor. İşaretçinin el hareketi olmadan nereye gideceğini bulmak zor, hangi elin sol olduğunu buldum)

Doğrulama!

(Ayrıca tüm topolojilerde geçerli bir Geiger sayacı olan ancak beklemesi gerekebilecek bir program yazmayı düşündüm. Yine de başkası denemek isterse 500 tekrar lütuf teklif ediyorum)

000 ve 010, 21 bayt

<<@"peeb"/
.@"peeb"<\

000 çevrimiçi deneyin! ve çevrimiçi 010 deneyin!

Bu benim benden taşınır ><> çözümü . Bu açık bir şekilde işe yarıyor 000, çünkü çoğu 2D dil için varsayılan topoloji bu, fakat bunun da işe yaramasına şaşırdım 010.

001 ve 011, 26 bayt

!.<<@"peeb"/
.@"peeb"..<..

Çevrimiçi 001'i deneyin!ve 011'i çevrimiçi deneyin!

Bu bir doğrudan kopyalanır WW'nin cevabından . Teşekkürler!

100, 21 bayt

//@"peeb"\
@"peeb".</

Çevrimiçi deneyin!

101, 21 bayt

//@"peeb"/
@"peeb".<!

Çevrimiçi deneyin!

110, 26 bayt

<.<@"peeb"\\
.\@."peeb".\<

Çevrimiçi deneyin!

111, 24 bayt

<<@"peeb"<\
...@"peeb"//

Çevrimiçi deneyin!

200, 21 bayt

<<@"peeb"\
@"peeb".!/

Çevrimiçi deneyin!

201, 31 bayt

\\.\.@"peeb"</./
./...@"peeb"<\

Çevrimiçi deneyin!

Şimdiye kadar en sinir bozucu.

210, 26 bayt

/\\@"peeb"</\
/@.."peeb"<\

Çevrimiçi deneyin!

211, 27 bayt

\\."peeb"((</
!/@@<"peeb"<\

Çevrimiçi deneyin!

Sinyalin sağ tarafından girerken başa çıkmam gereken tek şey.


Mutlu bir şekilde ikinci kez bu ödül alırım.
Buğday Sihirbazı


2

Runik Büyüleri , 29 bayt

>>yyLL@"peeb"/
     @"peeb"L\

Çevrimiçi deneyin!

Temelde Klein 000 cevap ya da> <> cevapla aynı (Klein ile başladım). Gerçekten gereken tek değişiklik, <içine Lve .içine  (komut sembollerinin çevrilmesi), IP giriş noktalarının eklenmesi (ihtiyaç 2'ye, aksi takdirde silme derleyici olmayan bir programla sonuçlanacaktı) ve delaların eklenmesiydi.y komutunun . iki IP birleştirmek için (böylece sadece bir tane basar beep), yine iki tane gerekir. Ayrıca, hat uzunluklarını aynı tutmak için ek NOP'ların takılması da gereklidir. Klein uygun bir şekilde @"yazdır ve sonlandır" için de kullanılır .

Sol alt kısımdaki boşluktan faydalanma yeteneği yoktur, çünkü yön değiştiren herhangi bir reflektör radyasyonu saptama yeteneğini engeller. örneğin (26 bayt, ışınlanmış y):

/yLL@"peeb"/
\<<  @"peeb"L\

Eğri giriş bölümü alt çizginin sonlandırıcısına tekrar yansımasına neden olduğu için çıktı yok yazdırır.



1

Wumpus , 37 34 32 31 bayt

777*7..@ $o&4"beep"|"@peeb"4&o@

Çevrimiçi deneyin! Doğrulama!

Bu çözüm ., programın uzunluğunu ayarlayan bir konuma atlayan gerçeğini kullanır .

Alternatif olarak aynı miktarda bayt için


" @o&4"beep"}@
@o&4"beep"}$}  

Çevrimiçi deneyin! Doğrulama!

Bu, tek ve hatta çizgi uzunlukları için işaretçinin yönündeki farkı kullanır. ( "Newline çıkarıldığında ilkinin gerçekte nasıl çalıştığını gerçekten bilmiyorum )


1

Klein (001), 26 bayt

!.<<@"peeb"/
.@"peeb"..<..

Çevrimiçi deneyin!

DOĞRULAYIN!

açıklama

Bu program, Klein'in eşsiz topolojisinden, özellikle de Klein şişesi olan 001 topolojisinden faydalanır .

Düzenlenmemiş program yürütme yolunu izler:

Orange path

Bir baytı programdan kaldırmak, programı 4 şekilde etkileyebilir (her biri farklı renkte):

Program sections

Unutulmaması gereken ilk şey <<, başlangıçta ipi her zaman başlangıç ​​noktasının soluna çevirecek olmasıdır. Biri varsa <s silinir diğer yerini alıyor. Böylece, herhangi bir byte kırmızı bölümden çıkarılırsa, aşağıdaki yürütme yolu izlenecektir:

Red path

Mavi bayt kaldırılırsa çok basit bir yol alırız:

enter image description here

Eğer newline silinirse yolunu buluruz:

Green path

The yellow path is a bit more complex. Since the bottom line is one longer than the top line, when the program is squared at the beginning of execution a virtual character is added to the end of the first line to make them the same size. If any byte on the second line is removed the line is shortened and that virtual character is not added. This is important because ! normally jumps over the virtual character, but in its absence it jumps over / instead.

Yellow path


1
You could port my ><> solution in 000 for 21 bytes
Jo King

@JoKing I think that would be better as its own answer.
Wheat Wizard

1

Backhand, 25 21 bytes

vv""ppeeeebb""jjHH@

Try it online! Verification!

This uses Backhand's ability to change the pointer step value to skip an instruction every step and neatly solve the redunancy issue. It then uses the j command to check if the code is irradiated by jumping to the last character (@, halt) if not, and jumping to the second last (H, halt and output stack) if so.

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.