Напишите всю дыру, используя дыру


55

В символы ASCII с десятичным кодом 33 до 126 являются:

!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

Обратите внимание, что в большинстве шрифтов 25 из этих символов имеют «дыры»: ( можно сказать, род больше 0 )

#$%&04689@ABDOPQRabdegopq

Остальные 68 «не вскрытых» персонажей:

!"'()*+,-./12357:;<=>?CEFGHIJKLMNSTUVWXYZ[\]^_`cfhijklmnrstuvwxyz{|}~

Ваша задача - написать самую короткую из возможных программ, используя только символы без отверстий, которые выводят каждый из символов с отверстиями ровно один раз в любом порядке.

Поскольку пробел, табуляция и символы новой строки (перевод строки и / или возврат каретки) являются пустым пространством, они могут появиться в вашей программе или в ее выходных данных. Они по-прежнему рассчитывают на количество символов. Другие символы ASCII не могут использоваться (и, конечно, не символы ASCII).

Примечания

  • Вам не нужно использовать все символы без отверстий или только один из них.
  • Вывод не может содержать незаполненные символы.
  • Язык Пробелы могут быть использованы.
  • Вывод должен идти в стандартный вывод или может идти в файл. Там не должно быть никакого ввода.

Бонус: просто для удовольствия, попробуйте распечатать все символы без отверстий, используя символы с отверстиями. Я скептически отношусь к тому, что это можно сделать на существующем языке.


9
+1 за заголовок. Мы любим такие вещи, как это .
Джейкоб

1
Где решение Perl ?!
Пьер Арло

4
Ну, нет решения в Haskell или C; если это программа, которую вы хотите, то вам нужно по буквам main.
Рифмоид

2
Бонус можно сделать, используя пробел.
Джошуа

1
Как никто не заметил, что я забыл ~??
Увлечения Кэлвина

Ответы:


18

Pyth , 43 35 символов

tTFk"*+,-7;=?GHIKVWXYhiklnvwx"C-Ck7

Попробуй это здесь .

Печатает символы по порядку, за исключением того, что 9 находится в начале, разделены новой строкой.

Строка содержит все символы на 7 больше, чем нужно, за исключением того, что 9 станет @, поэтому он имеет специальный регистр. Алгоритм благодаря @Howard.

Объяснение:

tT                print(10-1)                T=10, t(x)=x-1 if x is an int.
Fk"<string>"      for k in "<string>":
C-Ck7             print(chr(ord(k)-7))       Note that C is overloaded as ord and chr.

24

GolfScript, 37 36 символов

[":=<?)-/! YX[]VIHKx{}|~vih"{25^}/]+

Попробуйте код здесь .

Строка содержит запрещенные символы, xor'ed с 25. К счастью, все символы сопоставлены с действительными.


22

Brainfuck 119

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

ну, --в начале ... Ты возвращаешься к 254 в начальном регистре?
WallyWest

1
Да :) Делает цикл на 36 короче (для того, чтобы добраться до 35)
Теун Пронк

Ну, это, конечно, бьет мои 275 ... молодец ...
WallyWest

@ Увлечения Кэлвина Я вполне уверен, что вход не разрешен, извините. ОП может захотеть уточнить, хотя.
Исаак

@isaacg Я знаю, поэтому мой основной код не требует ввода, а последний пример не является серьезным :)
Teun Pronk

20

Бонус - DC, 179 символов

О, хорошо, еще один ограниченный набор символов, где Pэто разрешено.

6A44469PD684P44D4898PDB99P4008D0BP486B48BPA60BPD096P4A68666P460A0D4P690490AP8084088P6B6AB66P6BBB608P80D4BAAPA046PBAD4P60A6668P480DD96P4A040BBP848BP40DD8D0P46840B6P696B48BP48D64BAP

Поскольку dcэто, по-видимому, достаточно неясно, чтобы требовать объяснений (странно для меня, учитывая странные вещи здесь!), Вот обзор:

Это прежде всего калькулятор RPN с арифметикой произвольной точности. Но для этой задачи я использую Pкоманду, которая интерпретирует число как последовательность символов в базе 256 и печатает их. Примеры: 65 Pотпечатки A(код ASCII 65). 16706 Pотпечатки AB(16706 = 65 * 256 + 66).

