Если вы незнакомы с хакером Typer , см. Hackertyper.net . Короче говоря, это программа, которая выводит один кусок кодовой базы за нажатие клавиши для комедийного эффекта. НО, версия hackertyper.net слишком проста для реализации. Он просто выводит три символа за раз из произвольного фрагмента кода. Для этой задачи программа должна вывести свой собственный исходный код и распечатать один фрагмент кода с пробелом на каждое нажатие клавиши.
Детали
- Нельзя жестко закодировать имя файла для программы; оно должно определять свое имя динамически. Если программа компилируется в исполняемый файл, она может добавить стандартное расширение файла к имени исполняемого файла (исключая EXE-файл, если используется Windows) и предположить, что исходный файл находится в каталоге исполняемого файла. Например, если исполняемый файл C называется «hacker», он должен извлечь свой исходный код из файла с именем «hacker.c» в том же каталоге. Если скомпилированная программа имеет расширение, ее следует удалить перед определением имени ее исходного кода («typer.exe» -> «typer.cs»).
- Программы должны содержать не менее 5 пробелов, по крайней мере один символ между каждым пробелом. Это означает, что наименьший возможный размер для этой задачи составляет 9 байтов. Пробелы не должны быть решающими для функционирования программы.
- Любое форматирование (отступ, новые строки и т. Д.) Должно быть сохранено в выходных данных. Это форматирование может быть либо напечатано с кодом, который его обрабатывает, либо следует за ним, важно то, чтобы форматирование сохранялось.
- Старайтесь не использовать комментарии, чтобы удовлетворить требование 5 пробелов, если нет другого способа реализовать пробелы на выбранном вами языке.
РЕДАКТИРОВАТЬ : новые строки могут использоваться вместо или в дополнение к пробелам в качестве разделителей чанков.
Ответы:
Баш, 51
58источник
2: read: Illegal option -s
)cat $0
и тильды на$(<$0)
IFS=\
необходимо, если вы опустите шебанг? IFS по умолчанию - это что-то вродеIFS=$'\n\t '
, и, поскольку у вас больше нет новой строки, я не думаю, что вам нужно ограничивать его только пробелом.for w in `<$0`;{ read \-sn1;printf $w\ ;}
HTML & JavaScript, 123
Это работает аналогично хакерскому типу, но с собственным исходным кодом. Дайте мне знать, если я неправильно понял правила.
И вот стилизованная версия (170 символов):
Я сделал демо . Он модифицирован, потому что JS Bin добавляет много дополнительного кода, но общая идея та же.
источник
<head>
эту причину в то, что браузер добавит его, если его там нет, поэтому он всегда будет отображаться. Я забыл,<html>
хотя.Perl + Term :: ReadKey, 56 байт
Спасибо ThisSuitIsBlackNot за оригинальное вдохновение и primo за предложение
open 0
и<0>
.Обратите внимание, что после новой строки на
for
самом деле нет необходимости, за исключением того, что мне нужно включить одну дополнительную новую строку где-нибудь, чтобы количество пробелов достигло указанного минимума пяти.Также обратите внимание, что, как и представление ThisSuitIsBlackNot, для этой программы требуется модуль Term :: ReadKey из CPAN. В Debian / Ubuntu Linux этот модуль, если его еще нет, можно легко установить с помощью команды
sudo apt-get install libterm-readkey-perl
.Кроме того, чтобы сохранить несколько символов, эта программа не восстанавливает нормальный режим ввода при выходе, поэтому вы можете оказаться не в состоянии увидеть, что вы печатаете после этого. Выполнение команды оболочки
stty sane
илиreset
должно исправить это. Эта проблема может быть исправлена за счет дополнительных 10 байтов с помощью:Бонус: Pine Quine, 81 байт
Опять же, перевод строки после запятой необходим только для соответствия минимуму пяти пробелов.
В отличие от 56-байтовой программы, описанной выше, этой версии на самом деле не нужно читать собственный исходный код, поскольку она основана на квине, в частности, на этой квине:
Приятной особенностью этого квайна является то, что он может легко переносить произвольную «полезную нагрузку» внутри
q{ }
блока, не повторяя ее. В то время как это не может совсем разбить<0>
в короткой, это действительно довольно близко.Примечание. Эта программа использует
say
функцию Perl 5.10+ и, следовательно, должна вызываться с помощью-M5.010
(или-E
) переключателя командной строки. Согласно установленному консенсусу в отношении мета, такие переключатели, используемые для включения возможностей современного языка , не считаются дополнительными символами . Самое короткое решение, безsay
которого я могу найти, составляет 83 байта:И то, и другое можно сделать более удобным для терминала (путем объединения двух последних строк и) вставкой:
до последнего
}
.источник
stty sane
вместоreset
(что иногда может привести к чему-то большему, чем просто сброс некоторых параметров терминала ^^)open F,$0
и<F>
может быть заменен наopen 0
и<0>
. Кроме того, я бы сказал, что один пост в мета не является консенсусом. Опция-M5.01
не «подводит язык к определенной точке» , как предлагает автор, она включает функции. Нет версии perl, для которой эти функции включены по умолчанию.ruby golfscript.rb foo.gs
считать действительной командой для запуска программы, написанной на GolfScript, тоperl -M5.010 foo.pl
следует считать действительной командой для запуска программы, написанной на «Perl 5.10». Но такие аргументы действительно принадлежат мета, а не здесь.)Python 3 - 124 байта - 7 пробелов
Код:
Ungolfed:
Стилизованная версия:
источник
Руби,
85, 71Жаль, что
IO#raw
это не является частью стандартной библиотеки.улучшение
Это исключает вызов Kernel # exit и использует глобальные переменные для сокращения кода.
источник
Befunge - 21
Я довольно доволен этим, как только что узнал о Befunge. Если вы не против набрать текст во всплывающем окне, вы можете запустить его здесь или здесь, пока я не найду лучшего онлайн-переводчика.
источник
Powershell, 89
источник
Питон 3 - 299
Это Quine. Сокращено с 507 с использованием
exec
и перемещением некоторых утверждений.источник
C
211186 байтМое решение в C с использованием библиотеки curses. Это может быть длиннее, чем другое решение C, но это Quine. Хотя это и не требуется по этому вопросу, это все же довольно приятно. Это также работает довольно хорошо:
Более читаемая версия с некоторыми комментариями и прочим:
компилировать с:
источник
C -
136 135132 байта (только для Windows)Примечание: в конце программы есть пробел, который, вероятно, не будет отображаться.
Я не могу гарантировать, что эта программа будет работать на одном компьютере, кроме моего собственного, так как она ужасно взломана. Когда бы у всех были только 32-битные машины, все было бы намного проще. Тогда мне не нужно было бы беспокоиться о
sizeof(int*)
том, чтобы быть 8 (что это определенно; я распечатал это, чтобы убедиться), в то времяsizeof(int)
как 4.К счастью, имя исполняемого файла хранится в первой строке в argv.
Однако размещение указателя в качестве аргумента функции означает, что мне нужно явно указать тип ВСЕХ аргументов функции - то есть мне придется вводитьК счастью, я нашел обходной путь. У меня был второй аргумент к mainint
дважды - огромная трата символов.q
, будь просто еще одним int. Затем присвоениеq
переменной типаint**
каким-то образом удалось извлечь все необходимые байты из стека.Мне не удалось найти какие-либо подобные приемы, чтобы интерпретировать возвращаемый тип
fopen
как указатель без объявления функции.Редактировать: заметил, что я должен использовать
~fscanf(*v,"%s",b)
вместо,fscanf(*v,"%s",b)>0
так как возвращение -1, когда достигается EOF.источник
void **v;
) вместо прототипированияfopen()
.fopen
. Я не понимаю, почему замена void на int должна иметь значение, так как все указатели в любом случае имеют одинаковый размер.b[1<<20];main(int *c,char **v){strcpy(b,*v);strcat(b,".c");c=fopen(b,"r");for(;fscanf(c,"%s",b)>0;printf("%s ",b))getch();}
(я должен был заменитьgetchar()
наgetch()
хотя).*fopen()
вместо*fopen(a,b)
?Perl - 87 байт
Я не видел в правилах ничего о том, что делать после того, как файл будет прочитан до конца, поэтому он просто ожидает ввода после печати последнего фрагмента.
источник
node.js с LiveScript:
асинхронная версия:
источник
Кобра - 147
CobraCore.exePath
это так полезно!источник
Javascript ES6, 154
Firefox 154 :
Chrome 175 :
Оба 274 :
Ungolfed (хром):
Имеет две версии, потому что Chrome не обрабатывает функцию стрелки и консоль не очищается одним и тем же методом
Firefox one работает с firebug, кажется, что консоль разработчика по умолчанию не может быть очищена из скрипта.
источник
Groovy - 379
Поскольку
getch()
в Java и Java-esque-языках, таких как Groovy, нет или эквивалент, в основном мой код не обрабатывает нажатия клавиш. Вот и все: Dисточник
C, 248 символов
Правда квайн
Работает только в Unix, в Windows это будет реализовано с помощью _getch.
источник
HTML и Javascript, 232 байта
Традиционный Javascript Quine, но модифицированный.
JSFiddle здесь .
источник
SmileBASIC,
7975 байтПолучить очень ЛИНИЮ программы в SmileBASIC очень просто, поэтому я просто ставлю пробелы перед каждым переводом строки.Я думал, что я такой умный, ставлю пробелы перед каждым разрывом строки, но, видимо, нам разрешено использовать разрывы строк вместо пробелов ...Объяснение:
источник
Haskell
источник