Было несколько проблем, связанных с удвоением исходного кода: здесь и здесь . Задача, стоящая перед нами, немного сложнее, но должна быть выполнима практически на каждом языке.
В этом задании вы получите произвольное положительное целое число. Ваша программа должна вывести это целое число в два раза . Когда ваш исходный код удваивается, он принимает положительное целое число и выводит его в квадрате .
Как ваш исходный код удвоился? Ну, вы можете иметь это по-своему . Другими словами, вы можете разбить свой исходный код на строки байтов или символов (или токенов в токенизированных langs) любой равной длины, которую вы хотите , и повторять каждый фрагмент дважды по очереди.
Для начальной программы ABCDEFGHIJKL
(длина 12) все возможные дублированные программы:
Chunk length | Doubled source code
-------------+-------------------------
1 | AABBCCDDEEFFGGHHIIJJKKLL
2 | ABABCDCDEFEFGHGHIJIJKLKL
3 | ABCABCDEFDEFGHIGHIJKLJKL
4 | ABCDABCDEFGHEFGHIJKLIJKL
6 | ABCDEFABCDEFGHIJKLGHIJKL
12 | ABCDEFGHIJKLABCDEFGHIJKL
Обратите внимание, что это означает, что программы простых длин могут быть удвоены только двумя способами: каждый символ удваивается, или полная программа повторяется дважды.
Правила:
- Код должен быть полной программой или функцией.
- Стандартные лазейки запрещены.
- Стандартные методы ввода / вывода разрешены.
- Все символы / байты, включая пробелы и символы новой строки, учитываются в длине кода и вносят вклад в куски.
- Вы можете предположить, что входные данные и их квадрат могут быть представлены типом int / integer вашего языка.
- Вы не можете использовать завершающий символ новой строки или другой символ.
- Укажите свой размер куска в заголовке после подсчета байтов.
- Это код-гольф , поэтому короткие программы лучше! Если две программы имеют одинаковую длину, побеждает та, которая использует меньшую длину фрагмента. (Если у вас более длинная программа, которая использует меньшую длину чанка, то это тоже стоит опубликовать!)
- Если вашей программе требуется второй ввод / строка, вы можете не делать никаких предположений относительно ее значения. В частности, ваша программа должна работать, если второй вход пустой, такой же, как первый, или другое целое число. Если вашей программе не требуется второй ввод / строка, вы можете игнорировать это ограничение.
источник
.0
в конце)?5 -> 10
:; двойной код:5 -> 25 25
.Ответы:
Perl 5 , 8 байтов (размер блока 4)
Попробуйте онлайн или попробуйте двойную версию .
Унарный
~
является побитовым отрицанием, поэтому двойное его применение - пустяк. Таким образом, базовая программа просто умножает$_
(неявная переменная ввода-вывода) на 2.Binary
~~
- это smartmatch, который возвращает логическое значение.~~+2~~+2
разбирает как(~~+2) ~~ (+2)
. Поскольку 2 равно 2, это дает истину (1). Таким образом, удвоенная программа сначала умножается$_
на 1, а затем умножается$_
сама.источник
05AB1E , 4 байта (размер блока 2 или 4)
Попробуйте онлайн или удвоите как один 4-байтовый блок или удвойте как два 2-байтовых блока .
источник
Python 3 , 26 байт (размер блока 13)
Попробуйте онлайн!
Вдвое:
Это решение предоставлено @Grimy.
Python 3 ,
323028 байтов (размер фрагмента161514)Попробуйте онлайн!
-4 байта благодаря @negativeSeven
Вдвое:
Попробуйте онлайн!
Функция использует уникальное правило чанка этого вызова.
источник
Befunge-98 (FBBI) , 8 байт (длина фрагмента 2)
Попробуйте онлайн!
Попробуйте онлайн! (Два раза)
Исключая поток управления, первая программа выполняется
&:+q
(ввод, дублирование вершины стека, сложение, выход с кодом возврата), а вторая выполняется&:*+q
(ввод, дублирование вершины стека, умножение, сложение (суммы с неявным 0), выход с возвратом код)источник
Гексагония , 14 байтов (размер куска 14)
Expanded:
Попробуйте онлайн!
двойной
Expanded:
Попробуйте это в два раза онлайн!
В этой задаче Hexagony находится в несколько странном положении, поскольку в действительности выполнить задачу не намного сложнее, чем просто написать две отдельные программы. Однако решение этой проблемы оказалось довольно сложным.
Это решение - тривиальная идея в самой короткой форме, которую я мог бы уместить, но я подозреваю, что есть более короткие и умные ответы. Эта версия очень наивно устанавливает два значения для ввода и суммирует их или умножает их, в зависимости от того, удвоен ли источник. Единственное повторное использование кода - это то,
"+
что делает код копирования для удвоенной программы достаточно коротким, чтобы помещаться в неиспользуемое пространство исходной программы.Я подозреваю, что использование инструкций по изменению IP
[]
сделает изоляцию частей более легкой, но действительно идеальное решение будет использовать много кода между ними. Я сделал вспомогательную программу для удвоения исходного кода шестиугольника. Обратите внимание, что он удаляет завершающие no-ops, так что если вы хотите, чтобы в конце не использовались no-ops-заполнители, просто заполните какой-нибудь другой символ и измените его после. Он может обрабатывать блоки разных размеров, хотя я еще не писал код для вывода каждой возможной программы (похоже, что Hexagony может использовать полный размер блока).источник
Гексагония , 12 байт (размер блока 4)
Попробуйте онлайн!
отформатирован:
И дублируется , затем форматируется:
По сути, это устанавливает первое ребро на вход, затем второе ребро на любую
2
или копию ввода, затем умножает эти два ребра на третье ребро, печатает это и завершает. Список выполненных инструкций простоа также
Единственная разница заключается в
+
переопределении2
второй программы.источник
JavaScript (ES6),
2422 байтаНесмотря на необычный формат, это определение анонимной функции, которую можно вызывать напрямую или назначать переменной.
Попробуйте онлайн!
Попробуйте онлайн в два раза!
Как?
Применение унарного
+
к функции интерпретируется как попытка привести ее к числу и приводит к NaN . Таким образом, ведущий+(g=x=>x*x)
является ложным в обеих версиях.С другой стороны, применение двоичного кода
+
между двумя функциями приводит к строке. Поэтому(x=>x*2)+(g=x=>x*x)
правдив в дублированном варианте.источник
Perl 6 , 8 байтов (размер блока 1)
Попробуйте онлайн! Попробуй вдвое!
Какая бы ни была / HyperWh независимо от лямбды, которая принимает число и возвращает число для первой программы и одноэлементный список для второй программы. В основном это сохраняет ту же логику, за исключением того, что оператор умножения (
*
) заменяется экспоненциальным (**
).Независимо от того, что литерал (который также вводит в заблуждение
*
), удваивается до HyperWhwhat (**
), который в основном одинаков, за исключением того, что он отображает списки. Пространство необходимо для отделения литерала Wh независимо от умножения и игнорируется при удвоении. Вместо простого2
(который удваивается22
) мы используем список, содержащий два элемента, который оценивается как 2 в числовом контексте).<>
Может быть удвоены к списку с интерполяцией, а также два элемента внутри удваивается, но ни один из этих изменений длины списка.источник
Рунические чары , 9 байт (размер чанка 3)
Попробуйте онлайн!
Попробуй вдвое!
3?
Пропускает следующие 3 инструкции, в результате чего (выполняется)i3?...:+@
. Когда удвоено, это приводит к выполнению,i3?...:*@
где.
представляет 3 NOP'd инструкции.@
это «печатать весь стек и завершить».источник
C # (интерактивный компилятор Visual C #) / Javascript, 22 байта, размер фрагмента 11
Попробуйте онлайн!
источник
=
To-
. Хороший ответ!Brain-Flak ,
4830 байт (размер куска 10)Попробуйте онлайн! Попробуй вдвое!
Это в основном занимает три шага, затем, когда doubled выполняет эти шаги дважды каждый. Начальная программа:
Для ввода
n
в недвоенную программу это приводит к:Для удвоенной программы:
источник
Brain-Flak , 76 байтов, 76 байтов
Попробуйте онлайн!
Удвоенный (с новой строкой для ясности)
Попробуйте онлайн!
Вот версия, которая использует более сложную процедуру удвоения. Он выполняет 5 блоков размером 15. Код здесь составляет 46 байтов, однако из-за требуемого заполнения он значительно длиннее.
10590 байт, 15 байтПопробуйте онлайн!
Вдвое (с символами новой строки для ясности)
Попробуйте онлайн!
источник
Cubix ,
1814 байтов (длина фрагмента97)Обратите внимание на завершающий пробел. Попробуйте онлайн!
Вдвое:
Опять же, есть один пробел. Попробуйте онлайн!
объяснение
Основная идея заключается в том, что удвоение кода приводит к увеличению размера куба, поэтому указатель инструкции начинается с другого символа. Поскольку программа сложения не может быть помещена в куб с длиной стороны 1, длина стороны будет равна 2. Кроме того, удвоенный код должен быть на кубе с длиной стороны 3, поэтому удвоенный код должен быть не менее 25 байтов , Это означает, что код должен быть длиной не менее 13 байтов. Таким образом, можно сохранить не более 1 байта.
Теперь к актуальному коду. Первое наблюдение заключается в том, что верхняя грань (то есть первые 4 символа) не используются программой сложения. Кроме того, если мы сделаем, чтобы 5-й символ отражал IP вокруг куба, мы можем освободить еще 2 символа. Мы будем использовать эти символы, чтобы поставить программу возведения в квадрат.
источник
Морнингтон Полумесяц , 656 байт (размер куска 328)
Просто чтобы добавить вес к теории, что это может быть решено практически на любом языке ...
(Конечный перевод строки важен)
Попробуйте единственную версию! ... или ... Попробуйте удвоенную версию!
Это было особенно сложной задачей в Mornington Crescent, потому что программа должна иметь такую жесткую структуру. Также важно следить за тем, где будет происходить удвоение, потому что телепортация между станциями в Лондоне запрещена.
Теория здесь проста: в единственной версии «Bounds Green» заполняется случайной строкой, но в удвоенной версии она заполняется квадратом ввода. После окончания фрагмента обе версии удваивают «ввод», но в дублированной версии кода ввод заменяется на 0.
Этот результат возвращается обратно в Bounds Green, который дважды выполняет операцию max (), прежде чем передать результат на выход. В единственной версии это оставляет удвоение неизменным (int и string просто переключаются назад и вперед), но в удвоенной версии это заменяет 0 результатом квадрата, уже сохраненным в Bounds Green.
Если мои объяснения были недостаточно хороши, я предлагаю вам посетить Лондон и попробовать оба пути самостоятельно.
источник
JavaScript (Node.js) ,
1512 байт (размер фрагмента: 6)Попробуйте онлайн!
Единичный случай:
Двойной корпус:
Кажется, также работает в C # и Java, если изменить
=>
на->
?источник
R ,
423528 байтов (размер блока 4)Теперь с меньшим куском и без ошибок. У меня также есть более длинное решение с размером чанка 3; увидеть ниже.
Я не думаю, что возможно написать ответ R с размером чанка 1 или 2; Я с радостью дам щедрость любому, кто докажет, что я неправ.
Попробуйте онлайн!
Для
#
комментариев в R. 3-я строка содержит только пробелы, образуя кусок новой строки + 2 пробела + новую строку, так что предыдущий и следующий фрагменты не могут иметь новой строки.Вдвое становится:
Попробуйте онлайн!
Единственная версия вычисляетN2× 4 = 2 н ; двойная версия вычисляетN2× n2× 4 = n2 ,
Вот немного более длинное решение, но с размером блока 3:
R , 39 байт (размер куска 3)
Попробуйте онлайн!
Вдвое:
Попробуйте онлайн!
Обратите внимание, что у Джузеппе есть другой ответ R, с одним фрагментом из 30 байтов.
источник
R ,
5930 байт (размер куска5930)Попробуйте онлайн!
Благодарим Робина Райдера за то, что он вдохновил меня; увеличивается
F
каждый раз, и функцияf
выбирает соответствующий выход.Это не особенно интересно, но, несомненно, будет придумано что-нибудь умное, манипулирующее размером с чанкКак и ожидалось, Робин Райдер придумал это, которое и короче, и имеет некоторые аккуратные манипуляции с чанками.источник
PowerShell , 22 байта (размер блока 11)
Попробуйте онлайн .
Вдвое:
Это решение основано на @ ShieruAsakoto's растворе .
Решение @Grimy , преобразованное в PowerShell, 26 байтов (размер блока 13)
Попробуйте онлайн .
Вдвое:
источник
Perl 5 (
-p
),2215 байт-7 байт благодаря Грими
TIO
источник
$_*=/@F/?2:$_/4;
Древесный уголь , 13 байт
Попробуйте онлайн! Объяснение: Предопределенный пустой список равен Falsey, поэтому вход умножается на 2. При удвоении второго прохода видно, что пустая строка добавлена в список, поэтому вместо этого он сам умножает ввод. Попробуйте онлайн! В подробном синтаксисе это соответствует
Multiprint(Cast(Times(Cast(q), Ternary(u, Cast(q), 2)))); Push(u, w);
.источник
Python 3,
5653 байтаМой питон навыки своего рода сосать, так что, безусловно , может быть golfed .. На основании ответа Python в « Я удвоении источника, вы удвоить выход! » Вызов .
Длина куска 53.
Попробуйте онлайн или попробуйте онлайн в два раза .
источник
Java 8, 62 байта
Длина куска 62.
Попробуйте онлайн или попробуйте онлайн в два раза .
Объяснение:
В Java доступны комментарии
// comment
и/* comment */
. Которые объединены здесь, чтобы перезаписать определенные части. Посмотрите, как эти комментарии работают благодаря выделению Java:Удвоенная программа создала пользовательский
Byte
класс и его значениеSIZE=9
, которое перезаписываетjava.lang.Byte
класс по умолчанию и его значениеSIZE=8
.источник
Japt ,
75 байтПопробуй это | двойной
²
помещает 2 в массив входов,N
затемj
удаляет и возвращает элемент по индексуJ=-1
(т. е. вновь вставленный2
) и умножает ввод на это.При удвоении это приводит
J
к умножению на2
, поэтому элемент с индексом-2
(т. Е. Вход) возвращаетсяj
и используется как множитель.источник
Желе ,
86 байтов (длина куска 3)Попробуйте онлайн!
двойной
источник
Хорошее решение: Lua , 66 байт (размер блока 66 байт)
Попробуйте онлайн! (Удвойте это сами, это не так сложно)
О, да, я уверен, что есть более короткое решение, но это лучшее, что я смог придумать. Возьмите ввод в качестве первого аргумента.
Краткое объяснение: весь бизнес с
a
очевидным для всех, в то время как вторая часть сx
более интересной. По сути, я создаю таблицу (или обновляю существующую на втором проходе) с помощью финализатора (__gc
метаметода), который вызывается при выходе из программы.Хромое решение: Lua , 60 байт (размер фрагмента 30 байт)
Попробуйте онлайн! или попробуйте вдвое!
Меньший и с лучшими кусками, но в конечном итоге скучный и хромой без хитрых уловок. Я уверен, что никаких комментариев не требуется к этому.
источник
J ,
15109 байтПопробуйте онлайн!
Удвоенная версия: попробуйте онлайн!
f : g
создает глагол, который выполняетсяf
при вызове с одним аргументом иg
при вызове с 2 аргументами. Таким образом, наш выполняется дважды+:
с исходным источником, а*-:
когда источник удваивается.Это работает, потому что последовательность из двух глаголов в J становится хуком, и, таким образом
f f
, выполняетсяy f (f y)
там, где у - исходный ввод. Кроме того,*-:
сам по себе является «диадическим крючком», который работает путем умножения*
левого аргумента на половину-:
правого аргумента. Левый аргумент будет исходным входом, а правый аргумент будет удвоенным, поэтому будет получен квадрат исходного ввода.оригинальный ответ
J 15 байт
Попробуйте онлайн!
Удвоенная версия: попробуйте онлайн!
В единственной версии у нас есть один глагол, который использует Agenda
@.
для выполнения логики if ... then: если аргумент равен самому себе=~
, то взять аргумент и удвоить его(+:@[)
.Однако, когда мы удваиваем код, мы получаем J-хук. Назовите глагол
f
и введитеy
. Затем хукf f
выполняется так:Это означает, что теперь исходный ввод - это левый аргумент, а правый - дублированный. Так как они не будут равны, на
=~
этот раз вернут false, и теперь мы выполним другой форк Повестки дня, т. Е., Что*:@]
означает «квадрат правого аргумента». И так как~
инвертирует входные данные двоичного глагола, правый аргумент будет исходным.источник
Python 3 , 60 байт
Размер куска 6.
Не очень хорошее решение, но оно работает. Это такой уникальный вызов, он действительно заставляет вас думать с другой точки зрения.
Попробуйте онлайн!
Вдвое:
Попробуйте онлайн!
источник
Каскад , 13 байт (размер блока 13)
Попробуйте онлайн!
Попробуй вдвое!
Это было довольно сложно. Основная суть этого состоит в том, чтобы напечатать ввод, умноженный на
2
для первой программы, и заменить2
его копией ввода для второй.Объяснение:
Выполненная часть первой программы выглядит так
Программа удвоения в основном добавляет первое
]
к концу последней строки, поэтому программа оборачивается этим вместо&
. Это превращает это висточник
Zsh , 30 байтов (размер блока 10)
Попробуйте онлайн! Попробуй вдвое!
Злоупотребления тот факт , что
$var
в$[$var]
получает расширена, а затем оценивается в арифметическом контексте.Если кому-то нужна трещина в снижении этого значения, вот наиболее близкое к
24/8
решению, которое я получил (выводитсяx^2+2
при удвоении)источник