Що ми забули?


31

Ваше завдання - написати непусту комп'ютерну програму, що складається з деякої послідовності байтів. Якщо ми виберемо певний байт у програмі та видалимо всі його екземпляри з програми, модифікована програма повинна вивести видалений байт.

Наприклад, якби наша програма була

aabacba

Тоді bcbб вивести a, aaacaпотрібно було б вивести bіaababa виводити c.

Не має значення, що робить немодифікована програма.

Відповіді будуть набиратися в байтах, мета - мінімізувати кількість байтів.


4
Оскільки цей виклик не позначений quine, чи можемо ми прочитати власний вихідний код?
Денніс

1
@Dennis Sure. Be my guest
Wheat Wizard

2
If all the bytes in our program represent digits, may we output via exit code?
Mr. Xcoder

15
I think this would be better as a code challenge where you have to maximise the number of discrete characters used.
Notts90

2
Should've specified more than 1 byte instead of non-empty :P. Or what Notts90 said.
Magic Octopus Urn

Відповіді:


70

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

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

Depends on coreutils + dc.

Try it online!

That was... a journey.

Ця відповідь має три частини. Перші 4 рядки обробляють певні особливі випадки для спрощення коду, що випливає. Наступні два рядки і останній рядки виконують по суті одне і те ж, але саме один запускається з будь-яким видаленням символів. Вони записуються в основному взаємодоповнюючими наборами символів, так що видалення будь-яких символів порушує лише один максимум, що дозволяє іншому продовжувати функціонувати.

Дивлячись на першу частину, ми спочатку справляємося

  • видалення нового рядка з ec\nho \\n
  • видалення місця з ca t<<<$'\x20'(з подальшим exi tуникненням запуску більш пізнього коду, що призведе до стороннього виводу)
  • $видалення з d$c -e8BC6P( 8BC6= 9226є 36*256 + 10, а 36 і 10 - значення байтів $символів і рядків у новому рядку відповідно; ми використовуємо шістнадцяткові цифри у десяткових знаках, щоб уникнути необхідності включення їх у великий коментар у рядку 6)
  • 0видалення з d0c -eKp( Kотримує десяткову точність, яка 0за замовчуванням)

У наступній частині використовуються єдині символи (окрім сміття в кінці другого рядка) $'\01234567v;, пробіл та новий рядок. З них четверо були обліковані, тому решта ( '\1234567v) не може бути в останньому рядку. Розгортаючи восьмеричні втечі ( $'\123'представляє символ ASCII зі значенням 123 8 ), отримуємо:

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

Перший рядок пробирає всі символи, які використовуються в програмі, і шукає кожного з них у власному вихідному коді ( $0це ім'я файлу запущеного сценарію), друкуючи будь-який символ, який не знайдено.

Другий рядок виглядає дещо дивно, і, здається, робить те саме, що і exitз купою сосків. Однак кодування exitяк вісімкового прямо призводить до того $'\145\170\151\164', що не містить 2або 3. Нам фактично потрібно зробити це менш стійким до видалення. Це відбувається тому, що якщо будь-який з '\014567vвидалених, порушуючи перший рядок, другий рядок також розривається, дозволяючи виконувати залишок коду. Однак нам це потрібно, щоб воно також було розірвано, якщо 2або 3видалено, щоб лінії 3 і 4 могли працювати. Це досягається за допомогою вбирання в :і;, which have a 2 and 3 in their octal representation respectively.

Небажана в кінці рядка 2 просто є для того, щоб кожен друкуваний символ ASCII, який можна роздрукувати, з’явився хоча б один раз, оскільки цього вимагає спосіб перевірки шляхом прокручування кожного з них.

Якщо exitв першому розділі не було викликано (тобто воно було порушено видаленням одного з '\01234567v), ми переходимо до другого, в якому ми повинні виконати те саме, не використовуючи жодного з цих символів. Останній рядок схожий на декодований перший рядок, за винятком того, що ми можемо скоротити діапазон циклу, щоб зберегти кілька байт, тому що ми вже знаємо, що всі символи, за винятком '\01234567v, були охоплені. Він також має 0# $#перед цим, який коментує це та заважає йому створювати сторонні результати, якщо 0або $були видалені.


5
Wow, very impressive considering the amount of distinct characters involved! Definitely looking forward seeing that explanation.
Kevin Cruijssen

3
@KevinCruijssen here you go :)
Doorknob

1
@Doorknob if this doesn't win you 548 internets, I don't know what does. Honestly, the 603 byte version is just as impressive hah!
Magic Octopus Urn

3
The only interesting answer so far.
htmlcoderexe

21

Retina, 1 byte

1

Try it online!

When all instances of the single byte (1) are removed, the output is 1. Simple enough.


6
I was browsing TIO to find something like this - you beat me to it. Btw this is a polyglot, works with Snails
JayCe

IMO, this answer should be upgraded to a polyglot answer as the first one (possibly with a forever-incomplete list of languages), and the other two downvoted to oblivion. Oh, and this also works in C.

@Rogem I'm not sure what you mean by "this works in C." do you have a C compiler which outputs 1 for the empty program? Regardless, I think the answers in question utilize different approaches and behaviours. IMO a polyglot answer is only warranted if the approach remains the same. (Objectively, this isn't a polyglot as the actual code is different, for the answers below.) Feel free to vote how you want, but a valid answer is a valid answer. I will keep my answer as it is, I don't wish to house a collection of answers on it.
Conor O'Brien

11

Lenguage, 216173027061157310 bytes

216173027061157310 = (144115617572598740 + 144115241762960340 + 144115194786755540) / 2. There are 216173027061157310 - 144115617572598740 $s, 216173027061157310 - 144115241762960340 #s and 216173027061157310 - 144115194786755540 spaces.

The 144115617572598740 #s and spaces encode the following BF program:

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

Try it online!

The 144115241762960340 $s and spaces encode the following BF program:

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

Try it online!

The 144115194786755540 $s and #s encode the following BF program:

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

Try it online!

Edit: Saved 72057832274401770 bytes thanks to @Nitrodon.


Why not use U and byte 127? Try it online! Or even just the nul byte and soh?
Jo King

@JoKing I didn't know that U was the shortest printable ASCII byte that could be output. I didn't want to use unprintable bytes.
Neil

Even without taking advantage of wrapping cells or unprintable characters, you can get this down to 216173027061157310 bytes by including the space character as a third distinct byte.
Nitrodon

7
I can't help but upvote because of "Edit: Saved 72057832274401770 bytes..."
Mr Lister


9

Polyglot*, 1 byte (awaiting confirmation)

0

Try it online! (using Triangularity)

*: This works in a (rather wide) variety of languages (except for esolangs like 4, ><> and the like and some other exceptions). Identical to the Jelly answer in source code, but the method of I/O is different – Output is via exit code. When one removes 0 from the source code, they're left with an empty program, which often doesn't error and yields exit code 0 in the majority of languages.



3

Unary (non-competitive), 96 bytes

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

Here is xxd dump.

A wider definition of Unary language allows any characters in its source code. But I havn't find a compiler or interpreter which would work for this. So I marked this answer as non-competitive. If you can find one which posted before this question asked, I will link to it.


4
This is the smallest Unary program I've ever seen.
Draco18s
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.