Chúng ta đã quên điều gì?


31

Nhiệm vụ của bạn là viết một chương trình máy tính không trống bao gồm một số chuỗi byte. Nếu chúng ta chọn một byte cụ thể trong chương trình và loại bỏ tất cả các thể hiện của nó khỏi chương trình, chương trình đã sửa đổi sẽ xuất ra byte bị loại bỏ.

Ví dụ nếu chương trình của chúng tôi là

aabacba

Sau đó bcbsẽ đầu ra a, aaacasẽ cần đầu ra baababasẽ đầu ra c.

Nó không quan trọng những gì chương trình không sửa đổi làm.

Câu trả lời sẽ được tính theo byte với mục tiêu là giảm thiểu số lượng byte.


4
Vì thử thách này không được gắn thẻ quine, chúng tôi có thể đọc mã nguồn của riêng mình không?
Dennis

1
@Dennis Chắc chắn rồi. Hãy là khách của tôi
Wheat Wizard

2
Nếu tất cả các byte trong chương trình của chúng tôi đại diện cho các chữ số, chúng tôi có thể xuất qua mã thoát không?
Ông Xcoder

15
Tôi nghĩ rằng điều này sẽ tốt hơn khi thử thách mã trong đó bạn phải tối đa hóa số lượng ký tự riêng biệt được sử dụng.
Notts90

2
Nên đã chỉ định nhiều hơn 1 byte thay vì không trống : P. Hoặc những gì Notts90 nói.
Bạch tuộc ma thuật Urn

Câu trả lời:


70

zsh, 603 594 566 561 548 440 415 399 378 370 byte

ec
ho \\n;ca t<<<$'\x20';exi t
d$c -e8BC6P
d0c -eKp
$'\172\163\150' $'\055\143' $'\146\157\162 v \151\156 \173\043\056\056\134\175\175\073\173 \146\147\162\145\160 \055\161 $\166 '$0$'\174\174\074\074\074$\166\073\175'
$'\145v\141\154' $':\073\072\046\046\145\170\151\164';#%&()*+,/9=>?@ADEFGHIJLMNOQRSTUVWXYZ[]^_`jklmsuwy
0# $#;for b in {$..z};{ fgrep -q $b $0||<<<$b;}

Phụ thuộc vào coreutils + dc.

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

Đó là ... một hành trình.

Câu trả lời này có ba phần. 4 dòng đầu tiên xử lý một số trường hợp đặc biệt để đơn giản hóa mã theo sau. Cả hai dòng tiếp theo và dòng cuối cùng đều thực hiện cùng một thứ, nhưng chính xác thì một dòng được chạy với bất kỳ loại bỏ ký tự nào. Chúng được viết với hầu hết các bộ ký tự bổ sung, do đó việc loại bỏ bất kỳ ký tự nào chỉ phá vỡ tối đa một ký tự, cho phép các ký tự khác tiếp tục hoạt động.

Nhìn vào phần đầu tiên, chúng tôi xử lý đầu tiên

  • xóa dòng mới với ec\nho \\n
  • loại bỏ không gian bằng ca t<<<$'\x20'(theo sau exi tđể tránh chạy mã sau này, điều này sẽ dẫn đến đầu ra không liên quan)
  • $loại bỏ với d$c -e8BC6P( 8BC6= 9226is 36*256 + 10và 36 và 10 là các giá trị byte của các $ký tự và dòng mới tương ứng, chúng tôi sử dụng các chữ số thập phân ở dạng thập phân để tránh phải đưa chúng vào nhận xét lớn trong dòng 6)
  • 0xóa bằng d0c -eKp( Klấy độ chính xác thập phân, 0theo mặc định)

Trong phần tiếp theo, các ký tự duy nhất được sử dụng (ngoài thùng rác ở cuối dòng thứ hai) là $'\01234567v;, khoảng trắng và dòng mới. Trong số này, bốn cái đã được tính, vì vậy phần còn lại ( '\1234567v) không thể xảy ra ở dòng cuối cùng. Mở rộng các lối thoát bát phân ( $'\123'đại diện cho ký tự ASCII có giá trị 123 8 ), chúng tôi nhận được:

zsh -c 'for v in {#..\}};{ fgrep -q $v '$0'||<<<$v;}'
eval ':;:&&exit'

Dòng đầu tiên lặp qua tất cả các ký tự được sử dụng trong chương trình và tìm kiếm từng ký tự trong mã nguồn riêng của nó ( $0là tên tệp của tập lệnh đang chạy), in bất kỳ ký tự nào không tìm thấy.

Dòng thứ hai trông hơi lạ, và dường như làm điều tương tự như exitvới một loạt các cảnh sát. Tuy nhiên, mã hóa exitdưới dạng bát phân trực tiếp dẫn đến $'\145\170\151\164', không chứa 2hoặc 3. Chúng tôi thực sự cần phải làm cho điều này ít đàn hồi hơn để loại bỏ. Điều này là do nếu bất kỳ phần nào '\014567vbị xóa, phá vỡ dòng đầu tiên, dòng thứ hai cũng bị phá vỡ, cho phép phần còn lại của mã được thực thi. Tuy nhiên, chúng tôi cần nó cũng bị 2hỏng nếu hoặc 3bị xóa để dòng 3 và 4 có thể chạy. Điều này được thực hiện bằng cách đánh giày :;, có 2 và 3 trong biểu diễn bát phân của chúng tương ứng.

Rác ở cuối dòng 2 chỉ đơn giản là ở đó để đảm bảo mọi ký tự ASCII có thể in xuất hiện ít nhất một lần, vì cách kiểm tra được thực hiện bằng cách lặp qua từng yêu cầu này.

