Máy dò phóng xạ!


26

Chương trình làm cứng bức xạ là một chương trình trong đó, nếu bất kỳ ký tự nào của mã bị loại bỏ, chương trình vẫn sẽ hoạt động như cũ. Đối với câu hỏi này, chúng tôi sẽ viết một chương trình phát hiện khi nó được chiếu xạ.

Viết chương trình hoặc hàm, khi bất kỳ byte đơn nào bị loại bỏ, chương trình kết quả sẽ xuất ra byte đó và chỉ byte đó. ( Bạn có thể xuất byte đó nhiều lần, miễn là bạn không xuất bất kỳ byte nào khác )

Quy tắc:

  • Chương trình phải chứa ít nhất 2 byte riêng biệt. (Không có giải pháp nào chỉ là 0 giây;)
  • Không quan trọng chương trình gốc làm gì
  • Không đọc mã nguồn của riêng bạn.
  • Mã sẽ được ghi vào số byte riêng biệt, trong đó số tiền cao nhất sẽ thắng. Ví dụ: abc= 3 điểm, ababba= 2 điểm, abcthắng.
    • Tie-breaker là số byte nhỏ hơn, theo sau là thời gian gửi trước đó

Chúc may mắn!



Tôi đã bỏ lỡ dòng đó. Thật xấu hổ cho tôi!
Mego

5
"Mã sẽ được ghi vào số lượng ký tự riêng biệt, trong đó số tiền cao nhất sẽ thắng." Tôi hy vọng rằng hầu hết các giải pháp (nếu không phải là tất cả) sẽ có một số dạng chuỗi ở đâu đó mà chúng chỉ có thể đệm với các ký tự tùy ý mà không thực sự thay đổi giải pháp (vì vậy, liệu ngôn ngữ của bạn có bị hạn chế đối với ASCII, ASCII mở rộng hay Unicode không) .
Martin Ender