Кроме того, единственная другая интересная особенность заключается в том, что он распознает все шестнадцатеричные цифры, 0-9A-Fдаже если они не содержатся в шестнадцатеричном числе. По умолчанию используется десятичный ввод, поэтому входной токен 999означает 9 hundreds + 9 tens + 9и ABCозначает, 10 hundreds + 11 tens + 12что он должен быть эквивалентен 1122.

Возможность использовать цифры ABDв десятичном формате частично компенсирует невозможность использования 12357, а выбор порядка и группировки делает все остальное. (Если мне нужно несколько номеров x, y, zи они не представимы с разрешенными цифрами, то я пытаюсь представляя x*256*256+y*256+zвместо этого.)

Программу, вероятно, можно сделать немного короче, используя большие группы. Я не прошел 3 байта за число.


1
@DigitalTrauma наоборот был бонус в конце постановки задачи.

Ха! Я пропустил это! Отлично! +1
цифровая травма

Вы можете это объяснить? И есть ли место, где мы можем запустить это?
Увлечения Кэлвина

4
Место, где вы можете управлять им? dc не какой-то глупый язык, предназначенный для создания трудно читаемых программ, это серьезный калькулятор. Запустите его на любой машине с Unix (или Cygwin). en.wikipedia.org/wiki/Dc_(computer_program)

@ Calvin'sHobbies Если у вас есть доступ практически к любому компьютеру с Linux или Unix (включая OSX), просто сохраните его в виде текстового файла, например, bonus.dc, и запустите dc bonus.dc. dc - один из старейших языков, который постоянно использовался в * nix буквально десятилетия. Хотя он не очень известен, вероятно, из-за его загадочного и не очень читаемого синтаксиса RPN. Отлично подходит для некоторых испытаний кода-гольфа, хотя ;-)
Digital Trauma

12

Bash + coreutils, 56 байт

tr \(-y \!-r<<<'*+,-7;=?GHIKVWXYhiklnvwx'
tr C-F 7-:<<<E

По счастливой случайности, добавление 7 к значению ascii скрытых символов приводит к получению всех нераскрытых символов (за исключением «9»). Поэтому мы просто делаем это преобразование в обратном порядке, затем аналогичное преобразование (вычитаем 12 из «E»), чтобы получить «9».

Выход:

#$%&0468@ABDOPQRabdegopq
9

7
Мне нравится, как первая строка вычитает 7 из группы символов, и она содержит -7заметно отображаемые знаки препинания, и эти 2 факта не имеют ничего общего друг с другом.

@ WumpusQ.Wumbley Я даже не заметил этого :)
Цифровая травма

6

Perl - 49 байт

symlink".",':=<?)-/! YX[]VIHKx{}|~vih'^chr(25)x25

Это в значительной степени Perl-версия решения Говарда. Выполните XOR для строки с 25. В результате получается файл с именем #$%&04689@ABDOPQRabdegopq. У меня появилась идея использовать symlinkи имя файла в качестве выходного формата, потому что все остальное запрещено.

Вот еще одно решение Perl, которое я придумал. Вероятно, его можно значительно улучшить, и он довольно длинный, поэтому сейчас я ухожу в удобочитаемом формате.

until(y/1/1/>32){s//1/}
until(y/1/1/>125+1){
    if(chr(y/1/1/)!~/[!"'()*+,-.\/12357:;<=>?CEFGHIJKLMNSTUVWXYZ[\\\]^_`cfhijklmnrstuvwxyz{|}~]/) {
        symlink".",chr y/1/1/;
    }
    s/^/1/
}

Этот выводит много файлов, имя каждого - один из символов. Я не мог понять, как добавлять строки без использования запрещенного символа.

for, while, map, say, print, eval, s///e, И любое имя переменной не может быть использована (переменные начинают с @или $в Perl) , который сделал это трудно.

Надеюсь, что имена файлов подходят для формата вывода, потому что я уверен, что любой другой способ вывода информации использует один из запрещенных символов.


Я собираюсь дать вам +1 за креативность! Очень умное использование кода!
WallyWest

Я знаю, что это довольно старое, но можно вывести выходные данные на экран и сохранить несколько байтов, используя -pфлаг и *_=\(... ): Попробуйте онлайн!
Дом Гастингс

@DomHastings круто! Я думаю, что -pфлаг будет запрещен, хотя, поскольку pесть дыра.
hmatt1

5

MATLAB, 36 байт

ТАК ЗАКРЫТЬ .... Только на 1 байт больше, чем текущий победитель (isaacg)! Который, при дальнейшей проверке, уже сделал то, что я намеревался сделать. Ну, нет ничего плохого в изобретении колеса ...

Я знаю, что это старый вызов, но я понял это только после того, как заинтересовался.

['*+,-7;=?GHIKVWXYhiklnvwx'-7,57,'']

Если бы я только мог заставить MATLAB понять, что я хочу строку без отдельных ''... предложений, кто-нибудь?


4

Brainfuck 303 275

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

Brainfuck, непревзойденный эзотерический язык (кроме пробелов);)


1
Пожалуйста, удалите старые фрагменты, не зачеркивайте.
Исаак

2
Я вижу, вы использовали кавычки (не знаю реального имени) для своих фрагментов кода. Может быть, проще выбрать свой код и нажать Ctrl+ K:)
Теун Пронк