Nếu exitkhông được gọi trong phần đầu tiên (nghĩa là nó được xử lý bằng cách loại bỏ một trong số đó '\01234567v), chúng ta chuyển sang phần thứ hai, trong đó chúng ta phải hoàn thành điều tương tự mà không sử dụng bất kỳ ký tự nào trong số này. Dòng cuối cùng tương tự như dòng đầu tiên được giải mã, ngoại trừ việc chúng ta có thể hợp đồng phạm vi của vòng lặp để lưu một vài byte, bởi vì chúng ta đã biết rằng tất cả các ký tự ngoại trừ '\01234567vđã được bao phủ. Nó cũng có 0# $#trước nó, nó nhận xét và ngăn nó tạo ra đầu ra bên ngoài nếu 0hoặc $bị loại bỏ.


5
Wow, rất ấn tượng khi xem xét số lượng nhân vật khác biệt có liên quan! Chắc chắn mong muốn được nhìn thấy lời giải thích đó.
Kevin Cruijssen

3
@KevinCruijssen bạn đến đây :)
Doorknob

1
@Doorknob nếu điều này không mang lại cho bạn 548 internets, tôi không biết nó làm gì. Thành thật mà nói, phiên bản 603 byte cũng ấn tượng không kém!
Bạch tuộc ma thuật Urn

3
Câu trả lời thú vị duy nhất cho đến nay.
htmlcoderexe

21

Võng mạc , 1 byte

1

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

Khi tất cả các thể hiện của byte đơn ( 1) bị loại bỏ, đầu ra là 1. Đủ đơn giản.


6
Tôi đang duyệt TIO để tìm thứ gì đó như thế này - bạn đánh bại tôi với nó. Btw đây là một polyglot, hoạt động với Snails
JayCe

IMO, câu trả lời này nên được nâng cấp thành câu trả lời polyglot như câu trả lời đầu tiên (có thể với danh sách ngôn ngữ không hoàn chỉnh mãi mãi) và hai ngôn ngữ còn lại bị bỏ quên. Oh, và điều này cũng làm việc tại C .

@Rogem Tôi không chắc ý của bạn là "cái này hoạt động trong C." Bạn có trình biên dịch C nào xuất ra 1chương trình trống không? Bất kể, tôi nghĩ rằng các câu trả lời trong câu hỏi sử dụng các cách tiếp cận và hành vi khác nhau. IMO một câu trả lời polyglot chỉ được bảo hành nếu cách tiếp cận vẫn như cũ. (Về mặt khách quan, đây không phải là một polyglot vì mã thực tế là khác nhau, đối với các câu trả lời bên dưới.) Hãy thoải mái bỏ phiếu theo cách bạn muốn, nhưng một câu trả lời hợp lệ là một câu trả lời hợp lệ. Tôi sẽ giữ câu trả lời của mình như vậy, tôi không muốn sở hữu một bộ sưu tập các câu trả lời trên đó.
Conor O'Brien

11

Lenguage, 216173027061157310 byte

216173027061157310 = (144115617572598740 + 144115241762960340 + 144115194786755540) / 2. Có 216173027061157310 - 144115617572598740 $s, 216173027061157310 - 144115241762960340 #s và 216173027061157310 - 144115194786755540không gian.

144115617572598740 #s và dấu cách mã hóa chương trình BF sau:

++++++[>++++++<-]>.

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

144115241762960340 $s và không gian mã hóa chương trình BF sau:

+++++++[>+++++<-]>.

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

144115194786755540 $s và #s mã hóa chương trình BF sau:

++++++++[>++++<-]>.

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

Chỉnh sửa: Đã lưu 72057832274401770 byte nhờ @Nitrodon.


Tại sao không sử dụng Uvà byte 127? Hãy thử trực tuyến! Hay thậm chí chỉ là byte nul và soh?
Jo King

@JoKing Tôi không biết đó Ulà byte ASCII có thể in ngắn nhất có thể xuất ra. Tôi không muốn sử dụng byte không thể in được.
Neil

Ngay cả khi không tận dụng việc bao bọc các ô hoặc các ký tự không thể in được, bạn có thể giảm xuống còn 216173027061157310 byte bằng cách bao gồm ký tự khoảng trắng dưới dạng một byte riêng biệt thứ ba.
Nitrodon

7
Tôi không thể giúp upvote vì "Chỉnh sửa: Đã lưu 72057832274401770 byte ..."
Mr Lister


9

Polyglot * , 1 byte ( đang chờ xác nhận )

0

Hãy thử trực tuyến! (sử dụng hình tam giác)

*: Điều này hoạt động trong một loạt các ngôn ngữ (khá rộng) (ngoại trừ các ngôn ngữ esolang như 4,> <> và tương tự và một số ngoại lệ khác). Đồng nhất với câu trả lời Jelly trong mã nguồn, nhưng phương thức I / O thì khác - Đầu ra là thông qua mã thoát. Khi một người xóa 0khỏi mã nguồn, họ sẽ để lại một chương trình trống, thường không có lỗi và mang lại mã thoát 0 trong phần lớn các ngôn ngữ.



3

Unary (không cạnh tranh), 96 byte

00000000: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000050: 0000 0000 0101 0101 0101 0101 0101 0101  ................

Đây là xxd bãi rác.

Một định nghĩa rộng hơn về ngôn ngữ Unary cho phép bất kỳ ký tự nào trong mã nguồn của nó. Nhưng tôi không tìm thấy trình biên dịch hoặc trình thông dịch nào hoạt động cho việc này. Vì vậy, tôi đánh dấu câu trả lời này là không cạnh tranh. Nếu bạn có thể tìm thấy một bài đăng trước câu hỏi này, tôi sẽ liên kết với nó.


4
Đây là chương trình Unary nhỏ nhất tôi từng thấy.
Draco18
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.