Tạo một bộ đếm Geiger


29

Bộ đếm Geiger là một thiết bị được sử dụng để phát hiện bức xạ.

Chúng tôi sẽ thực hiện một chương trình truy cập Geiger.

Như chúng ta đã biết, khi bức xạ chiếu vào một chương trình máy tính, nó sẽ loại bỏ chính xác 1 byte một cách ngẫu nhiên. Vì vậy, một chương trình truy cập Geiger là một chương trình mà bản thân nó không làm gì, nhưng khi bất kỳ byte nào bị loại bỏ, chương trình được sửa đổi beepsẽ chỉ ra sự hiện diện của bức xạ.

Câu trả lời sẽ được tính bằng byte với ít byte hơn. Câu trả lời phải có ít nhất 1 byte.

Chương trình của bạn có thể in beepvới một dòng mới hoặc in một dòng mới cho đầu ra trống, miễn là nó không nhất quán. Chương trình của bạn cũng có thể sử dụng một trường hợp khác nhau cho beepnhư BEEP, bEEPhoặc Beepquá lâu vì nó làm như vậy một cách nhất quán.



7
Chúng ta có thể sử dụng ký tự điều khiển BEL để phát ra tiếng bíp thực tế không?
Jo King

2
@JoKing Tôi đùa với ý tưởng đó, thật thú vị, nhưng tôi phải nói không. Nó là quá khác nhau đáng kể.
Thuật sĩ lúa mì

2
Tôi muốn xem một giải pháp trong Retina.
mbomb007

3
Tôi đang cố gắng tìm ra cách để làm điều này trong SMBF ... nhưng cách duy nhất để so sánh hai tế bào liên quan đến việc thay đổi chúng. Và trong SMBF, các ô bạn cần kiểm tra là các ô mà chương trình hiện đang chạy. Vì vậy, nó giống như Nguyên tắc bất định Heisenberg. Vì vậy, bạn phải xác định nếu có bất cứ điều gì thay đổi chỉ sử dụng luồng điều khiển.
mbomb007

Câu trả lời:


24

Mất , 303 293 263 253 238 228 byte

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

Hãy thử trực tuyến!

Kịch bản xác minh (mượn từ câu trả lời của người dùng 202729 ). Thật không may, điều này chỉ có thể kiểm tra một nửa mã tại một thời điểm, nhưng hãy yên tâm rằng tôi đã kiểm tra toàn bộ chương trình.

Ouch, đây là một khó khăn. Tôi sẽ trích dẫn câu trả lời đã bị xóa của WW:

Mất có lẽ là ngôn ngữ thú vị nhất cho thử thách này. Trong Mất vị trí bắt đầu và hướng của con trỏ là hoàn toàn ngẫu nhiên, do đó để tạo các chương trình xác định, bạn phải tính đến mọi vị trí và hướng bắt đầu có thể. Đồng thời, do bản chất của thách thức này, bạn cũng phải tính đến bất kỳ byte nào bị xóa.

Thật không may, câu trả lời của anh ấy đã không tính đến việc loại bỏ các dòng mới, điều này làm hỏng mọi thứ.

Giải trình:

(lưu ý rằng một vài byte có thể bị tắt ở đây và ở đó)

Trước tiên hãy nói về cấu trúc chung của mã:

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

Tất cả mọi thứ trừ dây chuyền xử lý phải hoàn toàn bao gồm một >hoặc một trong hai \/. Tại sao? Vâng, như một ví dụ, hãy xóa một dòng mới:

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

Dòng đầu tiên tại là cách dài hơn phần còn lại của khối. Nếu một con trỏ xuất hiện trên một >\/ký tự không có chuyển động thẳng đứng, thì nó sẽ bị kẹt trong một vòng lặp vô hạn.


Phần phát hiện bức xạ lớn nhất là phần ở cuối mỗi dòng.

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

Thông thường một IP đi qua điều này từ dòng đầu tiên sẽ thoát ra khỏi dòng cuối cùng. Tuy nhiên, nếu bất kỳ ký tự nào trên dòng bị xóa, thì dòng đó sẽ dịch xuống một, ví dụ:

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

