Напишите программу, которая выводит
Do not repeat yourself!
Код вашей программы должен соответствовать следующим ограничениям:
- его длина должна быть четным числом
- каждый символ в позиции
2n
(гдеn
целое число> 0) должен быть равен символу в позиции2n-1
. Второй символ программы равен первому, четвертый - третьему и т. Д.
Новые строки считаются символами!
Это код-гольф, поэтому выигрывает самый короткий код!
Примеры
HHeellllooWWoorrlldd
является действительной программой
123
или AAABBB
или HHeello
неверны
верификация
Вы можете использовать этот скрипт CJam, чтобы убедиться, что ваш исходный код действителен. Просто вставьте свой код в поле «Ввод» и запустите скрипт.
DDDooo nnnooottt rrreeepppeeeaaattt yyyooouuurrrssseeelllfff!!!
был быОтветы:
Гексагония ,
166126124 байтаВставка неявных no-ops и пробелов, это соответствует следующему исходному коду:
Я уверен, что возможно сократить это еще больше, и, возможно, даже решить это в длине стороны 6, но это становится хитрым ...
Как это устроено
Диаграмма, созданная с помощью Timwi's Hexagony Colorer .
Код полностью линейный.
\
В самом начале перенаправляет IP в диагонали, так что нам не нужно беспокоиться о сдвоенных символов на всех. Цветные пути выполняются в следующем порядке: оранжевый / красный, синий / серый, зеленый, фиолетовый (когда есть два пути одного и того же цвета, сначала выполняется левый путь, прежде чем переходить к правому).Если мы игнорируем no-ops, зеркала и команды, которые переопределяются другими, линейный код сводится к следующему:
Буквы в Hexagony просто устанавливают значение текущего края памяти в код символа буквы.
;
печатает текущий край памяти как символ Мы используем&
для сброса края памяти0
и печати пробела с32;
.}
перемещается к другому краю, так что мы можем помнить32
для дальнейших пробелов. Остальная часть кода просто печатает буквы на новом ребре и иногда перемещается вперед и назад,';}
чтобы напечатать пробел. В конце мы снова перемещаемся к краю пробела'
, увеличиваем значение до 33)
и печатаем восклицательный знак.@
завершает программуисточник
;
, в коде пока что нет абсолютно никакого повторного использования между парами символов. Текущий код - это, в первую очередь, первое, что пришло мне в голову, так что я думаю, что если попытаться достаточно усердно, можно найти гораздо более сложное решение, которое использует точки с запятой и, возможно, даже некоторые буквы, чтобы соответствовать этому. в длину стороны 6.;
раз только один раз, потому что вы не может пройти их горизонтально. В;
вашем коде всего 23 с, и только 6 повторений символов (2 × o, 1 × t, 1 × r, 2 × e), что дает только 29. Лично это более чем убеждает меня в том, что размер 6 невозможен. .GolfScript,
1308476 байтПопробуйте онлайн в Web GolfScript .
Как это устроено
Интерпретатор GolfScript начинает с помещения пустой строки в стек.
Конкатенация массива со строкой выравнивается, поэтому результатом является желаемый результат.
источник
Одинарный , ~ 1,86 × 10 222
Простой бред -> унарный ответ. Очень неоптимальный;).
Программа состоит из четного числа 0; в частности:
из них.
Оригинальный код брейкфук:
источник
1
s в унарной программе, которая выводит запрошенную строку. Второй блок кода - это программа BF, которая использовалась для его создания. Поскольку унарная программа полностью состоит из1
s, она тривиально удовлетворяет требованию повторения.Рубин -
210014281032820670 байтЭто предполагает, что выходные данные могут быть возвращаемым значением из функции (не было указано, что выходные данные должны быть в STDOUT)
Код:
Хитрость заключается в том, чтобы создать строку из пустой строки,
""
используя операцию добавления<<
и коды символов ASCII.Чтобы получить числа для кодов ASCII, я пытаюсь разложить число на значения, которые я могу легко сгенерировать. Например, ASCII
90
просто88+1+1
, что:88
это нормально само по себе11**00
есть11^0
, что просто1
К счастью, оба
++
и--
означаютadd
в рубине, поэтому я могу написать90
как88++11**00++11**00
Есть несколько хитростей, чтобы получить некоторые цифры проще, чем просто добавить 1, вот код, который я использую для генерации вышеупомянутого (который включает все отображения, которые я использую):
Я все еще думаю о других хитростях, чтобы уменьшить количество символов, необходимых для получения числа.
Обратите внимание, что если вы используете
-rpp
флаг и добавляетеpp
в начало кода вот так:тогда для дополнительных 2 + 4 байтов это может функционировать как полностью завершенная программа, но она напечатает дополнительные
"
до и после требуемой строки:Пример:
источник
pp
драгоценный камень - двойная буква ..."
символы в выводе и 2. необходимость-rpp
флага (что не похоже--rrpp
)> <> , 174 байта
К счастью, в некотором смысле ограничение не применяется вертикально. Однако самая большая проблема заключается в том, что нам нужно удваивать каждую новую строку.
Код, который работает примерно так:
Обратите внимание, что в программе нет двойных пробелов - в строковом режиме> <> вставляет пробелы для пустых ячеек. И наоборот, это означает, что решение, использующее
g
(чтение одной ячейки из исходного кода), было бы более хитрым, поскольку пробелы в программе становятся NUL при чтении.(Примечание: это может быть на 50 байт короче, если оно заканчивается с ошибкой , но мне это нравится.)
источник
Скользящий ,
186146 байтЧтобы было ясно, есть три строки кода, середина которых пуста, потому что перевод строки должен быть продублирован. Количество байтов основано на кодировке UTF-16.
объяснение
Блок корейских символов в начале толкает строку
"DDDof� \"\u0002nf�of�twG \"\u0002rw'efVpw\aefVaf\u0016twG \"\u0002yw�of�uwWrw'sw7efVlf�fff!\"\u0012"
. Вы заметите, что каждый третий символ - это тот символ, который нам нужен; остальное - бред. Вот почему:В Sclipting два корейских символа кодируют три байта. Таким образом, каждый корейский символ эффективно кодирует 12 бит. Чтобы получить строку, начинающуюся с
D
, первые 8 бит должны быть0x44
; остальное не имеет значения, но так как мы должны повторять каждый символ, 12–20-й биты тоже будут0x44
. Таким образом, у нас будет значение вида0x44n44n
для некоторого n , которое раскладывается на три байта0x44 0xn4 0x4n
.За
o
что0x6F
мы получаем байты0x6F 0xn6 0xFn
.Поскольку я ленивый, я начал с кодирования,
"DDDooo nnnooottt (etc.)"
а затем заменил все остальные символы на предыдущий, поэтому я получаю0x444444
="DDD"
дляD
и0x6F66F6
="of�"
дляo
. Это�
происходит потому, что0xF6
сама по себе является недопустимой кодировкой UTF-8.Теперь вернемся к программе. Остальная часть программы происходит следующим образом:
Теперь, что я хочу сделать дальше, это использовать
"..."
в качестве регулярного выражения, чтобы я мог сопоставлять три символа из исходной строки за раз, используя конструкцию цикла 替 ... 終. Однако, поскольку каждая инструкция дублируется, мне нужно иметь два таких цикла регулярных выражений, вложенных друг в друга, и, если стек переполняется, я получаю ошибку времени выполнения. Следовательно,и затем начните петли. Таким образом, внешний цикл повторяется только один раз, потому что он сопоставляет регулярное выражение
""
со строкой""
, что приводит к одному совпадению. Внутренний цикл запускается один раз для каждого совпадения"..."
с большой строкой. Тело цикла:На этом внутренний цикл заканчивается, поэтому каждое совпадение регулярного выражения заменяется первым символом этого совпадения. Это оставляет желаемую строку в стеке.
Затем внешний цикл завершается, и в этот момент желаемая строка удаляется из стека, и единственное совпадение
""
в строке""
заменяется им, оставляя желаемую строку еще раз в стеке.источник
Лабиринт , 528 байт
Двойные переводы строки больно, но по крайней мере это доказывает, что это выполнимо!
Каждый символ печатается один за другим, сначала формируя код, а затем печатая один символ. Кодовые точки образованы:
где
Необычное поведение цифр Лабиринта эксплуатируется
33::00&&
, что на самом делеКаждый символ печатается с механизмом
xx
Существует только для прокладки сетки , так что это 5 высоких. Сначала__
толкаем два ноля, затем мы попадаем в оператор поворота сеткиv
. Мы вставляем ноль и вращаемся:и снова:
Затем мы переместимся вправо к
.
третьему ряду, выполнив команду печати только один раз.источник
CJam -
176136 байтСпасибо Sp3000 за разделение размера моей программы на два :-)
объяснение
HH77++
,GG00++
... вычисляют целочисленный ascii-код символов, добавляя числа (например: `HH77 ++ 'помещает 17, 17 и 77 в стек, а затем добавляет эти 3 числа)]]{{cc}}//
перебирает коды ascii и преобразует их в символы.Попробуй здесь
источник
33cc
, но я уверен, что есть некоторые лучшие способы для другихcc
повсюду делайте]]{{cc}}//
в концеСамомодифицирующийся Brainf *** , 72 байта
Обратите внимание, что
\x00
представляет собой буквенныйNUL
шестнадцатеричный байт (пустая ячейка). Исходный код размещается на ленте слева от начальной ячейки.объяснение
Кроме того, перед созданием этой программы я делал одну, используя только символы BF в источнике. Это возможно! Это также намного дольше, так как для нечетного значения ASCII я собирался создать двойное значение, а затем разделить на два. Несколько короче было бы изменить весь источник, чтобы начать с нечетных значений.
источник
DDoo nnoott rreeppeeaatt yyoouurrsseellff!!
(двойные пробелы)? Я вижу два.
с.Change first '.' to '0'
, Я изменил объяснение, чтобы показать (опять же), что первое.
меняется на ноль.Желе , 66 байт (не конкурирует)
Попробуйте онлайн!
Factoid
Программа по-прежнему работает, если вы удаляете каждый второй символ.
Попробуйте онлайн!
Как это устроено
возвращает массив строк. Литерал начинается с a
“
, заканчивается a”
, а строки ограничиваются внутри“
. РезультатАргумент ссылки и возвращаемое значение устанавливаются в этот массив строк, затем выполняется оставшаяся часть исходного кода.
источник
Гаммаплекс , 66 байт
Gammaplex - это двумерный язык, который использует положение первой новой строки в качестве длины строки и игнорирует все другие новые строки.
источник
МСМ ,
270160 байтМоя первая программа для МСМ!
Вывод строки в MSM осуществляется путем помещения отдельных символов в стек и объединения их в одну строку с помощью
.
, например,Количество на
.
один меньше количества символов. ДляDo not repeat yourself!
нас необходимо 22.
с. К счастью, это четное число, поэтому у нас 11 двойныхРазмещение букв перед ним требует дополнительных усилий. Шаблон
делает трюк для каждого персонажа
c
. Он оценивает следующим образомНам нужно 23 таких шаблона, начиная с
!!'',,
и заканчиваяDD'',,
22 командами соединения.
.источник
Befunge 98, 70 66 байт
Попробуйте онлайн!
После моего неверного ответа, вот лучший, который действительно соответствует задаче!
(Спасибо Мартину Эндеру за предложение использовать
��
символ 0x17 вместо88ff++
)Объяснение:
источник
8f+
: tio.run/nexus/…DC ,
348346342306290278 байтФайл
dnr6.short.dc
(без завершающей строки):Бегать:
источник
BotEngine , 6x49 = 294
источник
Backhand , 54 байта
Попробуйте онлайн!
Поскольку указатель Backhand уже перемещается на три ячейки, все, что нам нужно сделать, это уменьшить его до 2, используя
v
источник
сетчатый, неконкурентный, 62 байта
Попробуйте онлайн!
Пояснения по частям:
U
устанавливает указатель направления(2, 0)
, то есть перемещая2
x-единицы и0
y-единицы, поэтому он пропускает все остальные символы, начиная со следующегоU
пропускаемого. Затем записывается каждый другой символ, и это эквивалентно:которая является простой программой вывода.
Другие
Это конкурирует за вознаграждение JavaScript WallyWest:
Я могу доказать, что, хотя числа могут быть построены в соответствии с этим ограничением, строки не могут. Поскольку никакие литералы не могут быть использованы, так как размещение любого символа, создающего литерал, создаст пустую строку:
Тогда можно использовать только некоторый оператор; используются только «парные» операторы:
И ни один из них не может привести числа / другие к строкам. Поэтому никакие строки не могут быть выведены.
источник
Алиса , 74 байта
Попробуйте онлайн!
объяснение
Первый улов заключается в том, что нам нужно иметь возможность вводить строку, поэтому мы хотим пропустить только первое
"
. Мы делаем это, перепрыгивая на первую,"
потому что тогда IP переместится на одну ячейку, прежде чем снова смотреть на текущую ячейку, так что это вторая,"
которая входит в строковый режим. Но чтобы иметь возможность прыгать туда, нам нужно10, 0
на вершине стека, в таком порядке (второй, верхний). Это сделано сaa00tt,,
:Эта функция вращения выдает аргумент. Если этот аргумент отрицателен, он сдвигает значение на вершину стека на столько позиций. Если аргумент положительный, он ищет элемент, который находится на много позиций ниже вершины, и тянет его вверх. Обратите внимание, что в случае
Rotate(10)
, если в стеке недостаточно элементов, но в конце есть неявное бесконечное количество нулей, поэтому ноль заканчивается сверху.Теперь мы можем
J
перейти к первому,"
используя эти два аргумента. Второй"
вводит строковый режим и записывает все этоDDoo nnoott...
. Когда он попадает в/
, IP-адрес перенаправляется на юго-восток, и мы входим в обычный режим. На данный момент IP-адрес прыгает вверх и вниз по трем строкам (две из которых пусты), поэтому сначала записывает еще три пробела в строках две и три, а затем мы покидаем строковый режим, когда он попадает в"
. Поскольку в настоящее время мы находимся в обычном режиме, все записанные символы помещаются в стек как одна строка (даже если мы записали большинство из них в режиме кардинала), поэтому мы получаем эту строку (обратите внимание на конечные пробелы) :Теперь IP продолжает подпрыгивать вверх и вниз, что означает, что он выполняет одну команду из каждой другой пары, то есть
Y
иt
. Затем IP достигнет конца сетки во второй строке и начнет прыгать назад через сетку. Это также переключает, в какой паре символов IP попадает в первую строку, поэтому при возврате он теперь выполняется;
,o
и@
. Таким образом, игнорируя все пробелы и неявные перенаправления IP, исполняемый код находитсяYt;o@
в обычном режиме.Это
Y
команда «unzip», которая разделяет строку на символы в чередующихся позициях. Поскольку каждый символ повторяется, это действительно дает нам две копии строки, к которой мы стремимся, хотя первая копия имеет два конечных пробела, а вторая - один конечный пробел.t
отделяет этот завершающий пробел и;
отбрасывает его. Наконец,o
печатает строку и@
завершает программу.источник
05AB1E ,
1005852 байта-6 байт благодаря Кевину Круйссену
Попробуйте онлайн!
Правила идемпотентности.
источник
á
он не векторизуется на внутренних строках, в противном случае его можно использовать после))
... Удаление всехá
и использованиеεεáá}}
после))
работ в качестве альтернативы, но, к сожалению, он не сохраняет никаких байтов (но, может быть, вы можете найти вдохновение из этого? ) .. И„„!!
вместо……!!
работы, а так как!
встроенный оставляет строки одинаковыми, по-видимому. Ах, хорошо, я пытался. xD##θθáá
некоторое время, и по какой-то причине я неεε}}
подумал ... Я пытался€€
, но это не совсем работает ... Теперь это самый короткий ответ, спасибо!Stax , 70 байт
Запустите и отладьте его на staxlang.xyz!
Стакс, к счастью, имеет встроенный
::
для каждого. Все, что мне нужно, это нажать на удвоенную строку, нажать 2 и бежать::
. Легко, правда?Неправильно.
Нажав на эту строку сложно. Первая кавычка может быть удвоена
..""
, что является литералом длины 2, за."
которым следует значащая кавычка. Проблема в том, что я не вижу способа завершить строку (что необходимо, иначе дублированная версия будет напечатана) без запуска новой.Конец программы завершает строковые литералы. Если я смогу поместить этот удвоенный литерал туда, возможно, будет хороший обходной путь. Однако, чтобы перейти куда-нибудь с конца программы, требуется
G}
, поэтому, как минимум, я смотрю на это:Это не делает ... ничего.
G
не начинается блок, поэтому ни один не перейдет ко второму}
. Опять же , мне нужно игнорировать один символ:..}}
. Выполнение переходит от первогоG
ко второму}
, продолжается до конца, переходит обратно ко второмуG
и оттуда ко второму}
, и продолжается еще раз до конца, прежде чем возобновится в начале[deduplicate]
раздела с удвоенной строкой поверх стека.Дедупликация проста.
11hh
нажал одиннадцать и делил его пополам вдвое, округляя оба раза и получая два, и::
затем получал бы нам результат, который нам нужен.Ой-ой. Это ничего не печатает. Здесь есть две проблемы: во-первых, это
..}
означает, что строка.}
будет на вершине стека в конце программы, а во-вторых, обычный неявный вывод Stax теперь отключен!Худшая проблема - выход. Когда программа Stax корректно завершает работу, ничего не печатая, верхняя часть стека будет неявно печататься. Но мы ничего не напечатали ...? Ах, но у нас есть. Неопределенные строковые литералы печатаются, а не выдвигаются, и даже этих двух пустых строк (из несопоставленных
"
в конце), несмотря на то, что они пустые, достаточно, чтобы отключить эту проверку. Любая печать должна быть сделана вручную.Нам понадобится либо
pp
илиPP
, и, в этом случае, игнорирование первого прохода..pp
недопустимо, так как будет напечатана строка.p
. Это означает, что нам нужен желаемый вывод либо один в стеке, либо в верхних двух вместе с пустой строкой. Последнее достигается нажатием двух пустых строк (zz
) и вращением трех верхних элементов дважды (aa
) перед печатью.Как только это будет сделано, у нас будет стек в четыре строки. Пятый,
.}
затем толкается, прежде чем программа завершается изящно; в этот момент отсутствие неявного вывода становится как благословением, так и проклятием, так как ничего лишнего теперь не будет напечатано!источник