3
... Hộp cát không hoàn hảo. :( / Bạn chỉ có thể đo "byte riêng biệt" thay vì "ký tự riêng biệt", bởi vì các ký tự có liên quan đến mã hóa và các vấn đề khác.
user202729

1
Chương trình có thể lấy bất kỳ đầu vào?
gggg

Câu trả lời:


15

05AB1E , 9 7 byte (Điểm 3)

22'''rr

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

Loại bỏ một '

Với bất kỳ 'loại bỏ nào , 22''rrsẽ dẫn đến 22 là điều đầu tiên trên ngăn xếp và 'là điều cuối cùng trên ngăn xếp, khi đảo ngược hai lần sẽ dẫn đến kết quả '.

Xóa một r

Với bất kỳ rloại bỏ nào , 22'''rkết quả là 22 là thứ đầu tiên trong stack, 'là thứ thứ hai trong stack và rlà thứ cuối cùng trong stack. Đây r, tuy nhiên, đã được preceeded bởi một 'mà làm cho nó trở thành chuỗi chữ "r"(như trái ngược với lệnh reverse stack), được mặc nhiên được in ra.

Loại bỏ một 2

Với bất kỳ 2loại bỏ nào , 2'''rrsẽ dẫn đến 2việc là thứ đầu tiên trong ngăn xếp, 'là thứ thứ 2 trên ngăn xếp và cuối cùng rlà thứ cuối cùng trên ngăn xếp, khi đảo ngược một lần sẽ dẫn đến kết quả 2.

Do đó, câu trả lời này là hợp lệ. Không có gì loại bỏ nó đầu ra ', đó là không liên quan. Điều này làm việc cho bất kỳ số nào ngoài 2 là tốt.


Đã tạo trình kiểm tra tính hợp lệ, bạn có thể sử dụng nó để cạnh tranh trong 05AB1E *.

* Tôi không chắc chắn 100% có bao nhiêu giải pháp thậm chí có thể có trong 05AB1E ...


Các giải pháp hợp lệ khác tệ hơn hoặc giống nhau

  • 1 điểm (không hợp lệ)
  • 2 điểm
    • '''''''VV, '''''''XXhoặc'''''''<any command that pops a without pushing>x2
    • Bất kỳ số lẻ nào 'trên 3 được theo sau bởi bất kỳ số chẵn nào strên 1 (EG '''''''''ssss).
    • '''..với bất kỳ số lượng thời gian trên 1 và bất kỳ số lẻ 'trên 2.
  • 3 điểm
    • '\\'''rr- cùng ý tưởng với 22'''rrnhưng \là 'loại bỏ mục ngăn xếp cuối cùng'.

Đầu ra bình thường 'là không liên quan bởi các quy tắc, như bạn nói. Nhưng nó không làm mất hiệu lực mục tiêu danh nghĩa của việc phát hiện dị thường, điều này hơi buồn cười.
gggg

1
@gggg Tôi khá chắc chắn ít nhất MỘT trong số các lựa chọn thay thế của tôi không in gì cả lol.
Bạch tuộc ma thuật Urn

1
@MagicOctopusUrn Bạn được chào đón. Chỉ cần nghĩ rằng tôi cũng có thể chỉnh sửa thay vì bình luận.
boboquack

@boboquack đã làm thẻ gốc của tôi (@boboquack) hoạt động hay bạn đã tìm thấy nó bằng cách xem lại bài đăng? Tôi đang cố gắng tìm ra cách các thẻ hoạt động khi người dùng không bao giờ bình luận lol.
Bạch tuộc ma thuật Urn

@boboquack Ý tôi là bạn đã nhận được thông báo từ "cảm ơn" của tôi chưa? Ngoài ra, có lẽ chúng ta nên xóa chủ đề này cho đến khi +1 của tôi cho "Bạn được chào đón".
Bạch tuộc ma thuật Urn

9

Brainfuck, Điểm 3

Có thể không được lọc vì đầu ra chỉ được nhìn thấy qua kết xuất bộ nhớ.

+++++++++++++++++++++++++++++++++++++++++++++,-

Giả sử đầu vào trống và EOF không thay đổi ô. Sử dụng một trình thông dịch đưa bộ nhớ vào một đầu ra, chẳng hạn như bộ thông dịch này .

Xóa một dấu cộng và bộ nhớ là giá trị unicode cho "+", nếu không nó là giá trị unicode cho ",". Nó không chỉ là một quy tắc uốn cong hơn là một câu trả lời. Khá giống với "-". Lạm dụng thực tế là ba ký tự này nằm sau nhau trong bộ ký tự unicode.


Thông minh, thành thật mà nói, đừng nghĩ đó là một lỗ hổng.
Bạch tuộc ma thuật Urn

Bạn đang giả sử EOF khiến tế bào không thay đổi, đúng không?
Jo King

Vâng, và miễn là không có đầu vào, nó sẽ ổn thôi 😊
Håvard Nygård

Tôi muốn cho phép điều này, nhưng bạn một trình thông dịch có kết xuất bộ nhớ sẽ chỉ xuất ra các ô đã thay đổi và giữ cho ô không thay đổi trên EOF không?
Jo King

1
copy.sh/brainfuck Cái này sẽ hoạt động tốt. Chỉ cần chạy nó và nhấn "xem bộ nhớ".
Håvard Nygård

9

Cây lê, 256 byte riêng biệt, 975 byte

Thật không may, câu hỏi khá nhiều đòi hỏi một giải pháp tối ưu để chứa một byte NUL ở đâu đó (vì nó cần phải chứa tất cả 256 byte ở đâu đó). Điều này có nghĩa là a) Tôi không thể cung cấp cho bạn một liên kết TIO (vì TIO không thích NUL trong các chương trình, hoặc ít nhất, tôi đã không tìm ra cách để nhập nó mà trình duyệt của tôi có thể đối phó) và b) Tôi không thể dán chương trình vào Stack Exchange theo nghĩa đen. Thay vào đó, tôi đã đặt một xxdhexdump có thể đảo ngược được ẩn đằng sau liên kết "đoạn mã" bên dưới.

Giải trình

Chương trình này bao gồm ba phần giống hệt nhau. (Ghép nhiều phần giống hệt nhau của một chương trình là một chủ đề đối với tôi trong các chương trình .) Mỗi ​​Cây lê yêu cầu một tổng kiểm tra ở đâu đó để thông dịch viên biết phần nào của chương trình sẽ chạy; nó xoay bất kỳ phần nào của chương trình mà tổng kiểm tra thành công khi bắt đầu trước khi chạy nó (hoặc in a partridgenếu không có tổng kiểm tra khớp). Trong trường hợp này, chúng tôi có một tổng kiểm tra trên mỗi ba phần, và do đó một phần không chiếu xạ sẽ chuyển sang bắt đầu. Vì vậy, chúng ta có thể giả định rằng chương trình bao gồm một phần chưa sửa đổi, tiếp theo là hai phần khác (một trong số đó có thể đã được sửa đổi).

Mỗi phần bắt đầu bằng một dòng mới, sau đó tiếp tục với đoạn mã sau (Tôi đã thêm khoảng trắng và nhận xét bên dưới):

$z{$/}++;      # In the hash table %z, set the key "\n" to 1
$/=$\=$@;      # Turn off newline handling when reading ($/ = undef);
               # Also don't add newlines when printing ($\ = undef)
               # $@ is set to undef by default
!$z{$_}?       #   If the current character is not in the hash table %z
  $z{$_}=1:    #   place it in the hash table %z
  delete$z{$_} #   else remove it from the hash table %z
for split//,   # for each character in
    <DATA>;    # the text appearing from the line beneath __DATA__ to EOF
print          # Print the following (no newline because $\ was undefined):
  keys%z>5?    # if the hash table %z contains more than 5 elements:
  "\n":        #   a newline; otherwise
  keys%z;      #   every key of %z, separated by spaces
__DATA__       # Start a string literal running from after this line to EOF

Sau đó, một bản sao của mọi octet chưa được sử dụng trong chương trình cho đến nay (hoàn toàn là để tăng điểm) và cuối cùng là tổng kiểm tra. (Không có dòng mới nào; các phần bắt đầu bằng một dòng mới nhưng không kết thúc bằng một dòng mới.)

Có ba trường hợp riêng biệt ở đây:

  • Một ký tự không phải là một dòng mới đã bị xóa . Trong trường hợp này, nó sẽ xuất hiện một số lần lẻ trong phần thứ hai và thứ ba. Điều đó có nghĩa là nó sẽ được thêm và / hoặc xóa khỏi %zsố lần lẻ, cuối cùng kết thúc trong bảng băm. Trên thực tế, nó sẽ là khóa duy nhất trong bảng băm (vì chuỗi chạy từ sau dòng mới của phần thứ hai đến hết phần thứ ba và bảng băm bắt đầu chỉ bằng một dòng mới), vì vậy nó ' sẽ chỉ được in ra trên chính nó.
  • Dòng mới đầu tiên hoặc thứ ba đã bị xóa . Trong trường hợp này, chương trình sẽ được xoay vòng sao cho nó là phần thứ ba trong số các dòng mới bị thiếu, kết hợp hiệu quả phần thứ hai và thứ ba thành một dòng duy nhất. Chuỗi ký tự được truy cập thông qua <DATA>chứa mỗi ký tự một số lần chẵn, do đó bảng băm sẽ có nội dung ban đầu, một dòng mới và sẽ được in.
  • Dòng mới thứ hai đã bị xóa . Trong trường hợp này, chương trình sẽ không được xoay (vì phần đầu tiên có tổng kiểm tra hợp lệ), vì vậy phần thứ hai sẽ được chuyển lên cùng dòng với phần đầu tiên. <DATA>chỉ bắt đầu đọc từ dòng bên dưới __DATA__, vì vậy nó sẽ chỉ nhìn thấy phần thứ ba. Điều này có nhiều hơn năm ký tự xuất hiện một số lần lẻ, vì vậy nó sẽ kích hoạt trường hợp đặc biệt để in một dòng mới.

xác minh

Một điều cuối cùng phải được kiểm tra gần như bất kỳ chương trình Cây lê nào được làm cứng bằng bức xạ là liệu việc xóa có xảy ra ngẫu nhiên gây ra một phần không mong muốn của mã để kiểm tra chính xác và xoay mã sai vị trí hay không; cho rằng chúng tôi đang sử dụng tổng kiểm tra 32 bit, điều này là không thể nhưng không phải là không thể. Tôi đã sử dụng tập lệnh brute-force sau đây để đảm bảo rằng điều này không xảy ra đối với bất kỳ thao tác xóa nào:

use 5.010;
use IPC::Run qw/run/;
use warnings;
use strict;
use Data::Dumper;
$Data::Dumper::Useqq=1;
$Data::Dumper::Terse=1;
$Data::Dumper::Indent=0;
undef $/;
$| = 1;
my $program = <>;

for my $x (0 .. (length($program) - 1)) {
    my $p = $program;
    my $removed = substr $p, $x, 1, "";
    alarm 4;
    say Dumper($p);
    run [$^X, '-M5.010', 'apeartree.pl'], '<', \$p, '>', \my $out, '2>', \my $err;
    if ($out ne $removed) {
        print "Unexpected output deleting character $x ($removed)\n";
        print "Output: {{{\n$out}}}\n";
        print "Errors: {{{\n$err}}}\n";
        exit;
    }
}

say $program;
run [$^X, '-M5.010', 'apeartree.pl'], '<', \$program, '>', \my $out, '2>', \my $err;
if ($out ne '') {
    print "Unexpected output not mutating\n";
    print "Output: {{{\n$out}}}\n";
    print "Errors: {{{\n$err}}}\n";
    exit;
}

say "All OK!";

Kịch bản xác minh xác nhận rằng chương trình này hoạt động chính xác.


7

Stax , 11 byte (Điểm 4)

'''cc'~~'dd