@isaacg Готово. TeunPronk, готово!
WallyWest

6
Или просто нажмите пробел 4 раза, если это только одна или две строки. @TeunPronk Это? `Это отступник. (Также называемый серьезным акцентом, хотя для меня это новая цитата : P)
Дверная ручка

1
@Doorknob Тогда мы оба кое-что узнали сегодня, хотя то, что вы узнали, в любом случае неверно: P
Теун Пронк

4

JS - 196 - попробуй

h=(c=!1+[])[1];i=c[2*2];j=(f=[]+{})[1];this[i+'v'+h+'l'](h+'l'+i+'rt('+h+'t'+j+f[2]+'("Iy\x51lJj\\x'+2*2+'1\\x3'+~-1+'Nj\\x'+2*3+'75\x51EFC\x52E\\x3'+3*3+'\x51UVJhYm\x52lZ2\\x3'+3*3+'wc\x51=="))')

1
Черт возьми, это безумие Кажется, Js - один из самых оскорбительных языков =)
flawr

Подлежит да, но это просто пятнышко по сравнению с моей записью ... Извините, @bebe, но на этот раз я вас обошел ...
WallyWest

1
@WallWest я объявляю войну.
bebe

1
217 : h=1-1;j=3+3;k='\\x';m=!i+k;c=m[1];f=m[i=2+2];l=k+3;n=k+j;r=k+i;this[f+'v'+c+'l'](c+'l'+f+'rt("\\x23\\x2'+i+k+25+k+2+j+l+h+l+i+l+j+l+2*i+l+3*3+r+h+r+1+r+2+r+i+r+'f\\x5'+h+k+51+k+52+c+n+2+n+i+f+n+7+n+'f\\x7'+h+k+'71")')- встроенный l, укороченный m, объявленный iпри первом использовании, создал несколько дополнительных переменных для повторяющихся паттернов (вы могли бы улучшить это, настроив порядок выдачи символов, но это выше моего терпения: P).
Alconja

2

GolfScript, 89 символов

71 22+,{33+}/]''+'!"\'()*+,-./12357:;<=>?CEFGHIJKLMNSTUVWXYZ[\]^_`cfhijklmnrstuvwxyz{|}'-

Просто строит массив всех символов ASCII и вычитает из них не «скрытые» символы.

71 22+,  # Builds array of 0..93
{33+}/]  # Converts to 33..126
''+      # Convert ASCII codes to string
'stuff'- # Subtracts "stuff" (the non-holed characters) from the string

2

Befunge 98 - 69 байт

"()+ijWI=*">:5j2 ,-5_"157:h">:5j2 ,-1_"=>?LMN^_lmn">:5j2 ,+3_"?"1+s <

Делает это в 3 части. Тот, в котором значения незапертых символов отличаются от пропущенных символов на 5. Затем те, которые отличаются на 1, и, наконец, список незапертых символов, которые отличаются на 3 от пропущенных. Инструкция завершения программы в Befunge - "@" (значение символа 64), поэтому в конце я загружаю "?" (значение char 63) добавьте 1, затем поместите это в код с инструкцией 's'.

Я мог бы играть в гольф больше, объединив три

>:5j2 ,(differ value)_

раздел, но, вероятно, не очень.


2

JavaScript 240 228

Первоначальное представление:

z=(!1+"")[1];y=(!!1+"")[3];x={}+"";w=x[1];v=x[2];u=z+"t"+w+v;1[_="c\157nstruct\157r"][_](z+'l'+y+'rt('+u+'("Iy\x51lJj"+'+(t=u+'("\x51\x51==")')+'+'+u+'("M"+'+t+'+"==")+"Nj"+'+u+'("Zw==")+"5\x51EFC\x52E\71\x51UVJhYm\x52lZ2\71wc\x51=="))')()

