На языке программирования по вашему выбору напишите 95 программ, каждая из которых выводит отдельный из 95 печатных символов ASCII, причем этот символ не встречается где-либо в программе .
Например, если ваш язык Python , ваша программа, которая выводит символ, P
может быть
print(chr(80))
потому что P
имеет код ASCII 80. Эта программа действительна, потому что P
никогда не появляется в исходном коде. Однако для программы, которая выводит строчные буквы p
, что-то вроде
print(chr(112))
будет недействительным, потому что, хотя он печатает p
, p
присутствует в коде. Действительная программа может быть
exec(chr(112)+'rint(chr(112))')
который печатает, p
но не содержит p
.
Ваша цель - сделать каждую из ваших 95 программ максимально короткой. Ваша оценка - это сумма длин символов всех ваших программ.
Если по какой-либо причине вы не можете написать действительные программы для некоторых символов, вы можете пометить эти символы как «Не программировать» или DNP и полностью пропустить программы для них. Таким образом, синтаксически строгие языки смогут конкурировать.
Победившим ответом является ответ с наименьшим количеством баллов из набора ответов с наименьшим числом DNP.
правила
Исходный код всех ваших программ может содержать только печатные символы ASCII, а также вкладки и символы новой строки, которые считаются одним символом. (Потому что в другой кодировке было бы легко опустить символы, которые не существуют!)
- Примечание: это правило кажется необходимым, но есть много языков с разными кодировками, и я уверен, что было бы здорово увидеть ответы на них. Поэтому вы можете нарушить это правило , вы можете использовать любые символы, которые захотите, но тогда ваш ответ станет неконкурентным , он не сможет победить.
Программы должны быть фактические, полные программы , согласно стандартным соглашениям вашего языка. Функции и фрагменты REPL не допускаются.
Вывод каждой программы должен идти на стандартный вывод или принятую альтернативу вашего языка.
Программы не должны запрашивать или требовать ввода. (Если запрос на ввод данных присущ вашему языку, это нормально.)
Программы должны быть детерминированными, конечными во время выполнения и независимыми. например, это не должно иметь значения, если один запускается в папке отдельно от других программ.
Вывод программы должен быть точным печатным символом ASCII, которому он соответствует, за которым может следовать одна завершающая строка, ни больше, ни меньше.
Обязательно включите в свой ответ информацию обо всех 95 (в идеале) программах, а также свои оценки и любые оценки DNP. Вам не нужно перечислять все программы , которые следуют простому шаблону , как « , ...» , но убедитесь , что вы будете уверены , что все они будут работать , и что ваш счет правильно добавлен.print(chr(80))
print(chr(81))
print(chr(82))
Для справки, вот 95 печатных ASCII, которые ваши программы должны выводить:
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
источник
0
Ответы:
Python 2,
10751065104310401039 байтКаждая программа имеет форму
print'\<octal char code>'
, кроме:'
→print"\47"
0
через8
→print~-<N+1>
9
→print-~8
\
→print'%c'%92
i
→exec'pr\151nt"\151"'
n
→exec'pri\156t"\156"'
p
→exec'\160rint"\160"'
r
→exec'p\162int"\162"'
t
→exec'prin\164"\164"'
Для справки и простоты тестирования, вот полный список программ, разделенных новой строкой.
Тестировать:
-1 байт благодаря @ Sp3000!
источник
print~-<N+1>
не работает1
. Вы сказали , что это работает для0
в8
.<angle brackets>
не является буквальным кодом. Подставьте<N+1>
с буквальным значениемN+1
; в этом случае программа для1
будетprint~-2
. Смотрите полный список программ.CJam, 269 байт
Каждая из программ в форме,
'<char - 1>)
кроме:S
, 1 байт'
=>39c
3 байта)
=>'*(
3 байта0
=>T
, 1 байт1
=>X
, 1 байт2
=>Y
, 1 байт3
=>Z
, 1 байт4
-9
=><num-1>)
, 2 байтаОценка:
3 * 82 + 1 + 3 + 3 + 4 * 1 + 6 * 2 = 269
источник
39c
для'
? Кроме того, вы забываете, что однозначные числа могут быть просто этим числом1)
для2
etc, чтобы сохранить один байт1)
было то , что я имел в виду, даTXYZ
ASCII ограниченный машинный код x86 для DOS,
310431012913 байтНу ... Короче, чем Java, я думаю ...
3230 байтов для почти всех символов, исключения см. Ниже.Большую часть времени это просто следует шаблону:
xor
чтобы получить указатель до конца.sub
из последних 2 слов, потому что код операцииint
не в ASCII.AH
и персонаж вDL
. Обаxor
редактируются, потому что сам символ не может появиться в программе, а 2 не является печатным символом ASCII.int 21h
int 20h
Большую часть времени, если символ запрещен, его можно заменить либо переворотом с битами данных, либо переключением на другой регистр.
Это становится немного интереснее, когда вы вдруг обнаружите, что не можете вычесть или не можете нажать или вытолкнуть единственный регистр, пригодный для вычислений ...
источник
Brainfuck,
1770171017031686 байт60 байтов, сохраненных Денисом
17 байтов, сохраненных Sp3000
DNP: 46 (
.
)Все, кроме 43, 45, 60, 62, 91 и 93, бесстыдно похищены с Esolangs.org
источник
--[>-<---]>[<->--]<[->-<]>.
работает на выход+
.-----[[----<]>>-]<.
+[+[+>]<<++++]>.
MATL,
305, 302, 300297 байтовКаждая программа выглядит следующим образом:
За исключением
Digits. Вот программы для 0-9:
«С». Эта программа
пространство. Это
С сегодняшнего дня я узнал, что MATL рассматривает символ 0 как пробел. Спасибо @LuisMendo!
Вы можете использовать matl.tio для проверки любого из них.
Для справки, вот все из них:
источник
Java 8,
679865826577 байтвздох
Это в основном порт моего ответа на Python 2 , но со всеми шаблонами, которые идут с написанием полной программы на Java.
Теперь без ДНП вообще! Спасибо, Кевин Круйссен!
Большинство программ имеют форму
interface A{static void main(String[]a){System.out.print("\<octal char code>");}}
, кроме:interface\tA{static\tvoid\tmain(String[]a){System.out.print("\40");}}
(но с\t
заменой s на необработанные вкладки)"
→interface A{static void main(String[]a){System.out.print('\42');}}
(
→interface A{static void main\u0028String[]a){System.out.print\u0028"\50");}}
)
→interface A{static void main(String[]a\u0029{System.out.print("\51"\u0029;}}
.
→interface A{static void main(String[]a){System\u002Eout\u002Eprint("\56");}}
0
→interface A{static void main(String[]a){System.out.print(1-1);}}
1
→interface A{static void main(String[]a){System.out.print(3-2);}}
2
→interface A{static void main(String[]a){System.out.print(3-1);}}
3
→interface A{static void main(String[]a){System.out.print(4-1);}}
4
→interface A{static void main(String[]a){System.out.print(5-1);}}
5
→interface A{static void main(String[]a){System.out.print(6-1);}}
6
→interface A{static void main(String[]a){System.out.print(7-1);}}
7
→interface A{static void main(String[]a){System.out.print(8-1);}}
8
→interface A{static void main(String[]a){System.out.print(9-1);}}
9
→interface A{static void main(String[]a){System.out.print(8+1);}}
;
→interface A{static void main(String[]a){System.out.print("\73")\u003B}}
A
→interface B{static void main(String[]a){System.out.print("\101");}}
S
→interface A{static void main(\u0053tring[]a){\u0053ystem.out.print("\123");}}
[
→interface A{static void main(String...a){System.out.print("\133");}}
\
→interface A{static void main(String[]a){System.out.print((char)92);}}
]
→interface A{static void main(String...a){System.out.print("\135");}}
a
→interf\u0061ce A{st\u0061tic void m\u0061in(String[]b){System.out.print("\141");}}
c
→interfa\u0063e A{stati\u0063 void main(String[]a){System.out.print("\143");}}
d
→interface A{static voi\u0064 main(String[]a){System.out.print("\144");}}
e
→class A{public static void main(String[]a){Syst\u0065m.out.print("\145");}}
f
→class A{public static void main(String[]a){System.out.print("\146");}}
g
→interface A{static void main(Strin\u0067[]a){System.out.print("\147");}}// \u0067
i
→\u0069nterface A{stat\u0069c vo\u0069d ma\u0069n(Str\u0069ng[]a){System.out.pr\u0069nt("\151");}}
m
→interface A{static void \u006Dain(String[]a){Syste\u006D.out.print("\155");}}
n
→class A{public static void mai\u006E(Stri\u006Eg[]a){System.out.pri\u006Et("\156");}}
o
→interface A{static v\u006Fid main(String[]a){System.\u006Fut.print("\157");}}
p
→interface A{static void main(String[]a){System.out.\u0070rint("\160");}}
r
→class A{public static void main(St\u0072ing[]a){System.out.p\u0072int("\162");}}
s
→interface A{\u0073tatic void main(String[]a){Sy\u0073tem.out.print("\163");}}
t
→class A{public s\u0074a\u0074ic void main(S\u0074ring[]a){Sys\u0074em.ou\u0074.prin\u0074("\164");}}
u
→interface A{static void main(String[]a){System.console().printf("%c",117);}}
v
→interface A{static \u0076oid main(String[]a){System.out.print("\166");}}
y
→interface A{static void main(String[]a){S\u0079stem.out.print("\171");}}
{
→interface A\u007Bstatic void main(String[]a)\u007BSystem.out.print("\173");}}
}
→interface A{static void main(String[]a){System.out.print("\175");\u007D\u007D
фу
Компилятор Java обрабатывает экранирование Unicode, как и
\u007B
перед любой другой обработкой, что позволяет писать код, который использует экранирование Unicode в идентификаторах и даже в ключевых словах. Итак, чтобы написать программу, в которой не используется символ, присутствующий в шаблоне, мы просто заменим его на escape-кодировку Юникод.Для справки и простоты тестирования, вот полный список программ, разделенных новой строкой и с необработанными вкладками, замененными четырьмя пробелами:
Обратите внимание, что программа для
u
использования используетSystem.console()
, который вернет значение null (и, следовательно, заставит код бросить aNullPointerException
), если вы вызываете его из чего-либо, кроме собственного терминала вашей ОС (cmd
в Windows и, я полагаю,bash
в Linux / OSX) ,Для тестирования создайте новый каталог и поместите приведенный выше код в файл с именем
printables
в этом каталоге. Затем запустите следующий скрипт Bash:Приведенный выше скрипт поместит каждую строку
printables
в свой собственный каталог, назовет их всеA.java
(кроме файла, который печатаетA
, который переименованB.java
), скомпилирует каждый файл, запустит их, а затем удалит улики. Должно пройти около десяти секунд, чтобы печатные символы ASCII начали появляться в вашей оболочке.Если вы используете Windows, вместо этого запустите следующий пакетный файл:
Этот пакетный файл использует немного другой подход; вместо предварительного разделения строк он обрабатывает файл построчно, компилирует и запускает каждую программу по очереди. Опять же, он удаляет доказательства после его окончания.
Сохранено бесчисленное количество байтов + 1 DNP благодаря Кевину Круйссену!
источник
class B
для печатиA
interface
вместо класса, чтобы вы могли удалитьpublic
) и если ваша ОС имеет встроенную консоль, поэтому вам не нужно использоватьSystem.out.print
:interface A{static void main(String[]a){System.console().printf("%1",(char)117);}}
Eclipse, IntelliJ и онлайн-компиляторы не имеют этой консоли, что приводит кNullPointerException
.print
> <> ,
443437 байтСсылка переводчика TIO . Здесь много шаблонов:
[num][num]*o;
: Умножение двух чисел, затем вывод результата в виде символа сo
и остановка с;
. > <> Цифры идут до 15, то есть0123456789abcdef
.[num][num]-n;
, который принимает разность двух чисел и выводит как числоn
вместо.'-o[invalid char]
: > <> является тороидальным, поэтому, когда указатель инструкции достигает конца строки, он перемещается обратно в начало. В этом случае, это приводит к тому , код , который будет выполняться два раза, то есть'-o[char]'-o[char]
. Первая'-o[char]'
часть помещает три символа в стек,-
вычисляет, а'o' - [char]
затемo
выводит результат в виде символа. > <> затем выдает ошибки при достижении[char]
, либо из-за нераспознанной команды, либо из-за выталкивания пустого стека.'-n[invalid char]
, который выводит как число.'[num][op]o[invalid char]
, которая применяется[op]
с[num]
на[char]
, erroring на символ. Например,'2+oJ
выходовL
, что на два больше, чемJ
.'
код"-oH
, использующий"
вместо.-
код'%oB
, использующий%
вместо.ln;
: Толкать длину стека, выводить как num, затем останавливать, давая0
. Аналогичноlln;
для1
и'ln;
для3
.4|n+
: Нажмите 4, отскок от|
и нажмите еще 4, добавить, а затем вывести в8
виде числа.|
Снова отскок и ошибка при попытке выполнитьn
снова на пустом стеке.3|n*
для9
.[num]|o*
для@Qdy
.'1-:00p
: Самый интересный, дляo
случая. Чтобы избежать использованияo
в нашем коде, нам нужно использовать,p
чтобы поместитьo
в кодовое поле, а затем запустить его. Инициал'1-:00p'
устанавливает стекp
на вершину и1-
уменьшает его доo
.:
дублирует этоo
и00p
помещает единицуo
в (0, 0), превращая кодовое поле вo1-:00p
. Указатель инструкции переносится снова, выводя другойo
. Символ (0, 0) затем заменяется еще несколько раз, прежде чем программа наконец выдаст ошибку.источник
Dyalog APL ,
527522 байта(неконкурентный, потому что APL не может быть написан с использованием только ASCII)
Большинство из них в формате
nn⊃⎕AV
илиnnn⊃⎕AV
, за исключением:Вот весь список:
источник
⍨
мой новый любимый смайликРубин, 869 байт
Для 63 символов
@
через~
, мы имеем раствор 10-байтовый:Для большинства (21) символов от
space
сквозного?
у нас есть 9-байтовое решение:Осталось одиннадцать особых случаев:
В общей сложности оценка составляет 10 × 63 + 9 × 21 + 10 + 3 + 8 × 4 + 5 = 869.
источник
?\xxx
вместо одного"\xxx"
байта каждый.p 1+8
и нетp-~8
?-
или что-то в этом роде. :(putc 65
=>A
WolframAlpha , 368 байт
Общий формат:
Исключения:
Вот полный список:
источник
PHP (
891680674 байта,20 DNP)Редактировать: сэкономил 203 байта благодаря jimmy23013 и реализовал 2 DNP благодаря Mego
Этот ответ сильно нарушает щедрый характер PHP. Большинство случаев принимают одну из этих форм (7 байтов каждая):
PHP преобразует буквы по обе стороны от оператора в строки, затем выполняет соответствующую побитовую операцию путем преобразования каждой строки в ее символьное значение ASCII и, наконец, преобразует результат обратно в символ.
В первом примере выше,
Y^x
становится89^78
. Результатом этого является то33
, что затем отправляется в STDOUT как символ!
.Был написан сценарий, чтобы перебить все возможные комбинации: результаты можно найти здесь .
Исключения:
;
is<?=Z^a?>
(8 байт)|
is<?='9'^E;
(9 байт)<
и?
обычно это DNP из-за обязательного начального тега, но с помощью-r
флага код можно выполнить без них:<
isecho Z^f;
(9 байт)?
isecho Z^e;
(9 байт)=
isecho Z^g;
(9 байт)Гол:
(7 * 90) + 8 + 9 + 9 + 9 + 9 = 674 байта
источник
&
|
^
две буквы для генерации всех печатных символов ascii, кроме<?=|;
.~
вместо XOR, AND или OR. PHP может использовать больше печатных символов в качестве констант, чем просто буквы.Брахилог ,
546477 байтКредиты на Fatalize для кода
@
.В приведенном ниже списке первый символ - это символ, который будет напечатан (для удобства).
Все они являются предикатами, поэтому
Z
для получения результата должен быть аргумент: попробуйте онлайн!объяснение
@P
эта строка:который содержит каждый печатный ASCII.
источник
"@"
этот путь> <> , 531 байт
Программы принимают две основные формы:
Первый предназначен для символов с кодами символов с двумя факторами, меньшими 16, а второй - для других случаев. Большинство чисел, для которых я использую вторую форму, имеют много решений одинаковой длины, но я выбрал это для удобства чтения.
Исключения:
Полный список:
источник
;
использование;
. Кроме того, я уверен, что большинство из них могут быть проиграны, иo
это определенно возможно.o
иO
я не вижу, какo
это возможно. И как будет короче ошибка?o
может быть сделано путем использованияp
. Я мог бы опубликовать отдельно для ошибок, хотя, вероятно, будет много разных шаблонов.;
программу, хотя. Спасибо что подметил это!Гексагония ,
376373 байта, 1 DNPСпасибо FryAmTheEggman за сохранение 3 байтов.
Почти все программы имеют одинаковую форму:
Однако есть несколько исключений:
;
без использования;
, следовательно, 1 DNP.@
мы не можем использовать@
для завершения программы. Вместо этого мы используем либоS2;:
илиS3;%
. Это заканчивается ошибкой деления на ноль, но эта ошибка не видна в STDOUT. Так что это еще четыре байта.U
которого потребуетсяU3;@
. Есть несколько способов исправить это, включая переключение в нижний регистр, т. Е.n9;@
Или использование увеличения или уменьшения, т . Е.T);@
ИлиV(;@
. В любом случае это еще четыре байта.0
и!
печатают целочисленное значение, поэтому мы можем получить0
и1
с!@
и)!@
, соответственно, сохраняя 3 байта.Что касается того, как
<letter><digit>;@
работают программы: гексагональное расположение программы формы1234
всегдаПоскольку ни одна из программ не содержит команд, перенаправляющих поток управления, это просто линейные программы, которые выполняются по порядку.
В любом случае буква в начале кода устанавливает текущий край памяти в свой символьный код. Например , в программе
P1;@
, тоP
устанавливает значение80
. Затем цифра умножает это значение на 10 и добавляет себя (то есть цифра добавляется к текущему значению). Это дает801
в приведенном выше примере. Наконец,;
печатает это значение, принимая его по модулю 256 и используя его как значение байта. В этом случае801 % 256 = 33
и!
печатается.источник
Пробелы , 1643 байта, 1 DNP
17 байтов для символов [33-63] и 18 байтов для символов [64-126]
В Whitespace это просто, потому что печатные символы (кроме пробела) в любом случае не имеют никакого значения:
Программа выше печатает '!' (100001b). Измените
[TAB][SPACE][SPACE][SPACE][SPACE][TAB]
в первой строке любой символ, который вам нравится. Невозможно напечатать пробел без пробела, потому что печать чего-либо всегда начинается с[TAB][LF][SPACE]
источник
Сетчатка , 712 байт, 2 DNP
Это было совместное усилие с FryAmTheEggman.
Есть несколько классов решений. Для большинства символов от пробела до
^
мы используем программу следующего вида:Символ во второй строке перебирает диапазоны,
_0-9A-Za-z
а остальные остаются неизменными. Это превращает пустой ввод в этот символ, а затем заменяет его печатным символом ASCII (представленнымp
) в соответствующей позиции. Каждая из этих программ имеет длину 8 байт.В этом диапазоне есть только несколько исключений. Самое главное, цифры могут быть сокращены:
x
(считает количествоx
s в пустом входе)(крошечный, пустая программа; подсчитывает количество пустых совпадений в пустом входе)
2: теперь мы превращаем ввод в один символ перед подсчетом пустых строк:
3: то же самое, но мы превращаем ввод в два символа:
4: вы поняли идею ...
5 - 9: поворот сюжета ... мы используем повторение символов, чтобы избежать повторения второй строки:
...
Другое исключение -
T
это DNP: мы не думаем, что возможно генерировать нецифровый символ без его появления в исходном коде, если этапы транслитерации не могут быть использованы.На оставшиеся символы. Для печати
_
мы используем аналогичную программу в качестве общего решения выше:Воспользовавшись тем, что
w
начинается с_
.Далее,
`
второй DNP, потому что этапы транслитерации также требуют их.Затем большинство строчных букв печатаются примерно так (что печатает
a
):Опять же, символ во второй строке увеличивается
_0-9A-O
. Здесь нам просто нужно следить заl
иw
, который мы можем распечатать с помощью следующих программ, соответственно:Наконец,
{|}~
остаются только те, которые требуют 9 байтов каждый. Здесь мы используем этап транслитерации для увеличения предшествующего им символа. Например,~
можно напечатать:источник
Пайк,
364362355 байтВсе в форме
w<chr(charcode+32)>.C
(4 байта), кроме:->
d
1 байт0
->Z
1 байт1
->~W
2 байтаa
->Gh
2 байтаz
->Ge
2 байтаa
) в формеG<number>@
(3 байта)k
->GT@
3 байта>
->~Bh
3 байта]
->~Be
3 байтаZ
->~le
3 байта9
->~ue
3 байтаw
->G22@
4 байта.
->~B4@
4 байтаC
->~K38@
5 байтОнлайн переводчик Pyke
источник
JavaScript (ES6),
10831068 байтОбщая форма:
Исключения:
Изменить: Сохранено 15 байтов благодаря @ GOTO0.
источник
alert(atob`XA`)
«\» для сохранения нескольких байтов.x
.\u
избежать в исходном коде? Круто05AB1E , 417 байт
объяснение
Большинство из них 5 байт длиной вида:
convert nr to base nr+1
.>
нужен дополнительный байт, так как мы не можем использовать приращение для этого.a,b,x,y,z,Y,Z
извлекаются изA
которых содержит алфавит в нижнем регистре.A,B,C,D,E,F
числа, преобразованные в гекс0-9
простое увеличение / уменьшение, а также предопределенные переменные.источник
Marbelous, 220 байт
Для символа, который не является цифрой, это просто две заглавные шестнадцатеричные цифры кода символа. Например, следующие программные выходы
A
:Для цифры, которой нет
3
, замените2F
в следующем коде шестнадцатеричные цифры кода символа в верхнем регистре - 1:Для
3
:Общая оценка: 2 * 85 + 5 * 10 = 220.
Переводчик.
Моей первой попыткой был Bubblegum, и он не работал для персонажей раньше
?
...источник
Perl 6: 921 байт
Перевод решения Python.
Каждая программа имеет форму
say "\x<hex escape code>"
, кроме:s
→put "\x73"
a
→put "\x61"
y
→put "\x79"
→
"\x20".say
"
→say chr 34
\
→say chr 92
x
→say chr 120
0
→say 1-1
1
→say 3-2
2
до9
→say <n minus one>+1
Для справки и простоты тестирования, вот полный список программ, разделенных новой строкой.
Вот код, который я использовал для проверки приведенного выше списка и подсчета очков:
источник
say
требуется пробел после и восьмеричные escape-последовательности записываются как\o77
. Не стесняйтесь опубликовать отдельное решение Perl 5 ... :)Haskell,
1874, 1864, 1856, 1855, 1795, 1791,1589 байт, 7 DNP.Большинство программ находятся
main=putChar '\xx'
илиmain=putChar '\xxx'
гдеxx
/xxx
является кодом ASCII символа для печати. Это работает для всех, кроме 14 символов:Однако для цифр можно сохранить
1 74 байта (спасибо Кристиану Сиверсу!):52 программы до
c
(код 99) занимают 18 байтов, остальные 19 занимают 19 байтов каждая.Частичная оценка:
10*14 + 52*18 + 19*19 = 1437
Для 7 из оставшихся символов работают следующие программы:
Частичная оценка:
18 + 22 + 18 + 21 + 19 + 27 + 27 = 152
Это оставляет 7 DNP:
=aimnrt
Каждая программа на Haskell должна определять main (
main=
), так что это 5 DNP. Для печати на STDOUT,putChar
,putStr
илиinteract
может быть использован, получаяt
и вr
качестве дополнительных DNPS. (Существует такжеprint
, однако,print 'a'
печатает'a'
и неa
- и также содержитt
и вr
любом случае.) Haskell также имеетchr
функцию, которая возвращает соответствующий символ с заданным числом, однако для его использованияimport Data.Char
необходимо.Общий балл:
1437 + 152 = 1589
7 ДНПисточник
main=print$1-1
и т. Д.succ
)BBC Basic,
422413 байтСкачать переводчик бесплатно на http://www.bbcbasic.co.uk/bbcwin/bbcwin.html
9 байтов сохранено благодаря Leaky Nun.
Общая форма
32..99, исключая 12 особых случаев: 56x4 = 224 байта
100..126 : 27x5 = 135 байтов
12 особых случаев: 54 байта
Большинство чисел следуют общей форме, но я включил их все здесь, чтобы показать, в чем проблема.
Первый символ - это символ для печати.
источник
V.48
для0
?V.
иP.
команды всегда были там?.
расширением превращаются в ключевое слово. Эта проблема является строгой при использовании непечатаемого ASCII, но, возможно, с другими проблемами можно сказать, что ключевые слова с токенами (ascii 127-255) были одним байтом. Тем не менее, я никогда не пробовал этот аргумент, и обычно даю оба балла.Минколанг 0,15 , 604 байта
Для большинства персонажей
"<char-1>"1+O.
будет действительная программа, возможно, одна из самых коротких. Однако из-за того, что символы хранятся в виде кодовых точек в стеке, это означает, что многие из них могут быть получены путем умножения и сложения в пять байтов или меньше. Также обратите внимание, чтоl, $1, $2, $3, $4, $5, $6, $l
есть10, 11, 12, 13, 14, 15, 16, 100
соответственно.Формат:
<character>: <program>
Особые упоминания:
(Попробуйте.) Minkolang имеет возможность изменять символы в поле кода, поэтому эта программа заменяет его
-
в конце на то.
, что необходимо для остановки программы."N"1+d90pN.
дляO
работ так же.(Попробуйте.)
lZ
Толкает прописные и строчные алфавиты к стеку иI
толкает длину стека, равную 52, точно к точке кода «4». Самое приятное то, что я изначально рассматривал решение4$3*O.
, которое умножает 4 и 13, чтобы получить 52, но не смог, потому что в нем было 4, поэтому я все равно нашел решение для игры в гольф!(Попробуйте.)
d
Дублирует вершину стека, так что этот фрагмент кода делает то, что он выталкивает11
, дублирует его, а затем умножает. Был бы альтернативный способ записать это$12;O.
с тем же количеством байтов.(Попробуйте.)
;
Это возведение в степень, так что это делает 5 ^ 3, чтобы получить 125.источник
Groovy, 1019 байтов
У меня было написано другое решение Groovy (см. Ниже), но после того, как я его отправил, я немного больше покопался в экранировании символов, надеясь найти способ еще более сократить программу, и обнаружил, что в Groovy есть восьмеричное экранирование символов, которое я не знал о. Это значительно упрощает код до такой степени, что, к сожалению, он устраняет необходимость почти всех изворотливых обходных путей, которые я придумал.
Это также выглядит почти идентично решению Copper's Python 2 , в том смысле, что я в основном выгляжу так, будто я плагиат их работы. Тьфу.
Каждая программа имеет форму
print'\<octal value>'
, кроме:p
,r
,i
,n
,t
→'print''\<octal value>'
(но с согласующей буквой «печать» , также заменены на восьмеричное)0
-9
→print~-<next int>
Вот полный список программ по характеру.
Groovy, 1130 байт
Моя предыдущая программа, прежде чем я обнаружил, что восьмеричные побеги существуют. Гораздо интереснее, ИМО.
Каждая программа имеет форму
print(--'<next char>')
, кроме:-
,[
,~
→print(++'<previous char>')
&
→print(--"'")
p
,r
,i
,n
→System.out<<--'<next char>'
t
→'prin\u0074'(--'u')
(
→print'\u0028'
)
→print'\u0029'
0
-9
→print~-<next int>
Вот полный список программ для каждого персонажа:
источник
На самом деле ,
383382381 байт1 байт благодаря Мего.
Для удобства: первый столбец - это код символа, второй столбец - это символ, а третий столбец - это код.
Код для
0
одного пробела.Попробуйте онлайн!
Предложения по игре в гольф приветствуются.
источник
:
в 5:9P2*c
Фурье, 306 байтов, 1 DNP
Практически все программы следуют шаблону,
na
где n - код символа каждого из символов. Например:Попробуйте онлайн!
Поэтому я просто перечислю исключения:
0 (ноль)
Так как аккумулятор предустановлен на ноль, мы можем отобразить это, используя один символ:
Попробуйте онлайн!
1
Подобно нулю, это увеличивает аккумулятор, чтобы получить 1.
Попробуйте онлайн!
5
Код ASCII для 5 - 53, поэтому мне пришлось обойти это:
Попробуйте онлайн!
a
Из-за
a
того, что это функция вывода символов, нет другого способа создать символ a, так что это моя единственная НЕ ПРОГРАММА .Посмотреть все программы здесь
источник
Matlab,
12381224 байта, 2 DNPОсновной шаблон:
Для цифр это немного короче:
Для персонажей
[]'
это:Символы
ds
изdisp
отображаются с помощьюfprintf
( спасибо @Stewie Griffin );ip
однако принадлежат также там, так что я сдвигаю строку и используюeval
:Однако оба символа
()
необходимы дляdisp
илиeval
, поэтому они являются DNP.Для справки весь список:
источник
[100 105 115 112]
(char-коды)disp
?disp([100 105 115 112])
не будет производить строку,eval([100 105 115 112])
ниfprintf
для d анс s:fprintf([115,''])
. Сохраняет 2x7 байт =) Не сделает его выигрышным представлением, но, эй: 14 байт - 14 байт ,,,disp([0 ''])
содержит пробел.disp([0,''])
не делает.fprintf
.Желе (неконкурентное), 406 байт
Это печатает все символы от 32 до 126. Количество байтов рассчитывается с помощью https://mothereff.in/byte-counter .
Попробуйте онлайн!
источник
In a programming language of your choice, write 95 programs, each of which outputs a different one of the 95 printable ASCII characters without that character occurring anywhere in the program.
Befunge-93, 530 байт
Самый простой способ вывести символ без его использования - это вычислить значение ASCII и использовать команду
,
(символьный вывод) для его рендеринга. Например,49*,@
выводит символ доллара (ASCII 36, 4 * 9). Однако это редко является наиболее оптимальным, поскольку для расчета большинства значений требуется более 3 байтов.Другой способ сгенерировать число в 3 байта - воспользоваться тем, что команда
g
(get) в первой ячейке игрового поля сгенерирует ASCII-значение g (предполагается, что пустой стек заполнен нулями, поэтому чтение значения игрового поля в 0,0). Таким образом,g1+,@
вы получаете h , иg1-,@
получаете f . Это, очевидно, работает для диапазона смещений, и возможны и другие операции, кроме+
и-
. Так, например,g3/,@
получает двойную цитату.Вариант этого - предшествовать
g
другой команде, которая оставляет все нули в стеке. Таким образом, вы все еще читаете значение из игрового поля в 0,0, но читаемый символ теперь другой. Это стоит еще один байт, но дает вам доступ ко многим другим значениям. Например,0g1-,@
вы получаете косую черту и:g1+,@
точку с запятой. Другие жизнеспособные префиксы*
,+
,-
,>
,\
и_
. И еще раз обратите внимание, что возможны другие операции:>g2*,@
вы получите вертикальную черту.Еще одним вариантом является предшествование
g
с1
, так что теперь вы больше не читаете от 0,0, а из пустой ячейки в 0,1. В Befunge пустые ячейки по умолчанию инициализируются пробелами, поэтому1g,@
вы получаете пробел и1g1+,@
восклицательный знак.Для цифровых символов есть более сомнительный трюк, который мы можем использовать. Вместо того, чтобы пытаться выводить их в виде символов, мы выводим их в виде чисел (небольшое число легче сгенерировать, чем его эквивалент ASCII). Так, например,
11+.@
дает вам 2 , и, в частности, обратите внимание на особые случаи:.@
для 0 и!.@
для 1 . Сомнительная часть этого заключается в том, что числовой вывод в Befunge включает пробел после числа, так что это не чисто вывод символов.Еще один сомнительный трюк, который мы можем использовать, - это вариант
g
вышеописанной техники. Вместо того, чтобы ограничивать себя командами Befunge для префикса, мы также можем технически использовать любой символ, который не является командой Befunge. В большинстве интерпретаторов нераспознанная команда игнорируется, поэтому вg
конечном итоге будет прочитано значение ASCII предыдущего символа. Это позволяет нам генерировать большинство других значений ASCII, которые иначе не могут быть рассчитаны в 3 байта. В качестве одного примера:Qg1+,@
получает вас R .Наконец, есть три особых случая. Г не может быть сгенерирован в менее чем 5 байт, поэтому мы должны прибегать к
"f"1+,@
. Запятая является наиболее сложной, требующей динамической модификации лопая:0g4-:80p @
. Мы могли бы использовать подобную технику , чтобы избежать на характер, но более эффективный хак использовать%
команду ( по модулю) в качестве терминатора, то есть88*,%
. Когда%
достигается, в стеке ничего нет, поэтому вычисление по модулю генерирует деление на ноль, и на эталонном интерпретаторе это завершит программу.Ниже приведен полный список программ, по одной на строку.
источник