Chạy và gỡ lỗi trực tuyến!

Tôi rất vinh dự khi có câu trả lời đầu tiên (theo thời gian) cho thử thách này với số điểm cao hơn hoặc bằng 4. Có lẽ điểm số có thể còn cao hơn nữa.

Trong Stax, một chuỗi ký tự bao gồm một ký tự đơn được viết cùng ', vì vậy '', 'c, 'd, '~tất cả các chuỗi ký tự. Các lệnh tương ứng cho c d~có nghĩa là nhân đôi đỉnh của ngăn xếp chính, bật đỉnh của ngăn xếp chính và bật đỉnh của ngăn xếp chính và lần lượt đẩy vào ngăn xếp đầu vào. Đối với thử thách này, ngăn xếp đầu vào không ảnh hưởng đến đầu ra và không quan trọng, do đó chúng ta có thể nói d~giống hệt nhau.

Giải trình

Tốt nhất là chia mã thành nhiều phần và xem xét chúng một cách riêng biệt.

Khi nó không bị can thiệp, '''ccđẩy một nghĩa đen 'và nghĩa đen cvào ngăn xếp chính và sao chép đỉnh, vì vậy ngăn xếp sẽ là (từ dưới lên) c,c,'.

Khi không bị giả mạo, '~~đẩy nghĩa đen ~và sau đó bật nó (và đẩy vào ngăn xếp đầu vào), về cơ bản là không có op cho ngăn xếp chính.

Khi không bị giả mạo, 'ddđẩy nghĩa đen dvà sau đó bật nó, một no-op khác cho ngăn xếp chính.

Vào cuối chương trình, vì không có đầu ra rõ ràng nào được thực hiện, phần trên cùng của ngăn xếp chính sẽ được in ra hoàn toàn.

Nếu chương trình đang chạy nguyên trạng, ngăn xếp cuối cùng vẫn c,c,'và sẽ xuất ra c.

Nếu phần đầu tiên trở thành ''cc, thì chúng ta có một 'hướng dẫn bằng chữ và hai bản sao, ngăn xếp cuối cùng sẽ là ',','. Cho rằng hai phần khác là không-op, kết quả sẽ là '.

Nếu phần đầu tiên trở thành '''c, kết quả về cơ bản là giống với phần không được chỉnh sửa, nhưng phần cnày không bị trùng lặp. Vì vậy, ngăn xếp sẽ được c,'. Sau hai no-op, đỉnh của ngăn xếp là c.

