Ваша задача состоит в том, чтобы написать N фрагменты кода таким образом, что, когда вы сцепить первый K ≥ 1 вместе, они производят число K . Чем выше N , тем лучше. В этом и заключается подвох: вы не можете использовать какой-либо символ более одного раза в своих фрагментах.
правила
- Вы можете использовать один и тот же символ несколько раз в одном (и только одном) фрагменте.
- Эти фрагменты должны быть объединены в том порядке, в котором они представлены , без пропуска.
- Вы должны написать как минимум два фрагмента.
- Все фрагменты должны быть на одном языке.
- Помните: фрагменты не должны быть полными программами или функциями, и при этом они не должны функционировать самостоятельно.
-1
допустимый фрагмент в Java, например - Все полученные конкатенации должны выводить соответствующее значение K.
- Победителем становится человек с наибольшим значением N. Tie-breaker - самая короткая общая длина программы в байтах.
пример
Пусть ваши фрагменты были AD
, xc
, 123
, и ;l
. Затем:
AD
должен производить1
ADxc
должен производить2
ADxc123
должен производить3
- и
ADxc123;l
должен производить4
.
Эта программа будет иметь 4 балла .
number
code-challenge
source-layout
Конор О'Брайен
источник
источник
1
и `2`?Ответы:
Python 3 , 1 112 056 фрагментов, 4 383 854 байта
Это очень похоже на ответ @ WheatWizard на Python 2 . Я начал работать над этим незадолго до того, как он был опубликован, но для выяснения причуд Python относительно символов, отличных от ASCII, и длинных строк потребовалось некоторое время. Я обнаружил, что Python читает строки по 8191 байт за раз, и когда эти 8191 байт содержат только часть многобайтового символа, Python генерирует ошибку SyntaxError .
Первый фрагмент использует кодировку из Наименьших (различных) символов для полноты Тьюринга .
Это чудовище просто строит следующую строку и выполняет ее.
Следующие фрагменты имеют длину всего один символ. Следующие три символа
\n
,\r
и#
. Все остальные символы Unicode (кроме суррогатов) следуют в определенном порядке, поэтому они выровнены по границе 8191 байт.Следующий скрипт генерирует соответствующие программы для ввода k между 1 и 1112056 .
источник
Perl 5,
50,091,151 фрагментПервый фрагмент:
От 2 до 26 фрагментов:B
черезZ
Фрагменты от 27 до 46:
a
сквозныеz
, исключая символы длиныОт 47 до 56 фрагментов:
0
через9
57-й фрагмент:_
Остальные фрагменты представляют собой 50,105 отдельных символов Юникода, которые Perl считает символами «слова», исключая 14 различных символов слова в исходном фрагменте в любом порядке.Что ж, это была хорошая мысль, но оказалось, что после определенной длины Perl выдает ошибку «слишком длинный идентификатор». Это самая длинная комбинированная программа, которую я смог заставить Perl переварить:
Страница руководства perldiag гласит: «Будущие версии Perl, вероятно, устранят эти произвольные ограничения», но мой Perl 5.18 этого не сделал.
Объяснение:
В нестрогом режиме Perl 5 интерпретирует строки в кавычках без кавычек как «голые слова», по сути, автоматически цитируя их для вас. Их обычно лучше избегать, но они обязательно помогут здесь!
источник
a-z
фрагменты, скорее всего, будут использовать символы из вашего первого фрагмента.length("length(
.Python 2 , оценка 32
При последующих фрагментах
B
,C
,D
, ...Y
,Z
,u
,v
,w
,x
,y
,z
.По иронии судьбы Python 3 поддерживает идентификаторы Unicode, что позволило бы нам очень глупо использовать этот трюк, но
print
без скобок это невозможно . Я мог бы втиснуть цифры и в идентификатор, но я не думаю, что такой подход очень интересен, чтобы выжать из него больше.Попробуйте онлайн!
Python 2 , оценка 18, меньше чит-у
Попробуйте онлайн!
источник
JavaScript (ES6, V8 6.x),
5250298119526119638119683128781 фрагмент,88149147575179575631576121612789 байтНиже приведен фрагмент стека, который генерирует полную программу, оценивает ее и создает ссылку для загрузки файла. Этот фрагмент будет продолжать генерировать лучшие ответы, так как более поздние версии Unicode поддерживаются более новыми версиями JavaScript, которые добавляют новые допустимые идентификаторы к языку.
Использование только ASCII
объяснение
При этом используется метод метапрограммирования,
Proxy
позволяющий включить обработчик get для объекта и получить доступ к имени свойства в виде строки, возвращая идентификатор вlength / 2
качестве значения.С первым фрагментом, начинающимся как
new Proxy({},{get:(n,{length:e})=>e>>(e/e)}).nn
, каждый добавленный дополнительный фрагмент увеличивает строкуlength
идентификатора,2
проверяя его до.repeat()
соответствующей кодовой точки дважды для 2-байтовых символов utf-16 и один раз для 4-байтовых символов utf-16.Идентификаторы в JavaScript
В спецификации ECMAScript an
IdentifierName
определяется следующей грамматикой:Генерация ответа
Изначально используя свойство Unicode "ID_Continue", я написал скрипт Node.js, который генерирует полный ответ. Теперь это всего лишь сценарий на стороне клиента, который использует наивный
eval()
для проверки допустимых символов, вместо этого перебирая все кодовые точки Юникода:Выполнение
stat -f%z answer.js
дает число байтов 612802, но мы вычитаем 13 байтов для фактического представленияconsole.log(
и)
переноса.кодирование
Источник хранится в формате utf-8, что отражается в огромном количестве байтов ответа. Это сделано потому, что Node.js может запускать только исходные файлы, закодированные в utf-8.
JavaScript внутренне хранит строки с кодировкой utf-16, поэтому строка «длина символа», возвращаемая в JavaScript, на самом деле составляет лишь половину количества байтов строки, закодированной в utf-16.
источник
x
вместо$
освобождения его в качестве дополнительного идентификатора?Python 2 , оценка
610+3 благодаря pizzapants184
+1 благодаря WheatWizard
Попробуйте онлайн!
источник
print int(True)
на «просто»4/4
, вы можете добавить «and 7
7», учитывая, что вам не нужно печатать число, просто «произведите» его&2
увеличит ваш счет на единицу, потому что&
имеет более высокий приоритет, чем^
, но вам нужно каким-то образом сделать число 2. (Можно использовать[[]==[]][[]<[]]<<[[]==[]][[]<[]]
)ord
конфликтовал сand
, но я исправил этоTI-Basic (серия 83, версия ОС 1.15 или выше), оценка:
17181924(Tiebreaker: 53 байта.)
Вы можете получить очень большую оценку, используя обычную длину строки: начните с (как указывает @Scrooble) и продолжайте добавлять фрагменты с одним токеном до конца. TI-Basic имеет более 700 из них, так что на самом деле работает довольно хорошо. Но вот другой подход:
length("A
length("length(
Обратите внимание , что TI-Basic является лексемы, так (например)
e^(
команда не использует какой - либо из символовe
,^
,(
.Полагается на недокументированную особенность
sub(
команды: помимо поиска подстрок, ее также можно использовать для деления числа на 100.Это работает , если он работает на свежий калькулятор, который позволяет нам предположить , что
X
,Y
,Z
равны нулю, что оконные переменные устанавливаются в стандартные значения, что калькулятор в радианах режиме, и чтоrand
«s первые три выхода составит около0.943
,0.908
,0.146
.источник
PowerShell , 25 байт, оценка 5
Фрагмент 1:
' '.count
выводы1
. Это делается путем взятия.count
строки, которая равна единице, потому что есть только одна строка. Попробуйте онлайн!Фрагмент 2:
*2
выходные данные,2
потому что мы берем1
предыдущий фрагмент и умножаем его на два. Попробуйте онлайн!Фрагмент 3:
+!""
вывод3
, добавив логическое значение not пустой строки. Это неявно приводит к пустой строке$true
, которая снова неявно приводится к1
, поэтому мы добавляем одну Попробовать онлайн!Фрагмент 4:
-(-1)
результаты4
путем простого вычитания отрицательного значения Попробуйте онлайн!Фрагмент 5:
|%{5}
вывод5
, перенося предыдущий номер в цикл, и каждая итерация этого цикла (только один, потому что есть только один входной номер) выводит5
Попробуйте онлайн!Спасибо Яну за альтернативный способ придумать
4
и хитроумный способ придумать5
.источник
' '.count*2+!""-(-1)|%{5}
5 баллов?$_
внутри|%{ }
. Благодарность!C, 10 фрагментов, 45 байтов
Попробуйте онлайн!
источник
MATL , оценка
815,64123 байта11,23ZP
было его идеей, наряду с изменением3
сI
для сниппета 7.OO...N&
была его идея.Еще не все.Я не знаю функции MATL наизусть, поэтому мне приходилось переходить туда-сюда в документации ... :)Попробуйте онлайн!
источник
5Yy
это хорошо! Я уже используюY
в 3, чтобы получить второе простое число :(OOOOOOON&
. Если вы добавите другие, это, вероятно, должно быть последним, из-за&
yyyyyyyy...
? Я должен был удвоить число, 24,y
чтобы дублировать его 12 раз ...?d
. Я сейчас на мобильном, но попробуюX#
отладить-распечатать стопкуV , оценка 10
Попробуйте онлайн!
источник
Желе , 253 байта, оценка 250
Последующие фрагменты из 1 символа:
Примечание:
¶
также может быть заменено на\n
, это тот же байт в кодовой странице Jelly.После добавления всех этих фрагментов вы можете добавить фрагмент из 2 символов
”‘
.+1 спасибо Деннису .
Попробуйте онлайн!
источник
Lenguage , 1 112 064 фрагментов
П - й фрагмент состоит из 2 -х 3n-1 повторений п - го не-суррогатного характера Unicode, вплоть до и включая 1 112 064 - й и последний не-суррогатной характер текущего стандарта Unicode.
Вывод в унарном виде (с использованием нулевого байта в качестве цифры) для простоты. Десятичная дробь возможна, но это сделает программы еще длиннее. С помощью унарного мы можем протестировать первые программы.
Для n = 1 мы получаем 4 повторения U + 0000 . Это эквивалентно программе brainfuck
.
, которая печатает один нулевой байт.Для n = 2 мы получаем 32 повторения U + 0001 , всего 36 символов. Это эквивалентно программе brainfuck
..
, которая печатает два нулевых байта.Для n = 3 мы получаем 256 повторений U + 0002 , в общей сложности 292 символа. Это эквивалентно программе Brainfuck
...
, которая печатает три нулевых байта.И так далее, до n = 1 112 064 .
источник
'+'*(48 + d) +'.>'
для каждой десятичной цифры n приведет к тому же результату. Это просто намного сложнее описать.Бейсик (ZX Spectrum), оценка 244 (новая оценка 247) [это обман?]
Фрагмент 1:
Фрагмент 2:
:
Фрагмент 3:
REM
Фрагменты кода 4-244: фрагменты из одного символа, в которых используются все символы, не входящие в фрагменты 1, 2 и 3.
объяснение
Символы
На Спектруме
PRINT
стоит один символ (код 245). Сниппета 1 использует 11 различных символов:2
,3
,5
,6
,+
,-
,*
,(
,)
,PRINT
иPEEK
что вы видите , как пробелы являются частью символовPRINT
иPEEK
, таким образом , само пространство не используется. Я решил дать номер строки 2356, потому что это единственные цифры в коде.Символы 13 и 14 не допускаются. Это означает, что для фрагментов 2-244 осталось 243 символа, начиная с кода
:
иREM
избегая кода, который может привести к ошибке или сделать что-то еще.Как это работает
Вот почему я не уверен, что этот ответ от книги.
23635 - это ячейка памяти для 16-битной системной переменной PROG, хранящаяся как LH. (Значение обычно составляет 23755. Но если не считать неправильный результат, если это не так, использование этого числа напрямую, даже если это укорачивает код, обойдется мне в дополнительные цифры.) Значение PROG - это место в памяти где хранится сама программа. Первые два байта - это номер строки, хранящийся как HL, следующие два байта - это длина строки, хранящаяся как LH. Вот как программа ищет длину собственной строки, поэтому необходимо вычесть что-то подходящее
Сохранение персонажей
Учитывая то, как хранятся числа, строка могла бы заканчиваться на -114, чтобы фрагмент 1 выдавал 1. Но я не хотел использовать дополнительные цифры, поэтому вместо этого я убрал два двузначных числа, которые затем пришлось сложить до 122; 56 и 66 сделали хорошо.
Код немного некрасив, со всеми вложенными и вычисленными значениями PROG (
PEEK 23635+256*PEEK 23636
) дважды. Но если я сохраню его, а затем использую сохраненное значение, это будет стоить дополнительных символов / фрагментов - строка может начинаться каккоторый будет использовать 4 дополнительных символов:
LET
,p
,=
и:
.Может быть, я спроектирую это так, чтобы все числа рассчитывались из чисел, которые используют только 1 цифру, и получают 3 фрагмента.
РЕДАКТИРОВАТЬ:
Вот новый фрагмент 1 (именно так длинная отдельная строка отображается на Спектруме в виде переноса, поэтому, если вы захотите проверить код, это поможет вам убедиться, что вы набрали его правильно):
Я мог бы получить другой фрагмент, избегая
+
и просто обойтись-
. Я не собираюсь пробовать это, это было достаточно тяжелым испытанием.источник
Кляйн 011 , 9 фрагментов
Фрагмент 1
Попробуйте онлайн!
Фрагмент 2
Попробуйте онлайн!
Фрагмент 3
Попробуйте онлайн!
Фрагмент 4
Попробуйте онлайн!
Фрагмент 5
Попробуйте онлайн!
Фрагмент 6
Попробуйте онлайн!
Фрагмент 7
Попробуйте онлайн!
Фрагмент 8
Попробуйте онлайн!
Фрагмент 9
Попробуйте онлайн!
объяснение
Это было действительно забавное испытание для Кляйна. Уникальная топология Кляйна позволяет сделать много интересного. Как вы могли заметить, ответы 5-9 - это просто добавление заполнителя (буквы в Klein ничего не делают, поэтому я использовал их в качестве наполнителя) в коде, чтобы растянуть ограничивающую рамку. Это заставляет ip идти другим путем через более ранние части кода из-за уникальной топологии Klein.
Я собираюсь сделать полное объяснение позже, но сейчас здесь более простая для понимания версия программы со всеми буквами, замененными на
.
s.Попробуйте онлайн!
источник
> <> , Счет:
Бесконечность1,112,064-6 = 1,112,058Фрагмент 1 (6 байт)
Этот фрагмент выводит количество символов после; плюс один. Это может быть расширено до
бесконечностибольшого количества фрагментов по одному символу каждый. Быстрый Google говорит мне, что есть 1 112 064 возможных символов Unicode, минус 6 я уже использовал.Попробуйте It Интернет
источник
R , оценка: 79
Благодарю Perl от Sean за вдохновение; это нарушает некоторые особенности интерпретатора R.
Первый фрагмент:
последующие фрагменты - это символы в:
Попробуйте онлайн!
scan
Функция считывает данные из файла ,""
который по умолчаниюstdin()
.Документы для
stdin()
указывают, что:Следовательно, последующие данные становятся файлом. Это может быть тривиально расширено и может работать с несколькими различными кодировками.
источник
Пайк , 256 байт, оценка 254
Обратите внимание, что это шестнадцатеричные коды фактических байтов, разделенных пробелами, поскольку там
\x00
включен нулевой byte ( ).Начальный фрагмент:
Последующие фрагменты из 1 символа:
Попробуй это здесь!
источник
Java 8, 7 фрагментов (19 байт)
Просто для начала продолжим работать над этим.
Попробуй это здесь.
Объяснение:
Приоритет выполнения, возможно, становится понятнее, когда я добавляю круглые скобки:
a*b
: Умножитьa
наb
~a
:-a-1
a>b?x:y
:if(a>b){ x }else{ y }
a|b
: Побитовое ИЛИa
сb
a^b
: Побитовый XORa
сb
a%b
: поa
модулюb
источник
Python 2 , 110 фрагментов
Вот полный фрагмент:
Попробуйте онлайн!
Первый фрагмент
И затем следующие 109 фрагментов являются следующими 109 байтами.
Это довольно "обманчиво", как говорит Линн. Первый фрагмент открывает файл и вычитает 44 из его длины, затем каждый другой фрагмент добавляет 1 к длине файла без изменения логики программы в целом. таким образом увеличивая результат вывода на 1.
источник
dc , оценка 13, 58 байт
Попробуйте онлайн! (Обратите внимание, версия TIO добавляет
f
после каждого фрагмента для печати весь стек, показывая, что каждый фрагмент оставляет только одно значение в стеке; также я забыл начальный пробел в последнем фрагменте, который функционально не имеет значения, когда они разбитый на разрывы строк, но он учитывает использование моего персонажа)Каждая дополнительная конкатенация фрагментов оставляет желаемое значение и только желаемое значение в стеке. После того, как я набрал 12, у меня не хватило способов съесть стек. Я пытался использовать математические операции на ранних этапах, так как они поглощают стек, и по мере того, как мы увеличиваем число, становится сложнее управлять этим способом. Когда все сказано и сделано, у меня остается только цифра 0, с которой можно играть, и очень мало способов выталкивания стеков, поэтому я думаю, что 13 довольно близко к максимальному значению. Я уверен, что есть много схожих (и, вероятно, более коротких) способов сделать это в DC, это только отчасти стало на свои места. Обратите внимание, что Cygwin обрабатывает AF, смешанный с 0-9, в отличие от большинства версий DC,
44C4r/CC 4//
работает для последнего фрагмента в Cygwin.источник
Pyth , 124 фрагмента
Попробуйте онлайн!
Непечатаемые символы, которые экранируются тремя печатными символами (
x..
). Первый фрагмент имеет длину три байта, после чего каждый фрагмент увеличивается в длину на один.источник
Битник , 22 байта, оценка 20
Предполагая, что слово «фрагмент» позволяет поместить значение в стек.
источник
Октава, Оценка 86
С последующим:
Это использует тот факт, что Octave обрабатывает все после имени функции как строковый ввод. Так
nnz n
возвращает количество ненулевых элементов в строке'n'
. Мы добираемся до 86, добавляя другие печатные символы ASCII.',"%#
не работаетисточник
APL (Дьялог) , оценка 12
+1 оценка благодаря @dzaima
Фрагменты с первого по третий:
Тогда каждый из
234567890
.Попробуйте онлайн!
источник
Юлия 0,6, 111217
Следующий скрипт создает полную программу:
объяснение
Макрос
за которыми следуют все различные символы Юникода, разрешенные в идентификаторах, вычисленные с помощью
isidentifier
. Некоторые диакритические знаки запутались, поэтому я их убрал.источник
TeX, оценка 61 (возможно 190)
Первый фрагмент:
Другие 60 фрагментов: в любом порядке, каждый из которых содержит один символ из
Объяснение:
\len
которое вызывается в конце, преобразует управляющую последовательность в строку, каждый символ (включая\
) является одним символьным токеном этой строки; затем\glen
жетон сожрал\
, затем\tlen
считает оставшиеся жетоны. Поэтому он выводит длину этой последовательности управления (не включая\
).Символы из других фрагментов расширяют последовательность управления, которая изначально является простой
\t
. Многосимвольная управляющая последовательность должна состоять только из букв, но все они считаются буквами, потому что им был присвоен код категории 11 (с использованием кодов ASCII, чтобы сами символы не появлялись в первом фрагменте).Я решил использовать восьмеричные коды для некоторых символов, которые стоили мне один символ,
'
но сохранили мне две цифры, 8 и 9, поэтому я получил один фрагмент. Возможно, мог бы получить еще пару, если бы я не нуждался\expandafter
.Выход
Возможное изменение: обертывание
\number\count1
в\message{}
поэтому выход не переходит в.dvi
выходной , но вместо того, чтобы вывести консоль и.log
. Это не стоит никаких дополнительных писем.190
К сожалению, TeX работает с ASCII, а не с Unicode (или делает это сейчас?), Но мое решение может быть расширено, чтобы включить еще 129 односимвольных фрагментов, содержащих символы с кодами 127-255. Может быть, даже некоторые символы до 32. Символ 32 (пробел) не работал, в противном случае я бы также поместил его во фрагмент - он не понадобился в первом фрагменте. Конечно, каждый из этих дополнительных символов должен был бы быть
\catcode
заключен в букву в первом фрагменте.источник
Пип, 57 байт, оценка = 16
Обратите внимание, что
<tab>
представляет собой буквенный символ табуляции (ASCII 9). Попробуйте онлайн!Каждый фрагмент представляет собой полную программу, которая выводит желаемое число. Большинство из них работают по принципу, согласно которому последнее выражение в программе Pip автоматически печатается: например, во фрагменте 5 вычисляется предыдущий код, но важна только часть
5
. Исключениями являются:RT9
(квадратный корень из 9), но после фрагмента 2 он фактически анализируется как2RT9
(2-й корень из 9) - что, конечно, равносильно тому же.y
переменную. Затем фрагмент 8 выводит значениеy
.o
( предварительно инициализированный в 1). Фрагмент 13 берет этот результат и вычитаетv
(предварительно инициализирован до -1).1
без новой строки (Ok=k
гдеk=k
значение по умолчанию равно 1), а затем автоматически печатается6
.Другие интересные вещи:
14
из значения pi."F"
из шестнадцатеричной.источник
Zsh , оценка> 50 000 (1 112 046?), 16 + Σ (длины кодовой точки UTF-8)
Zsh по умолчанию обрабатывает многобайтовые кодировки. Базовый фрагмент содержит 18 уникальных персонажей, всего 34. Любая другая кодовая точка (кроме нулевого байта) может быть добавлена к этому. Когда я пишу это, мой скрипт проверяет их на кодовой точке ~ 50 000, общий размер файла 150 КБ, примерно 30 фрагментов в секунду. Запустите мой полный тестовый скрипт самостоятельно здесь. Вы можете настроить его так, чтобы он начинался с более поздних кодов.
Попробуйте первые 2000 фрагментов онлайн!
Больше фрагментов возможно с использованием этой техники .
источник