Và IP thay vào đó thoát ra khỏi dòng bị thiếu một byte (ngoại trừ dòng cuối cùng, nơi nó thoát ra khỏi dòng thứ hai đến cuối cùng).

Từ đó, mỗi dòng trong bốn dòng đầu tiên sẽ chuyển hướng đến dòng thứ hai:

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

Mà sau đó sẽ dẫn vào một trong hai beepers.

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

Nếu bất kỳ byte nào trong beeper đầu tiên đã bị xóa, thì nó sẽ chuyển sang byte thứ hai:

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

Cả hai beepsau đó dẫn trở lại dòng đầu tiên và chấm dứt@ .

Một số phần linh tinh khác:

(((((([[[[[[[được sử dụng để xóa ngăn xếp khi con trỏ bắt đầu bên trong một cặp dấu ngoặc kép và cuối cùng đẩy toàn bộ dòng đầu tiên lên ngăn xếp. Thật không may là rất lâu bởi vì dòng mới đầu tiên có thể được gỡ bỏ để làm cho dòng đầu tiên có kích thước gấp đôi. Thử nghiệm trong việc tạo ra việc beepsử dụng số học thay vì dấu ngoặc kép kết thúc lâu hơn.

Các \s và /s nằm rải rác trên các dòng có ở đó các byte golf trong dòng mã trên cùng bằng cách chuyển hướng con trỏ đến các dòng chính xác. Vì hầu hết các dòng dưới cùng chỉ là phụ, chỉ có dòng trên cùng có thể được chơi gôn. Nếu bất cứ ai có bất kỳ ý tưởng nào cho một ngăn xếp bằng chứng phóng xạ ngắn hơn rõ ràng hơn những gì tôi có bây giờ, hãy bình luận.


Vì tò mò, câu trả lời một phần tôi đã đăng trong trò chuyện hữu ích như thế nào? Tôi đã thấy một số điểm tương đồng trong các phiên bản trước đó và tôi muốn biết liệu mình có đang đi đúng hướng hay không.
Thuật sĩ lúa mì

@WW Lúc đó tôi đã làm việc với nó, nhưng \/để phân tách các beepcú đẩy và thực tế là chỉ có một trong những trích dẫn cần một điều khoản thoát đã giúp
Jo King

20

Lục giác , 38 byte

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

Hãy thử trực tuyến!

Chương trình xác minh.


Giải trình

Chúng tôi sử dụng tính năng tự động phát hiện chiều dài hình lục giác của Hexagony tại đây.

Nếu không có byte nào bị xóa, chương trình có độ dài cạnh 4 và trông như thế này:

Chương trình không có byte nào bị xóa

Tuy nhiên, nếu một byte bị loại bỏ. Có 2 trường hợp.

  1. Byte bị loại bỏ là sau giây < .

    Luồng thực hiện sẽ là:

    Chương trình với byte cuối được loại bỏ

    Có 2 liên tiếp @trên dòng thứ 5, vì vậy ngay cả khi một trong số chúng bị xóa, IP sẽ chạm an toàn a @.

  2. Byte bị loại bỏ là tại hoặc trước giây < .

    Sau đó, nửa thứ hai sẽ giữ nguyên và IP không còn được chuyển hướng lên trên nữa <. Hình ảnh của luồng thực hiện:

    Chương trình đã xóa <code> << / code> thứ hai


19

Lục giác , 34 29 byte

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

Hãy thử trực tuyến! Xác minh!

Giải trình:

Đây là mã bình thường được định dạng thành một hình lục giác thích hợp bằng HexagonyColorer :

Không có ung thư ...

Nhân đôi //ở đầu đảm bảo rằng con đường này luôn được thực hiện. Nếu bất kỳ ký tự nào bị xóa, ký tự sẽ bị @xóa khỏi đường dẫn, hoặc bị dịch ngược trở lại hoặc bị xóa:

Ung thư!

Trong trường hợp này, chúng tôi đã xóa một ký tự sau |, làm cho nó đi theo đường dẫn này, in beep:

Tiếng bíp đầu tiên

Thay vào đó, nếu chúng ta xóa một ký tự từ trước |(hoặc |chính nó), chúng ta sẽ theo máy in tiếng bíp khác:

Tiếng bíp thứ hai

Sau đó, chúng tôi đã tính đến tất cả các khả năng và chúng tôi chỉ beepsử dụng các phần không chiếu xạ của chương trình.


13

Tự sửa đổi Brainfuck , 73 63 byte

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

Hãy thử trực tuyến! Xác minh!

Các khoảng trắng ở giữa mã thực sự đại diện cho các byte NUL.

Giải trình:

Mã được chia thành hai phần bởi 3 byte NUL ở giữa. Cả hai đều cơ bản in beepnếu phần khác được chiếu xạ (với một vài ngoại lệ).

Đầu tiên, <<[[lúc đầu là để đảm bảo rằng tất cả các ]s được khớp bất cứ lúc nào. [s sẽ không cố gắng tìm kiếm sự phù hợp ]nếu tế bào dương tính, trong khi ]s làm . Nếu bất kỳ ]bước nhảy nào trở lại một trong các dấu ngoặc này, nó thường nhảy trở lại ngay lập tức vì ô là 0.

Phần tiếp theo, [[<<]]>sau đó kiểm tra xem độ dài của phần 2 là chẵn. Nếu vậy, nó sẽ thực thi nửa còn lại của phần 1, phần này sẽ in beepbằng cách sử dụng bbeeppphần đầu của phần 2.

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

Sau đó nó xóa tất cả phần 2 để nó không thực thi.

Trong phần 2, chúng tôi kiểm tra xem độ dài của phần 1 và NUL byte là chia hết cho 3với +[<<<]>>.

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

Tương tự, chúng tôi in beep.


10

Z80Golf , 53 36 34 byte

-16 byte nhờ @Lynn
-2 byte nhờ @Neil

Vì đây chỉ là mã máy Z80, nên có rất nhiều thứ không thể in được trong cái này, do đó, có một xxd -rhexdump có thể đảo ngược:

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

Hãy thử trực tuyến! (người kiểm tra toàn diện trong Python)

Giải trình

z80golf là máy Z80 giả thuyết của Anarchy Golf, trong đó call $8000một putar, call $8003là một getar, haltlàm cho trình thông dịch thoát ra, chương trình của bạn được đặt tại$0000 và tất cả các bộ nhớ khác chứa đầy số không. Làm cho các chương trình chống bức xạ trong lắp ráp khá khó khăn, nhưng một kỹ thuật hữu ích chung là sử dụng các hướng dẫn tạm thời một byte. Ví dụ,

or c        ; b1    ; a = a | c

chỉ là một byte và a | c | c == a | c do đó, nó có thể được chống bức xạ bằng cách lặp lại hướng dẫn. Trên Z80, tải tức thời 8 bit là hai byte (trong đó tức thời là byte thứ hai), vì vậy bạn có thể tải một số giá trị vào các thanh ghi một cách đáng tin cậy. Đây là những gì tôi đã làm ban đầu khi bắt đầu chương trình, vì vậy bạn có thể phân tích các biến thể dài hơn mà tôi đã lưu trữ ở cuối câu trả lời, nhưng sau đó tôi nhận ra rằng có một cách đơn giản hơn.

Chương trình bao gồm hai tải trọng độc lập, trong đó một trong số chúng có thể đã bị hư hại do phóng xạ. Tôi kiểm tra xem một byte có bị xóa hay không và liệu byte bị loại bỏ có trước bản sao thứ hai của tải trọng hay không, bằng cách kiểm tra các giá trị của một số địa chỉ bộ nhớ tuyệt đối.

Đầu tiên, chúng ta cần thoát ra nếu không quan sát thấy bức xạ:

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

Nếu bất kỳ byte nào bị loại bỏ, thì tất cả các byte sẽ thay đổi và $0020sẽ chứa cuối cùng 76, do đó $0021sẽ là một số không. Chúng tôi có thể đủ khả năng tỏa ra sự khởi đầu của chương trình, mặc dù hầu như không có sự dư thừa:

  • Nếu phần bù nhảy $10được loại bỏ, thì bức xạ sẽ được phát hiện chính xác, bước nhảy sẽ không được thực hiện và phần bù sẽ không thành vấn đề. Byte đầu tiên của lệnh tiếp theo sẽ được sử dụng, nhưng vì nó được thiết kế để chống lại việc loại bỏ byte, nên điều này không thành vấn đề.
  • Nếu opcode nhảy $20bị loại bỏ, thì offset offset $10sẽ giải mã thành djnz $ffe4(sử dụng byte lệnh tiếp theo làm offset - xem ở trên), đó là một lệnh lặp - giảm B và nhảy nếu kết quả không bằng 0. Bởi vì ffe4-ffffđược lấp đầy bằng số không (nop và bộ đếm chương trình bao quanh, điều này sẽ chạy phần đầu của chương trình 256 lần, và cuối cùng tiếp tục. Tôi ngạc nhiên công trình này.
  • Việc xóa $ddsẽ làm cho phần còn lại của đoạn mã giải mã thành or (hl) / ld ($1020), hl, và sau đó trượt vào phần tiếp theo của chương trình. Việc ornày sẽ không thay đổi bất kỳ thanh ghi quan trọng nào và vì tại thời điểm này, số 0 bằng 0 nên việc ghi cũng sẽ bị hủy.
  • Loại bỏ $b6sẽ làm cho phần còn lại giải mã làld ($1020), ix và tiến hành như trên.
  • Loại bỏ $21sẽ làm cho bộ giải mã ăn $20, kích hoạt djnzhành vi.

Lưu ý rằng việc sử dụng or a, (ix+*)tiết kiệm hai byte ld a, (**) / and a / and anhờ kiểm tra tích hợp cho số không.

Bây giờ chúng ta cần quyết định bản sao nào trong hai bản tải trọng được thực thi:

    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

Hai bản sao được phân tách bằng một nop, vì một bước nhảy tương đối được sử dụng để chọn giữa chúng và bức xạ có thể đã thay đổi chương trình theo cách làm cho bước nhảy bỏ qua byte đầu tiên sau đích đến. Ngoài ra, nop được mã hóa thành số 0, giúp dễ dàng phát hiện các byte bị dịch chuyển. Lưu ý rằng việc tải trọng được chọn không thành vấn đề nếu bản thân công tắc bị hỏng, vì sau đó cả hai bản sao đều an toàn. Mặc dù vậy, hãy đảm bảo rằng nó sẽ không nhảy vào bộ nhớ chưa được khởi tạo:

  • Xóa $ddsẽ làm cho hai byte tiếp theo giải mã thànhor (hl) / dec d . Clobbers D. Không có vấn đề lớn.
  • Xóa $b6sẽ tạo ra một mã hóa dài hơn không có giấy tờ cho dec d. Giống như trên.
  • Việc xóa $15sẽ đọc $28thay vào đó là phần bù và việc thực thi sẽ được tiến hành tại $0c, như bên dưới.
  • Khi $28biến mất, $0cđược giải mã là inc c. Tải trọng không quan tâm c.
  • Xóa $0c- đó là những gì nop dành cho. Mặt khác, byte đầu tiên của tải trọng sẽ được đọc là phần bù nhảy và chương trình sẽ nhảy vào bộ nhớ chưa được khởi tạo.

Bản thân trọng tải khá đơn giản. Tôi nghĩ rằng kích thước nhỏ của chuỗi làm cho cách tiếp cận này nhỏ hơn một vòng lặp và việc tạo ra vị trí độc lập theo cách này sẽ dễ dàng hơn. Các etrong beeplặp đi lặp lại, vì vậy tôi có thể cạo một ld a. Ngoài ra, bởi vì tất cả bộ nhớ giữa $0038$8000được zeroed, tôi có thể lọt qua nó và sử dụng một ngắn hơn rstbiến thể của callhướng dẫn, mà chỉ hoạt động cho $0, $8, $10và như vậy, lên đến $38.

Phương pháp cũ hơn

64 byte

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 byte

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 byte

Điều này có một lời giải thích trong lịch sử chỉnh sửa, nhưng nó không quá khác biệt.

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

Điều gì xảy ra nếu: bất kỳ đầu ra không trống nào cũng tốt thay vì tiếng bíp

1 byte

v

haltLà chương trình bình thường, nhưng nếu bức xạ loại bỏ nó, thì bộ nhớ sẽ chứa đầy số 0, $8000thực hiện vô số lần, in rất nhiều byte rỗng.


abắt đầu từ 0, bạn không thể sử dụng or a, (N);thay vì ld a, (N); and a;? Có vẻ như bạn có thể lưu một vài byte theo cách đó.
Neil

@Neil Câu hỏi hay! Thật không may, trên Z80, chỉ các hướng dẫn tải mới có thể lấy địa chỉ như thế này.
NieDzejkob

Ugh, đã quá lâu kể từ khi tôi thực hiện bất kỳ chương trình Z80 nào ... có lẽ tôi đã nghĩ đến or a, (ix + N)?
Neil

@Neil thực sự tồn tại và IX cũng bắt đầu từ 0 ... thật không may, việc lưu một byte trong khu vực đó làm cho các byte thay đổi theo cách mà 20 19lúc ban đầu trở thành 20 18và loại bỏ việc 20tạo ra một bước nhảy vô điều kiện, vì vậy a nop phải được thêm vào sau lần nhảy đầu tiên trong chương trình, đảo ngược việc lưu byte.
NieDzejkob

Ah, đó là một sự xấu hổ. Cảm ơn vì đã kiểm tra!
Neil


4

Klein , một trong mỗi cấu trúc liên kết, tổng cộng 291 byte

Sau khi thấy câu trả lời của WW bằng cách sử dụng001 cấu trúc liên kết, tôi quyết định xem việc làm Geiger Counter sẽ khó đến mức nào đối với mỗi cấu trúc liên kết. (Spoiler: rất khó. Thật khó để tìm ra con trỏ sẽ đi đâu mà không có cử chỉ tay khiến tôi trông giống như tôi đang tìm ra tay nào là tay trái của mình)

Xác minh!

(Tôi cũng đã nghĩ về việc viết một chương trình là bộ đếm Geiger hợp lệ trên tất cả các cấu trúc liên kết, nhưng điều đó có thể phải chờ. Nếu có ai khác muốn thử, tôi sẽ cung cấp một khoản tiền thưởng 500 rep)

000 và 010, 21 byte

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

Hãy thử 000 trực tuyến! thử 010 trực tuyến!

Điều này được chuyển từ ><>giải pháp của tôi . Điều này rõ ràng hoạt động trong 000, vì đó là cấu trúc liên kết mặc định cho hầu hết các ngôn ngữ 2D, nhưng tôi đã ngạc nhiên rằng nó cũng hoạt động 010.

001 và 011, 26 byte

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

Hãy thử 001 trực tuyến! thử 011 trực tuyến!

Điều này được sao chép trực tiếp từ câu trả lời của WW . Cảm ơn!

100, 21 byte

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

Hãy thử trực tuyến!

101, 21 byte

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

Hãy thử trực tuyến!

110, 26 byte

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

Hãy thử trực tuyến!

111, 24 byte

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

Hãy thử trực tuyến!

200, 21 byte

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

Hãy thử trực tuyến!

201, 31 byte

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

Hãy thử trực tuyến!

Cho đến nay khó chịu nhất.

210, 26 byte

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

Hãy thử trực tuyến!

211, 27 byte

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

Hãy thử trực tuyến!

Người duy nhất mà tôi phải xử lý việc nhập tiếng bíp qua bên phải.


Tôi sẽ hạnh phúc thứ hai tiền thưởng đó.
Thuật sĩ lúa mì


2

Bùa mê , 29 byte

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

Hãy thử trực tuyến!

Về cơ bản giống như câu trả lời của Klein 000 hoặc> <> câu trả lời (tôi bắt đầu với câu trả lời của Klein). Sự thay đổi duy nhất thực sự cần thiết là biến <thành L.thành  (dịch các ký hiệu lệnh), chèn các điểm nhập IP (cần 2, nếu không việc xóa sẽ dẫn đến một chương trình không biên dịch) và chèn delay lệnh để có được hai IP để hợp nhất (do đó chỉ in một beep), một lần nữa, cần hai. Cũng yêu cầu chèn thêm NOP để giữ độ dài dòng giống nhau. Klein thuận tiện cũng sử dụng@ cho "in và chấm dứt."

Không có khả năng sử dụng khoảng trắng ở phía dưới bên trái, vì bất kỳ gương phản xạ nào để thay đổi hướng đều ức chế khả năng phát hiện bức xạ. ví dụ: (26 byte, được chiếu xạ y):

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

In không có đầu ra, do phân đoạn nhập bị uốn cong gây ra phản xạ lại cho đầu cuối của dòng dưới.



1

Wumpus , 37 34 32 31 byte

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

Hãy thử trực tuyến! Xác minh!

Giải pháp này sử dụng thực tế là .nhảy đến một vị trí mô đun độ dài của chương trình.

Hoặc cho cùng một lượng byte


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

Hãy thử trực tuyến! Xác minh!

Cái này sử dụng sự khác biệt theo hướng của con trỏ cho độ dài dòng lẻ và chẵn. (Tôi không thực sự biết cách đầu tiên "thực sự hoạt động khi dòng mới bị xóa)


1

Klein (001), 26 byte

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

Hãy thử trực tuyến!

Kiểm chứng!

Giải trình

Chương trình này tận dụng cấu trúc liên kết độc đáo của Klein, đặc biệt là 001 cấu trúc liên kết , đó là một chai Klein.

Unedited chương trình theo đường dẫn thực hiện:

Con đường màu cam

Xóa một byte khỏi chương trình có thể ảnh hưởng đến chương trình theo 4 cách (mỗi cách trong một màu khác nhau):

Phần chương trình

Điều đầu tiên cần lưu ý là <<sẽ luôn làm chệch hướng ip ở bên trái của điểm gốc khi bắt đầu. Nếu một trong các <s bị xóa thì cái kia sẽ thay thế nó. Vì vậy, nếu bất kỳ byte nào bị xóa khỏi phần màu đỏ, đường dẫn thực hiện sau sẽ được theo sau:

Con đường màu đỏ

Nếu byte màu xanh bị loại bỏ, chúng ta sẽ có đường dẫn rất đơn giản:

nhập mô tả hình ảnh ở đây

Nếu dòng mới bị xóa, chúng tôi nhận được đường dẫn:

Con đường xanh

Con đường màu vàng phức tạp hơn một chút. Vì dòng dưới cùng dài hơn dòng trên cùng, khi chương trình được bình phương khi bắt đầu thực thi, một ký tự ảo được thêm vào cuối dòng đầu tiên để làm cho chúng có cùng kích thước. Nếu bất kỳ byte nào trên dòng thứ hai bị loại bỏ, dòng đó sẽ được rút ngắn và ký tự ảo đó không được thêm vào. Điều này rất quan trọng vì !thông thường nhảy qua nhân vật ảo, nhưng thay vào đó, nó lại nhảy qua /.

Con đường màu vàng


1
Bạn có thể cổng tôi ><>giải pháp trong 000cho 21 byte
Jo Vua

@JoKing Tôi nghĩ rằng nó sẽ tốt hơn như là câu trả lời của chính nó.
Phù thủy lúa mì

1

Trái tay , 25 21 byte

vv""ppeeeebb""jjHH@

Hãy thử trực tuyến! Xác minh!

Điều này sử dụng khả năng của Backhand để thay đổi giá trị bước con trỏ để bỏ qua một lệnh mỗi bước và giải quyết gọn gàng vấn đề bù đắp. Sau đó, nó sử dụng jlệnh để kiểm tra xem mã có được chiếu xạ hay không bằng cách nhảy đến ký tự cuối cùng ( @, tạm dừng) nếu không và nhảy đến ngăn thứ hai cuối cùng ( H, tạm dừng và ngăn xếp đầu ra) nếu có.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.