Vì vậy, chúng ta có thể phát hiện bức xạ trong phần đầu tiên.

Phần thứ hai và phần thứ ba hoạt động theo cùng một cách. Tôi sẽ lấy phần thứ ba làm ví dụ.

Nếu phần thứ ba bị giả mạo, thì hai phần đầu được giữ nguyên trạng và ngăn xếp trước khi chạy phần thứ ba là c,c,'

Nếu phần thứ ba trở thành 'd, một nghĩa đen dđược đẩy lên đỉnh của ngăn xếp chính và không có gì được thực hiện thêm. Đỉnh của ngăn xếp chính bây giờ dsẽ là đầu ra.

Nếu phần thứ ba trở thành dd, hai phần tử được bật ra từ ngăn xếp chính và bây giờ phần trên cùng của ngăn xếp là 'và là đầu ra.

Do đó chúng ta có thể phát hiện bức xạ trong phần thứ ba. Vì lý do tương tự, chúng ta có thể phát hiện bức xạ trong phần thứ hai.


5

05AB1E , điểm 2, 6 byte

„"""„„

Đôi khi in nhân vật bị loại bỏ. Không chứa '.

Làm thế nào nó hoạt động:

Loại bỏ cái đầu tiên

"""„„

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

Đầu tiên, chúng ta đẩy một chuỗi ký tự trống vào ngăn xếp. Sau đó, chúng tôi đẩy „„, được in ngầm.