Теперь, это отличное начало, вот как это ломается ...

z=(!1+"")[1];        // assigns "a" to z, !1+"" === "false"
y=(!!1+"")[3];       // assigns "e" to y, !!1 === "true"
x={}+"";             // assigns "[object Object]" to x
w=x[1];v=x[2]        // assigns "o" to w, and "b" to v
u=z+"t"+w+v;         // creates the mystical "atob" command, yes, I'm gonna use it!
1[_="c\157nstruct\157r"][_] // sets up the primitive to a number object... this acts similar to the "window" primitive object so that I can play off functions...
z+'l'+y+'rt(         // starts creating an alert call
'+u+'("Iy\x51lJj"+'+(t=u+'("\x51\x51==")')+'+'+u+'("M"+'+t+'+"==")+"Nj"+'+u+'("Zw==")+"5\x51EFC\x52E\71\x51UVJhYm\x52lZ2\71wc\x51=="))')()
// Above line abuses atob command with a couple of nested instances of the command, also using hex and octal equivalents of characters

И тогда я подумал ... "Должен быть более простой способ ..." и есть ...

Пересмотренное представление: z=(!1+"")[1];y=(!!1+"")[3];x={}+"";w=x[1];v=x[2];u=z+"t"+w+v;this[y+"v"+z+"l"](z+'l'+y+'rt('+u+'("Iy\x51lJj"+'+(t=u+'("\x51\x51==")')+'+'+u+'("M"+'+t+'+"==")+"Nj"+'+u+'("Zw==")+"5\x51EFC\x52E\71\x51UVJhYm\x52lZ2\71wc\x51=="))')

Видя, что я могу использовать eval (собрав воедино вдохновение от @bebe; это намного быстрее, чем использование constructorof constructorof a number...), я пробил его до 228 ... Я знаю, что он может не выиграть этот конкретный Golf Challenge , но это только мой способ показать, насколько вы можете злоупотреблять JavaScript, и все же получить желаемый результат ...


2

Главная - Бессонница , 50

FFy~~jF~y<={*n<<ztf>={.f=(tHL~k<yf={*n>Lj(FunLn<j~

Это выводит:

abdegopq04689@ABDOPQR#$%&

Бонус - Бессонница, 268

ogeeoddp@poe@ggep@oe@opge@gee@%d@p@gqeo@p@ge@e9de49ed9e4dppe@%e@geee@ge@p%ee@%e@dp@%ep@%ee@%d@%eeee@%e@%ee@%e@geee@%e@gee@ggopop@peo@ggep@p@ge@ggeep@ge@gee@%e@geee@ge@gee@ge@ppoep@%ee@%edep@gepe@ge@%ee@%e@geee@ge@%ee@%%eeoe@ge@pep@%gep@p@%e@%%eep@%e@gee@e%e@oe@%gep@p@

Это выводит:

!"'()*+,-./12357:;<=>?CEFGHIJKLMNSTUVWXYZ[\]^_`cfhijklmnrstuvwxyz{|}~

Я думаю, что должна быть возможность уменьшить длину программы, если выходные данные переставлены, но мне нужно изменить мою программу поиска, чтобы сделать это.

Просто чтобы показать случай, другой язык, который способен работать с ограниченным количеством символов. Кстати, он может написать практически любой вывод, содержащий только 3 уникальных символа в источнике.

В настоящее время это единственный язык, который может выполнять как основной вызов, так и бонус среди всех существующих ответов.

Бессонница Переводчик .


1

Befunge 98 - 46 байт

Befunge-ified версия записи Исаака Pyth:

"xwvnlkihYXWVKIHG?=;7-,+*">:5j2 ,-7_"?"1+:,s <

1

Japt , 33 байта

7+2+"*+,-7;=?GHIKVWXYhiklnvwx"c-7

Попробуйте онлайн!

Тот же алгоритм, что и у Pya в isaacg , но в Japt он короче.

Как это устроено

7+2+"*+,-7;=?GHIKVWXYhiklnvwx"c-7

7+2           Obviously the number 9
    "..."c-7  Apply -7 on each char's charcode of this string
   +          String concatenation

Да, это JS, который является одним из наиболее уязвимых языков , только короче (и вам не нужно alertили console.logздесь).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.