Напечатайте фразу, And she said, 'But that's his.'
используя только следующие символы: abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
Никаких знаков препинания или неалфавитных символов. Вы можете использовать любой язык программирования, который вы хотите. Пробелы полностью разрешены. Кратчайшая программа выигрывает.
51
a-zA-Z
. Теоретически я мог бы использоватьw
rite иE
val для создания необходимых инструкций, но ни один из них не+-*,%'"
может быть создан без использования (по крайней мере) одного из+-*,%'"0-9
.(programmer-of (language 'lisp))
не любит это.Ответы:
Пробелы ,
417414349265 байт265 байтов благодаря Кевину Круйссену
Попробуйте онлайн!
Разъяснение:
источник
Whitespace is completely allowed.
Я вижу, вы поняли это буквально.NNN
для выхода, так как он уже останавливается с ошибкой, когда вы выполняете добавление до print_char, поэтому он даже не будет следовать после Jump_to_Label. Кроме того, зачем хранить63
в начале и получить его в цикле? Вы можете просто нажать его перед добавлением. И почему ярлык-номерTTSSSSTN
? Метка может даже быть пустой, поэтому достаточно простоNSSN
создать метку иNSNN
перейти к метке, когда вы используете только одну метку.63
? Я не уверен на 100%, что здесь самая короткая постоянная. Если это так, что-то не так с моей постоянной генерирующей программой, которую я написал для более ранней задачи. :)102
самая эффективная: 281 байт (или здесь с подсветкой ). (ПРИМЕЧАНИЕ: я также использовал одну копию, чтобы сохранить 4 байта для пробела между нимиehs dnA
(скопировано из пробела между нимиdias ehs
).Perl 5 ,
13310295 байтПопробуйте онлайн!
Объяснение:
Регулярные выражения, print и chop все применяются к переменной
$_
по умолчанию.Заменяет пустую строку на
And she saidZ ZBut thatZs hisZZGjGGf
.Заменяет каждый
Z
с результатом evalingchr oct oct oct ord chop
. Это удаляет последний символ$_
, берет его код ключа, интерпретирует его как восьмеричный трижды и преобразует его обратно в символ. Например,j
→ 106 → 70 → 56 → 46 →.
.Из-за того, как работает замена, изменения,
$_
которые происходят при оценке замены, теряются,$_
как и сейчасAnd she said, 'But that's his.'GjGGf
.Удаляет все
G
,j
иf
в$_
.источник
print
сsay
на -2 символов. Текущий мета-консенсус говорит, что флаги командной строки-M5.010
не учитываются в счетчиках байтов.> <> ,
916915903 байтаСначала я думал, что решение в> <> невозможно, но потом я понял ... кому нужны условные выражения или логическое управление? : D
Попробуйте онлайн
Я неоднократно помещаю числа (число 15) в стек, затем увеличиваю длину стека и печатаю символ с этим значением ASCII. Если мне нужно уменьшить длину стека, я уменьшаю в стеке три значения за раз, используя
p
, или одно за раз, используя,g
если я в пределах трех от цели. Программа заканчивается вызовомi
(input), который нажимает a,-1
так как нет ввода, а затем печатает его, чтобы вызвать ошибку.Это программа на Python 3, которую я использовал для создания решения, когда подумал, как это сделать:
Попробуйте онлайн
источник
p
: создать 59 в стеке при движении вверх от пространства кs
дюймуsaid
, а затем поместить его в коде на пути вниз отd
к,
. (Обратите внимание, что (15,15) имеет 15 к этому моменту.)l
иp
помещать несколько полезных символов в прямоугольник (10,10) - (15,15), а затем извлекать ихg
там, где это более удобно.Сборка 8086 на IBM PC,
1463845664 байтаПояснение: Фактическим источником ассемблера является запись, а не сгенерированный машинный код.
Сложность заключается в том, что большинство инструкций x86 (таких как ADD, SUB, JMP, условные переходы, доступ к памяти) имеют два аргумента и, следовательно, нуждаются в запятой или адресе памяти. Таким образом, мы не можем использовать сложение, вычитание, ifs или циклы!
Во время моей первой попытки я смог «построить» числа, используя комбинацию приращения, уменьшения, умножения, деления, байт-трюков и непонятных команд BCD (таких как AAA, DAS). После этого я понял, что эту идею можно использовать для создания самоинспектируемого и самоизменяющегося кода.
Попытка 1. (1463 байта)
Использовали доступные инструкции для построения кодов ASCII и адреса 0xb800 экранного буфера. Расчет каждого персонажа в последовательности был сыгран вручную.
Попытка 2. (не завершена)
Понял, что есть код операции для каждого целого числа в диапазоне 0x40-0x5f. Этот диапазон включает AZ. Так, например, INC CX соответствует 0x41 = 'A'. (Эта таблица кодов операций очень удобна.)
Я попытался создать 3 строки «данных» и наложить их друг на друга. Первый «как есть» (в верхнем регистре), второй «смещен» в зону 0x60-0x7f (в нижнем регистре), а последний «сдвинут» в зону 0x20-0x3f (пунктуация).
Самомодифицирующийся код создаст цикл или три для перебора данных.
Попытка 3. (845 байт)
Как и в предыдущем подходе, но для сокращения данных строка будет закодирована только один раз, с «управляющими символами», смешанными для переключения наборов символов.
Попытка 4. (664 байта)
Как избавиться от управляющих символов, которые требуют много исправленных инструкций, чтобы иметь дело с ветвлением? Учитывая, что используются только две заглавные буквы, я подумал, могу ли я «перевернуть» таблицу кодов операций для кодирования строчных букв, используя диапазон 0x40-0x4f и пунктуацию, используя диапазон 0x90-0x9f (вычитая из 0xc0). «А» и «В» могут быть вставлены отдельно.
Однако только половина опкодов в диапазоне 0x90-0x9f пригодна для использования, и они не совпадают с необходимыми. Тогда я подумал, что, может быть, смогу перетасовать их, используя XOR, и нашел тот, который сработал. И вот оно.
Golfed:
Собрать с
и запустите в DOSBOX (сначала запустите CLS). Выглядит так:
комментарии:
источник
INC AX
а без комментариев -INC AL
.label1 db
отдельную строку. Это выдаст предупреждение, но без ошибки.Perl 6 ,
1299127212201215 байтСпасибо Грими за -27 байт.
-52 байта, потому что в первую очередь нам не нужны кроличьи уши.
Спасибо Джо Кингу за -5 байтов.
Попробуйте онлайн!
Выводит строку с завершающим переводом строки. Если вы не хотите этого, замените последний
say
наprint
. Вы также можете заменить новые строки в источнике пробелами.объяснение
Этот код печатает строку символ за символом. Каждый символ формируется путем подачи соответствующего кода символа в
chr
функцию и,lc
если необходимо, в нижнем регистре .В настоящее время все значения генерируются путем генерации строки с правильным количеством символов в ней; в некоторых случаях количество символов является обратным к целевому символьному коду. Теоретически должно быть возможно использовать математические функции, такие как
log
иexp
непосредственно, но я не нашел, чтобы их было очень легко использовать.Для использования в качестве чисел, мы имеем
e
,pi
иtau
; в правой частиx
илиxx
они неявно перекрыты. Все они имеют 17 символов в своих строковых представлениях, поэтому мы используемe
минимальное количество символов. У нас также естьi
(4 символа),False
(5 символов) иNaN
(3 символа). Мы можем умножить длины строк наx
;xx
умножает один плюс длина строки на правую часть и добавляет один.chop
удаляет один символ из строки в случае, если мы один от цели.Операторы печати связаны друг с другом с использованием
and
, что имеет довольно низкий приоритет. Это почти чудо, оно существует; в противном случае нам пришлось бы использовать незаконные точки с запятой.Я нашел выражения для персонажей от руки. Возможно, стоит поискать их программно, чтобы найти более короткие выражения.
источник
Ширина ,
6664 байтПопробуйте онлайн!
Отпечатки для отладки. Для печати в stdout добавьте
ww
конец кода, который выскочит и выведет верхнюю часть стека.объяснение
В ширине каждая буква соотносится с числом, исходя из того, насколько она широка, согласно этой таблице . Каждой букве присваивается число от 0 до 9. Затем эти цифры используются для фактического выполнения кода.
В частности, буква, отличная от совпадения
7
, начнет строковый литерал. Он будет читать наборы из двух букв одновременно, пока не прочитает исходное письмо снова. Каждый набор из двух букв будет преобразован в их числа ширины, прочитанные как десятичное число от 0 до 99, и символ, которому они равны, будет их индексом в следующей строке:Например, индекс
!
равен 1, поэтому01
будут правильные значения ширины. Таким образом,if
,iI
,jt
и т.д. будет весь коррелят струнного литерала!
.В этом случае я перевел 31 символ требуемого вывода в соответствующие буквы, используя
Q
в качестве кавычек. Вершина стека печатается для отладки после завершения программы.источник
машинный код x86 (32-разрядный), 256 байт
Когда я печатаю свой код на консоли кодовой страницы 437, я вижу следующее:
Он содержит некоторые пробельные символы, так что здесь один и тот же код, когда я заменяю все символы табуляции на
→
и все неразрывные пробелы (с кодом 255) на*
:HexDump:
Некоторые пояснения о том, как это работает:
Полезные инструкции:
push imm8
,push imm16
аpush imm32
затемpop
генерировать константы. Это также может генерировать ноль (inah
) при нажатии byte (imm8
).and [ecx+32], ah
- предполагая, что ах = 0, это устанавливает байт в ноль. Так уж получилось, что длина выходной строки равна 32, поэтому код заполняет буфер от конца до начала.or [ecx+32], edx
- при условии, что выходной байт установлен в ноль, это копируетedx
(4 байта) для вывода. Я использую вариант сdx
вместоedx
конца буфера, потому что он не должен записывать за пределы выходного буфера. Ограничение на код делает невозможным запись отдельных байтов таким образом!imul edx, [ecx+32], whatever
- это основная идея борьбы. При достаточной энтропии[ecx+32]
и любом количестве она может генерировать любой результат. Я использую его для генерации 2 или 3 байта необходимых значений. Некоторая сложность заключается в том, что при записи его в выходной файл он должен выполнять логические операцииOR
с тем, что уже есть. Это иногда приводило к необходимости обнуления памяти еще раз.jmp
инструкции используется для возврата. Я выбрал его, потому что это кодировка0xff
, которая соответствует неразрывному пробелу в кодовой странице 437. Немного натянуто по правилам, но в остальном я думаю, что задача невозможна ...Исходный код сборки вместе с программой на C, которая его запускает (использует синтаксис Visual Studio):
источник
dec ecx
+and [ecx+32], ah
материал может быть вынесено.0xff
нарушает "Никаких знаков препинания или неалфавитных символов вообще"?PostScript,
889874837835 байтПопробуйте онлайн!
Это использует 32 копии целых чисел
89 25 20 6
. Все коды целевой строки могут быть получены с помощью операций с этими целыми числами в порядке стека: например, «A» (ASCII 65) равно 89 - (25 & (20 + 6)). Многие 4-целые кортежи имеют это свойство; этот был выбран, потому что их особенно легко генерировать.Flat по умолчанию равен 1, поэтому создается строка длиной 1 (инициализируется в
\0
).dup
не глубокая копия: она создает вторую ссылку на ту же строку. rrand выталкивает случайное семя, которое по умолчанию равно 0. Стек теперь["\0", "\0", 0]
.count
толкает количество элементов в стеке, так что это вычисляет 3 ^ (3 * (5 * 6)) = 89.4 * 5 = 20, 5 * 5 = 25, 6 = 6. Стек сейчас
["\0", "\0", 0, 89, 25, 20, 6]
.Дублируйте весь стек пять раз. Таким образом, мы получаем 32 копии нашего начального стека из 7 элементов. Нам нужно всего лишь 31 копию, поскольку длина целевой строки составляет 31 символ, но дополнительная копия не помешает.
Вычислите код из первых четырех целых чисел, запишите его в индекс 0 строки, затем напечатайте строку.
Подавляет приглашение по умолчанию.
источник
Рубин ,
420 354338 байтПопробуйте онлайн!
В порядке возрастания рывков:
Слова, начинающиеся с заглавной буквы, можно распечатать, определив класс с таким именем и вызвав его
display
в теле определения класса.Другие слова можно отобразить, определив методы с этим именем, которое возвращает Symbol, а затем приведя его к String, чтобы удалить начальный двоеточие.
Другие символы могут быть отображены путем вызова
putc
их кода ASCII. Мы можем сгенерировать соответствующие числа, повторно используяString def
трюк, чтобы получить строку, а затем взяв сумму ее байтов, используя модуль, определяемый ее размером. К сожалению, у нас нет никакого способа вызвать методы объекта, кроме как из определения класса этого объекта, что затрудняет передачу аргументов. Таким образом, последний взлом заключается в переопределенииString#inspect
, которое вызывается неявно при передаче вp
метод String , чтобы он вычислял и выводил соответствующий символ в качестве побочного эффекта, прежде чем выдавать ошибку, чтобыp
фактически не завершить выполнение и напечатать новая линия. Тогда нам нужно спасти ошибку в основном коде.Редактировать: Джордан сделал число байтов намного меньше, хм, высокий с некоторым умным управлением потоком управления, и я сократил еще несколько байтов, заменив
raise
несуществующим вызовом метода из одной буквы, который вызывает NameError.Редактирование 2: заметил, что при
print String
извлечении в метод дешевле использовать его с определением метода, чем использовать трюк с определением класса, поскольку методы допускаются в качестве заголовка.источник
sum size
получается сумма по модулю ее размера, но все остальное проверяется!> <> ,
233122 байтаПопробуйте онлайн!
Это началось с того, что я получил ответ mbomb , но я обнаружил фундаментальный сдвиг, который экономит огромное количество байтов, поэтому я публикую его как свой собственный ответ.
Генерирование не алфавитных символов для вывода выполняется путем многократного помещения значений в стек, а затем с
l
помощью увеличения длины стека. Однако, это не должноp
быть выведено немедленно: используя , этот символ может быть помещен в любую ячейку, чьи координаты находятся между 10 и 15 включительно, чтобы быть найденными позже сg
. Точно так же алфавитные символы могут быть помещены в исходный исходный код и читаться следующим образом: поскольку самый высокий код не алфавитного символа на входе равен 46 (.
), это означает, что стек не нужно помещать выше, чем 62, необходимые для хранения все 31 символов вывода.Кроме того,
v
в коде в столбце 7 помещается символ a . Когда указатель команды оборачивается и попадает в негоv
, последовательностьgo
повторяется для считывания из заданных координат и вывода соответствующих символов. В конце концов, стек становится пустым иg
завершает программу с ошибкой.Первые 7 байтов кода используются повторно как переданные первые 7 и последние 7 координат. Размещение
v
в столбце 9 теоретически позволило бы сохранить еще два байта, но заставило бы символыAinsv
в квадрате 2x2 в коде, что невозможно. В более ранней версии использовался столбец 15, но это требовало дополнительной строки в исходном коде и заканчивалось на шесть байтов длиннее.источник
r
перемещение выравнивания куда я хочу. Тем не менее, игра в гольф от этой программы немного вредит моему мозгу.CJam , 262 байта
Попробуйте онлайн! Новые строки показаны здесь только для ясности; каждая строка представляет символ.
Вот это было весело. Ограничение себя алфавитными командами ставит некоторые интересные задачи:
{
и}
, практически нет возможности для потока управления (кроме тогоf
, который я не нашел возможности использовать).\
,_
,;
или$
, у нас нет никаких средств для манипулирования стека.Это означает, что основной целью будет получение соответствующих кодовых точек в стеке, а затем преобразование их в символы с помощью
c
.Проблема в том, что нам также не хватает большинства основных арифметических команд, а также целочисленных литералов. Это хорошо, хотя, поскольку
m
пространство имен содержит множество сложных математических операций, и есть много переменных, предопределенных для полезных чисел.В итоге я интенсивно использовал квадратные корни (
mQ
иmq
), экспоненциальную функциюme
и базовое преобразование (b
), которые также можно использовать для эмуляции умножения ([X 0] Yb
вычисляет X * Y). Кроме того, иногда проще создать заглавную кодовую точку, и в этом случае мы можем использоватьel
(преобразовать в нижний регистр) результирующий символ.Я все еще не удовлетворен некоторыми из более длинных. Ну что ж.
объяснение
Это посимвольное объяснение вывода. Прежде чем я начну, вот несколько коротких способов сделать цифры:
T
,X
,Y
,Z
соответственно.A
черезK
.Sci
(S
выталкивает строку, содержащую пробел,c
получает первый символ этой строки иi
преобразует этот символ в его кодовую точку).S
также используется для пробелов.GmQ
(целочисленный квадратный корень из 16).AZbYb
(преобразовать 10 в базу 3, получая[1 0 1]
, и преобразовать полученный массив чисел в базу 2, получив 5).Ymei
(вычислить exp (2) и преобразовать в целое число).A
n
d
s
h
e
a
i
,
'
B
u
t
.
источник
HYbYCtYbc
,HYbXAtYbc
иHYbXBtYbc
.Deadfish ~ , 943 байта
Попробуйте онлайн!
Петли не допускаются
:(
источник
зло , 198 байт
Попробуйте онлайн!
Это было довольно весело.
источник
Stax ,
133958479 байтовЗапустите и отладьте его
источник
MATL ,
187158 байтПопробуйте онлайн!
Более читаемая версия: попробуйте онлайн! Ручная попытка построения строки. Вероятно, есть много места для игры в гольф, разрезая струны на удобные куски, используя
P
иh
для переворачивания и построения струны. Я надеюсь, что кто-нибудь примет вызов, чтобы перехитрить меня. Основная проблема в том, что вы не можете использовать+
или-
, поэтому базовая арифметика часто невозможна.Особенности:
KQthpYq
: 25-е (KQthp
) простое числоYq
равно 97, что соответствует буквеa
. Букваs
(115) генерируется аналогично из 113, 30-го простого числа. Затем он широко используется в буфере обменаJ
.his
сокращается путем сохраненияh
в буфере обменаJ
. Так как это ранее сохраненоs
, мы строимhis
в обратном порядке, так что мы все еще можем извлечь недавнееs
использованиеy
, и перевернуть его после использованияP
.h
вvle
)источник
v
помешаетh
мне раньше. Думаю, мне следовало это сделать, а не просто предполагать. Кроме того, спасибо за заголовок, произошло чрезмерное удаление. Мне любопытно посмотреть, сможешь ли ты добиться большего успеха, чем это ...U
означает^2
, что это могло бы спасти меня довольно много байтов ...MATL , 118 байт
Попробуйте онлайн!
Более читаемая версия (каждая строка соответствует одному символу, кроме операций перестановки стека).
объяснение
Программа выдает кодовые точки нужных символов в виде независимых чисел. В конце все эти числа объединяются в вектор-столбец, преобразуются в вектор-строку и преобразуются в символы. Результат неявно отображается.
Некоторые из используемых трюков:
0
используется для большинства пробелов, потому что он стоит только byte (O
).15
используется (генерируется какKUq
), потому что он может быть использован повторно, добавив его в100
(chard
), чтобы дать115
(s
). В другом случае5
используется для пробела (генерируется какKQ
), поэтому его можно впоследствии вычесть из44
(,
) в give39
('
).J
используется для хранения символов, которые будут повторяться: сначалаs
, потом'
. Точно так жеH
хранит буфер обмена100
, который полезен дляd
и для генерации других символов.Q
(сложение1
),q
(вычитание1
),E
(умножение на2
) иU
(квадрат), а также предопределенные литералы в буферах обменаI
(3
) иK
(4
).h
) и вычисления его суммы (s
) или последовательных разностей (d
).100
(d
) генерируется как4
в двоичном, интерпретируется как десятичное число.110
(n
) получается из65
(A
) путем преобразования в строку ('65'
: кодовые точки[54 53]
), добавления1
к кодовым точкам ([55 54]
), их суммирования и сложения1
.w
), bubble upb
).источник
O
вместоKWE
пробелов. И вы подтвердили мое подозрение, что, вероятно, лучше пожертвовать другим буфером обменаH
.постоянный ток ,
240222209 байтПопробуйте онлайн!
Моя первая мысль была такой же, как у @seshoumara, просто поместил достаточно материала в стек, чтобы сгенерировать все значения ASCII символов. Тогда мне пришло в голову, что, поскольку
+
,-
и*
являются односимвольными операторами, я могу просто воссоздать их и иметь возможность использовать арифметику! Конечно, это будет меньше!И я не удивлюсь, если мне удастся отыграть больше байтов, но пока ... этот замысловатый подход сумел связать наивный.OOOOOziOOOOOOOOOOOOOOOOOOOOOOOOOOOzddddddzkdddzasBdzasAdzscdzdasCzsd
это часть подхода, похожая на @ seshoumara's, но мы поднимаемся только до 46, то есть.
. Мы делаем это, потому что нам нужно подняться до 45,-
и нам также нужен период в нашей строке, поэтому просто пойти еще дальше на этот период (я думаю) дешевле. По пути мы храним некоторые значения: 5, 32, 39 - все пригодится позже. 5 для утилитарных вещей, 32 и 39 для их значений ASCII. Первоначально я делал 1-5, но это было дорого, и я мог просто избежать использования 4; используйтеZ
(введите значение, нажмите количество цифр, которое у него есть) на трех-, двух- или однозначное число для этих значений. На 42, 43 и 45, мы превращаем их в строки (*
,+
и-
соответственно) и сохранять их в виде макросов (B
,A
иC
соответственно). Это означает, что без использования символов*+-
теперь мы можем использовать эти операторы.Отсюда мы в основном начинаем генерировать значения ASCII, используя математическую силу вместо простого накопления, сохраняя некоторые повторения по пути. 100, 105 и 115 достаточно, чтобы их хранение (в регистрах или иным образом) имело смысл. Первоначально я оставил стек заполненным 10 секундами и использовал их, чтобы сделать 100 секунд; в итоге мы сохранили байты, чтобы заполнить стек 32-мя и позже использовать их в качестве пробелов. Чуть более читаемая версия раздела ASCII:
OOlAxlAxP OBlBxdIlAxoP AdlBxddsrIlAxssP P OP lsIZlCxddspP OZlCxP P OP lrdZlCxP lsP lrP lcP P KP dZlBxdZlAxP OAZlAxdP IZlCxdP rPdP lpP lrdZlCxP P KP OP P lpP lsP OP ldP KP
.Сбросил 18 байт путем: сохранения числа 5 в качестве входного радиуса вместо регистра; число 32 как точность вместо регистра; число 115 в качестве выходного радиуса вместо регистра; то пришлось изменить ,
KZ
чтобыIZ
генерировать 1s иOZ
дляKZ
генерировать 2s.Сбросил еще 13 байтов, заполнив стек 32-мя; установка точности до 39; использование стековых манипуляций, чтобы избежать сохранения 116; вырезая двойную работу, которую я случайно оставил.
источник
a
для воссоздания этих операторов, а затем вызвать их сx
. Это показывает поведение данных в коде dc. Когда у меня будет время, я применю ваш последний прием хранения данных в параметрах, а не в регистрах. Как вы думаете, мы могли бы получить еще более короткое решение по постоянному току, злоупотребив тем, как P работает для печати большего количества букв за раз, если нам повезет ввести необходимое огромное число, используя только шестнадцатеричное число?P
16750 или 0x416E. Если нам просто повезло, и одна из подстрок состояла исключительно из значений AF, то это могло бы дать нам ярлык. Это было бы немного удачи, хотя! В противном случае мы будем либо вводить большие числа каким-то образом, либо придумывать их, либо делать много сложений и умножать на 256. Что кажется ... короче, чем кучаP
s.Japt , 87 байт
Попробуй
объяснение
Первая строка генерирует
'
и присваивает ее переменнойU
.Вторая строка присваивает
2
переменнойV
.Третья строка генерирует
.
и присваивает ее переменнойW
.Последняя строка затем строит строку по одному символу за раз в обратном порядке.
источник
Qc dGaB
Красный , 272 байта
Если необходимы двойные кавычки:
Красный , 344 байта
Не работает в TIO, но работает в интерпретаторе Red.
Объяснение:
Слова тривиальны - я печатаю их (печатать без перевода строки) как литералы
quote
. Красный имеет встроенное слово для пробелаsp
, равно какcomma
иdot
."
и что'
еще интереснее: я печатал их, вычитая пробел изB
и,G
соответственно, начиная с литералаB
иG
, преобразовывая их сначала в строку с символом,mold
а затем в символ (чтобы использовать для них вычитание) wtihto sp
(у Red есть преобразование по прототипу - преобразовать строка типаsp
, который является символом).источник
'
, поэтому решение с 272 байтами такое же.Forth (gforth), 351
Жаль, что я не могу переопределить CHAR или EMIT для однобуквенных слов, поскольку для этого потребуется использовать либо
:
и;
(например: C CHAR ;
), либо'
(например' CHAR ALIAS C
)На самом деле, если бы я мог определить слова, я мог бы сделать,
: P CHAR EMIT ;
а затем сделать,P x
чтобы напечататьx
. Ну что ж.Я даже не могу создать буфер, записать эту последовательность символов туда, а затем использовать ее в качестве входных данных, поскольку запись в память требует использования
!
илиC!
источник
AlphaBeta ,
180 177 175163 байтаПопробуйте онлайн!
WIP
источник
Пепе , 266 байт
Я держу стек R пустым, а в стеке R
Это не на TIO, но вы можете попробовать это здесь
источник
постоянный ток , 240 байт
Основная идея состоит в том, чтобы постоянно увеличивать стек на 1 (
K
), сохраняя (sX
) размер стека (z
) в пользовательских регистрах, когда он соответствует каждому уникальному ASCII-коду. Печать (P
) выполняется повсеместно.Попробуйте онлайн!
Я провел некоторую оптимизацию, например не сохранил букву, если она не используется после этого, например, продублировал (
d
), например, букву t, например, t, в стеке для сохранения байта, так как функция rev (lX
) составляет 2 байта.источник
Машинный код 80186+, формат MS-DOS .COM,
822787 байтТолько буквы и пробелы используются в дополнение к буквам. Учитывая, что большинство опкодов в разрешенном диапазоне - это определенные приращения, убывания, толчки, всплывающие окна и косвенные регистры AND и OR, в дополнение к IMUL, я использую тот факт, что регистр стека переносится, когда он достигает конца сегмента для изменения кода в обратном порядке! Сборка 80186+ требуется, потому что я выдвигаю непосредственные значения.
Аннотированный источник (формат TASM):
источник
Befunge-98 (FBBI) ,
125124121 байтПопробуйте онлайн! Вывод в файл с именем
\n
(одна новая строка). Спасибо Джо Кингу за его сценарий.Вывод включает в себя 10 конечных строк.
Только для одного завершающего символа новой строки +1 байт , изменив следующую строку:
Попробуйте онлайн!
Объяснение:
Указатель инструкции перемещается следующим образом:
Программа помещает не алфавитные символы в положение перед выводом этой строки в файл.
Befunge-98 содержит инструкции
a
...f
, которые помещают соответствующее шестнадцатеричное значение в стек. Чтобы сгенерировать другие числа, он передает эти значенияy
(«Get SysInfo») в качестве аргументов для получения:Помещая основную часть кода в y = 23,
ayy
можно использовать для повторного доступа к размеру стека, который затем используется для генерации кодов символов.источник
Pyth , 210 байт
Попробуйте онлайн!
Я нашел несколько чисел, которые можно выразить, используя только буквы (например,
T
= 10,Z
= 0,lG
= длина (алфавит) = 26,Cd
= код (пробел) = 32), и несколько функций, которые можно выполнять, используя только буквы (например,t
= уменьшение,h
= приращение,hF
= повторное применение приращения = сложение), а затем просто запустили поиск методом грубой силы, чтобы найти кратчайшие комбинации этих функций и чисел, которые привели к каждой из нужных мне букв.источник
16-битный код сборки x86, 665 байт
(бинарный алфавитный, а не исходный)Я как-то забыл про правило, разрешающее пробелы. Конечно, код может быть гольф в результате.
Bytecode:
Источник:
Это работает так:
перемещает указатель стека в конец кода через POP AX (не может POP SP, потому что он не алфавитный);
создает инструкцию для отправки вызова DOS (алгоритмически, потому что он не алфавитный);
конструирует неалфавитные символы;
помещает строку в стек;
помещает команду диспетчеризации в стек в точном конце кода, так что выполнение переходит непосредственно к этой инструкции;
создает инструкцию для печати строки;
отображает строку и их быстро вылетает. : - / (Изящный выход потребует больше кода)
источник
Japt , 74 байта
Попробуй
источник
05AB1E ,
145121109 байтПопробуйте онлайн!
источник
Машинный код 80186 + DOS, 91 байт
Текстовая версия:
Текстовая версия с заменой вкладок (код 9)
9
и пробелов (код 32)*
:HexDump:
Машинный код появляется в файле с расширением
.com
. Когда я запускаю его, он печатает требуемое сообщение и затем зависает (выполнение случайных данных).Высокоуровневое объяснение того, что он делает:
,'.$
)int 21
инструкции, которая печатает сообщениеКод сборки (может быть скомпилирован
tasm
):Он использует
popa
инструкцию для извлечения всех регистров, потому что обычныйpop
не может заполнить все необходимые регистры (напримерpop di
, это запрещенный код операции).Адреса байтов для исправления находятся в диапазоне 0x100 ... 0x160. К счастью, они могут быть представлены как сумма 3 байтов с допустимыми значениями:
bp
si
илиdi
Исправление байтов в сообщении работает путем логического
OR
0x20 (пробел) и небольшой константы (4, 7, 12 или 14). Маленькая константа получается путем инициализацииcx
иdx
до 9 (символ табуляции) и выполненияINC
или поDEC
мере необходимости.Исправление кода использует
IMUL
инструкцию. Я нашел необходимые 16-битные константы для умножения с помощью перебора.Наконец, адрес сообщения (0x13b) получается умножением. Чтобы сэкономить место, я взял одну из констант из одной инструкции, которая содержит непосредственное значение
0x96d
. Здесь9
часть выбирает функцию печати DOS, а6d
часть является свободным параметром. Оказывается, что6d
единственная возможность, которая может дать 0x13b после умножения.Разборка кодовой части:
Интересный факт: Обычно я бы использовал
offset message
вместо жестко запрограммированного13bh
, но в этом случае, поскольку во время синтаксического анализа его адрес неизвестен, tasm генерирует 16-битное немедленное смещение, тратя впустую 1 кодовый байт:источник