Loại bỏ một "

„""„„

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

Đầu tiên, chúng tôi đẩy ""đến ngăn xếp với 2-char stringhướng dẫn. Sau đó, chúng tôi cố gắng để có được một chuỗi 2 ký tự khác, nhưng chuỗi này bị hủy bỏ (tôi không chắc chắn chính xác tại sao) và ""được in.

Loại bỏ thứ hai hoặc thứ ba

„"""„

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

Đầu tiên, chúng tôi đẩy ""đến ngăn xếp với 2-char stringhướng dẫn. Sau đó, chúng tôi đẩy , được in ngầm.


5

Jelly , 5 byte, điểm 2

”””ḷḷ

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

Với bất kỳ loại bỏ:

””ḷḷ

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

Các ký tự bắt đầu một ký tự một byte chữ. Chương trình này bắt đầu với ””chuỗi mang lại chuỗi . Con đê lấy lý lẽ trái của nó. Chuỗi chỉ được truyền qua hai trường hợp .

Với bất kỳ loại bỏ:

”””ḷ

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

Trong chương trình này ””mang lại ký tự sau đó ”ḷmang lại ký tự và chỉ có điều này là đầu ra.


Các giải pháp khác

  • Rất nhiều nhân vật khác như ahoặc osẽ làm việc thay cho bài nộp này.
  • ⁾⁾⁾⁾FFF. Điều này hoạt động theo cách tương tự. là như thế nhưng nó bắt đầu một chuỗi hai byte bằng chữ. Các chương trình "chiếu xạ" xuất ra byte bị xóa hai lần, được quy định hợp lệ trong các bình luận.

Đây là một phiên bản Jelly (ít lạ mắt hơn) của trình kiểm tra tính hợp lệ của Magic Octopus Urn. Cột bên trái của đầu ra là ký tự bị xóa và cột bên phải là đầu ra của chương trình kết quả.


Công cụ kiểm tra tính hợp lệ của tôi không thaaat . Nó thất bại cho các giải pháp khác được đăng;).
Bạch tuộc ma thuật Urn
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.