Ваше задание - написать программу четной длины , которая печатает квадрат ASCII-искусства (описанный ниже), который увеличивает длину своей стороны на 1 единицу каждый раз, когда исходный исходный код вставляется в середину текущего кода.
Мне очень трудно определить эту задачу очень хорошо, поэтому я приведу вам пример:
Допустим, ваш исходный код был
CODE
и что он напечатан:0
Затем вставьте
CODE
посередине: ваш код становитсяCOCODEDE
и он должен напечатать:00 00
Вставьте
CODE
посередине: ваш код становитсяCOCOCODEDEDE
и должен напечатать:000 000 000
И так далее. Ваш ответ теоретически должен работать после любого количества итераций, но я понимаю, что из-за ограничений производительности языка он не может работать разумно выше определенного порога.
Некоторые правила:
Вы можете использовать любой печатный ASCII (32-127) в качестве символа для вашего квадрата. Ваш выбор должен быть постоянным (вы должны использовать один и тот же символ для каждой итерации).
Квадрат начального вывода должен иметь длину стороны 1 .
Квадрат ascii-art определяется как строка с N строками (разделенными N-1 переводами строк / символами новой строки), и каждая строка содержит N копий выбранного символа.
Ваш вывод не может содержать никаких посторонних пробелов, кроме завершающей строки.
Вы можете использовать значения по умолчанию для ввода и вывода (программы или функции разрешены, но фрагменты не разрешены).
Середина вашего кода определяется как точка , где исходный код может быть разделен на две части таким образом, что они равны.
Ваши ответы будут оцениваться по длине вашей исходной программы в байтах. Побеждает самое низкое число байтов. В случае ничьей ответ, представленный ранее, выигрывает.
Вы можете использовать эту программу, чтобы применить вставки без необходимости делать это вручную.
Ответы:
Pyth , 2 байта
Попробуйте онлайн! Также попробуйте это в два раза , в три раза !
Как это работает?
\n
это команда, которая печатает свой аргумент с завершающей строкой, возвращая его одновременно. Таким образом, каждый раз, когда вы делаете вставку, вы превращаете целочисленный литерал 5 в число, содержащее N копий из 5 сцепленных строк, и ведущие символы новой строки в основном удостоверяются, что он печатается соответствующее количество раз, сохраняя его квадратным.источник
JavaScript (ES6),
423230 байтВторая итерация:
Это работает, присоединяя
0
кs
каждый раз , когда первая половина кода выполняется, и печатьs
себе каждый раз , когда вторая половина запускается. Использует четыре особенности JavaScript:this
. Это позволяет нам делатьthis.s
вместоs
.undefined
.[1,2,3] + 4 === "1,2,34"
undefined
преобразуется в пустую строку, что означает это[undefined] + 0 === "0"
.В совокупности это означает, что мы можем выразить первую половину (генерируя строку нулей) всего за 13 байтов. Если использование
alert
вместоconsole.log
разрешено, мы можем сохранить еще 4 байта, сократив вторую половину.источник
05AB1E , 2 байта
Попробуйте онлайн!
Порт моего Pyth ответа .
источник
Python 2 ,
423828 байтПопробуйте онлайн! , Вы также можете попробовать 2-ю и 3-ю итерации
источник
Python 2 , 22 байта
Попробуйте онлайн!
Вдвое:
Обратите внимание, что вторая половина начинается с символа новой строки.
источник
C (gcc) ,
17016896807270 байтГораздо короче версия. Все еще хотелось бы найти решение без препроцессора.
Попробуйте онлайн!
Старая 168-байтовая версия:
Попробуйте онлайн!
источник
Python 2 , 30 байт
Попробуйте онлайн! , Вторая и третья итерация
Это использует тот факт, что bools в Python в основном являются целочисленными значениями и именами
False
иTrue
были переназначены в Python 2.Python 1 , 32 байта
Попробуйте онлайн! , Вторая и третья итерация
В Python 1 строки встроенных
exit
иquit
существует , чтобы информировать пользователя о интерактивной оболочки , как выйти из нее. Значением по умолчанию является"Use Ctrl-D (i.e. EOF) to exit."
.источник
n=False+=1;print'*'*n;
, но я продолжаю забывать, что это не особенность Python ...Древесный уголь , 6 байт
Попробуйте онлайн! Объяснение:
υ
заканчивается длиной количества повторений.источник
Haskell , 68 байт
Попробуйте онлайн один , два или три раза .
Из-за лени Хаскелла выражение, подобное приведенному выше, считается функцией, которая не принимает аргументов, согласно этому мета-вопросу .
источник
брейкфук ,
4434 байтавычеркнуто 44 все еще регулярно 44; (
Попробуйте онлайн!
Попробуйте это в два раза , в три раза . Смотри, не набивай!
Печать квадратов
U
. Он распадается прямо на середину 10+
с.источник
Рубин, 18 байт
Попробуйте онлайн! Вдвое! Утроилось!
источник
Brain-Flak , 74 байта
Попробуйте онлайн!
Попробуйте это вдвое и втрое .
объяснение
Точка останова находится в середине
<>
секции «push 10». Разбив это, мы оставим 5 в третьем стеке, пока мы не достигнем соответствующей второй половины, после чего нажатие 10 возобновится прямо с того места, где оно остановилось.Несмотря на то, что можно выдвинуть печатное значение ASCII (пробел) в 22 байта, это приведет к выполнению центрального
<>
после нажатия5
. Добавив еще два байта, я смог переместить<>
так, чтобы весь прогресс в направлении нажатия10
был на третьем стеке. В качестве бонуса это также сделало получившийся квадрат более эстетичным.источник
тинилисп , 112 байт
Попробуйте онлайн! Также вдвое и в пять раз .
Подход «построить строку в первой половине, напечатать ее во второй половине», который используется многими языками, не будет работать в tinylisp, поскольку нет изменяемых переменных. Вместо этого мы делаем серьезное вложение кода.
Когда вторая копия кода вставлена, она помещается внутрь
(q())
, что оборачивает ее в список. Затем(h(t(t(h(t(...))))))
сверлит в этот список до части после(d N
.(v(...))
оценивает это; затем мы передаем его в безымянную функцию(q((x)(i x(inc x)1)))
, которая увеличивает результирующее значение, если это число, и возвращает 1, если это пустой список. Окончательный результат во внешней вложенной версии кода присваиваетсяN
. По сути, мы создали странную разновидность рекурсии, которая подсчитывает количество уровней вложенности.Затем вторая половина кода создает строку
N
звездочек, затем списокN
таких строк, а затем присоединяется к списку в новых строках. Результат отображается с завершающей новой строкой.источник
R , 44 байта
Попробуйте онлайн!
Печать с завершающим переводом строки. Это
T=TRUE*TRUE+12
просто, чтобы дополнить длину.Попробуй вдвое и Попробуй втрое .
источник
F=F+1;T=TRUE*TRUE+12#
<newline>write(strrep(1,F),"")
Юлия 0,6 , 29 байт
Все мои идеи были дольше, чем адаптация умного решения Python от xnor.
становится
Попробуйте онлайн!
источник
СНОБОЛ4 (CSNOBOL4) ,
13068 байтТеперь без комментариев! Смотрите историю редактирования для объяснения старого алгоритма.
Попробуйте онлайн!
Попробуйте вдвое и втрое
Объяснение:
Поскольку
END
метка обязательна, а что-либо после первойEND
метки игнорируется, мы получаем два преимущества для этой задачи:X
дляX
повторенийЭто говорит о том, что мы используем повторение для первой половины, а затем мы можем использовать более «традиционный» подход маркировки, чтобы повторить время вывода
X
.Первая половина
который, при повторении, увеличивает
X
соответствующее число раз и создаетARRAY
A
индексы со значениями1
доX
и где каждый элементA
строки1
повторяетсяX
.Тогда независимо от того, сколько раз программа повторяется, переводчик видит только:
это типичная программа SNOBOL, которая выводит элементы по
A
одному за раз, пока индекс не выходит за пределы, а затем завершает программу.;
является необязательным ограничителем строки, обычно зарезервированным для однострочныхEVAL
илиCODE
операторов, который довольно аккуратно доводит счетчик байтов до 68 и отмечает половину точки, позволяя добавлять туда код.источник
shortC ,
5644 байта-12 байт: подожди, я использую shortC, почему бы не использовать сокращенный материал C
Я бы использовал стандартный C, но для этого требуется
}
конец, который портит репликацию. shortC вставляет его в EOF неявно.источник
Perl 5 , 25 байт
24-байтовый код + 1 для
-p
.Примите во внимание, что вы, возможно, не хотите разрешать флаги командной строки, пожалуйста, дайте мне знать, если это не правильно.
Попробуйте онлайн!
источник
Зш , 10 байт
Попробуйте полный набор тестов онлайн!
... да, это немного лучше. Добавьте к строке N раз, затем напечатайте N раз. Оказывается,
<<<foo<<<foo
работает просто отлично.Zsh , 64 байта
Используемый символ:
(пробел).
Попробуйте полный набор тестов онлайн!
Средняя точка находится между второй
E
и новой строкой, следующей за ней. Heredoc прекратит работу, когдаE
сама строка будет включена, что происходит прямо в середине кода.источник
s+=0;<<<$s