Counterstring является своего рода тестовых данных самоописываемых , который используется в тестировании программного обеспечения. Не уверен, что это действительно изобрел Джеймс Бах , но я знаю это оттуда.
Идея заключается в следующем: тестовые данные содержат много звездочек ( *
). Число перед звездочкой говорит о том, как долго в этот момент находятся тестовые данные. Если вам нужно знать позицию в тестовых данных, которая не является звездочкой, найдите последнюю звездочку, посмотрите на число перед и добавьте число цифр, которые следуют.
Последовательность начинается так:
2*4*6*8*11*14*17*20*23*
^
Как видите, отмеченная звездочка находится в позиции 14.
Если файл обрезается следующим образом
[...]2045*20
тогда вы можете определить, что где-то существует ограничение в 2047 символов (2045, где звездочка плюс 2 для 2
и 0
).
Ваша задача - создать самую короткую (это код-гольф ) программу, которая выводит (std :: out или file или что-то еще) произвольную длинную тестовую строку этого формата. Длина в символах указана в качестве аргумента. Программа должна поддерживать тестовые данные объемом до 2 ГБ (входное значение 2147483647 символов).
«Опасные» позиции в файле объемом 2 ГБ:
8*11*
98*102*
998*1003*
9998*10004*
99998*100005*
999995*1000003*
9999995*10000004*
99999995*100000005*
999999995*1000000006*
Это должно ответить на вопрос @Leaky Nun , если будет принято решение между 995 * 999 * и 995 * 1000 * или аналогичным: нет.
Конец файла размером 2 ГБ с входным значением 2147483647:
2147483640*2147483
995*999*
и995*1000*
или что - нибудь подобное?Ответы:
Haskell,
6058 байтВ качестве функции мы получаем:
Полная программа,
7270 байтЭто выводит бесконечную контрструну к STDOUT:
Ввод длины требует 20 дополнительных байтов:
Это работает примерно до вашего объема оперативной памяти, так как по умолчанию Haskell использует числовые целочисленные типы
Integer
.источник
Pyth,
25171514 байтПопробуйте онлайн.
Длина берется через STDIN.
источник
Python 2,
7472666461 байтПринимает целое число n и выводит контрструну длины n.
версия программы, 69 байт:
Берет целое число n из стандартного ввода и печатает контрструну длины n.
Короче, но только почти рабочая, альтернативная версия:
источник
PowerShell v5, 97 байт
Принимает ввод в качестве аргумента командной строки
$n
, устанавливает помощник,$l
который мы используем для отслеживания нашей целочисленной длины. Затем мы делаем цикл от0
до$n
. Каждую итерацию мы увеличиваем$i
на.length
строку, образованную из,$i
и звездочку. Затем, если.length
из$i
меняется (например, мы перешли от 2 -х цифр до 3 цифр), мы увеличиваем как вспомогательная$l
переменная ength и$i
(для учета дополнительной цифры). Затем мы используемadd-content
команду для добавления"$i*"
файла.\o
в текущий каталог с помощью-n
oNewLine.NB
-noNewLine
параметр был наконец добавлен в этой версии.[int]
в[double]
(нет, я не знаю, почему это не так[long]
), поэтому он будет правильно обрабатывать ввод до и более чем2147483648
без проблем. Теоретически, он будет обрабатывать ввод где-то примерно до1.79769313486232E+308
(максимальное значение[double]
), прежде чем жаловаться, но я ожидаю, что диск заполнится до того, как это произойдет. ;-)10
это будет выводить2*4*6*8*11*
, так11
как это первое$i
значение больше, чем вход.PowerShell v2 +, также 97 байт (не конкурирует)
Вместо отправки в файл это инкапсулирует итерации цикла и затем
-join
помещает их вместе в строку. Это позволяет ему работать для версий более ранних, чем v5. Однако, поскольку .NET определяет a[string]
с помощью конструктораString(char c,Int32 length)
, эта версия не удовлетворяет максимальному входному требованию, поскольку выходная строка будет переполнена и barf.Кроме того, вы можете не захотеть иметь строку ~ 2 ГБ, плавающую в вашем конвейере. Просто говорю'.
источник
[double]
s является 64-битным. Например, runfor($i=2147483645;$i-lt2147483655;$i++){"$i - " + $i.GetType()}
покажет устойчивую прогрессию,$i
ноType
изменения в2147483648
кdouble
. Я уверен, что в какой-то момент он перестанет работать, вероятно, около ~ 15 цифр точности или когда.ToString
начнут использоватьe
. Это[double]::MaxValue
была скорее шутка, чем серьезная верхняя граница.Python 3,
12611499 байтФункция, которая принимает входные данные через аргумент счетчика символов для обрезания строки и печатает в STDOUT.
Как это работает
Разница между числами в строке изначально равна 2. Каждый раз, когда передается порядок величины, эта разница увеличивается на 1; это может быть достигнуто путем взятия разности между количеством цифр текущего номера и количеством цифр текущего номера, добавленных к разнице, которая равна 1 только при необходимости. Функция просто зацикливается, в то время как длина строки меньше входной, добавляет к строке и обновляет разность и число по мере необходимости, а затем усекает перед печатью.
Попробуйте это на Ideone
Версия с бесконечным выводом, 69 байт
источник
R, 92 байта
Пример вывода:
источник
Желе ,
221918 байтПопробуйте онлайн!
Найдите первые
n
числа в строке, затем присоедините к списку звездочку. Это всегда будет дольше, чемn
было разрешено OP в комментариях.Программа выборочно обновляет регистр с текущим номером в последовательности в
#
цикле с¹©=¡
. Я надеялся, что это может быть короче, положив©
µ
например, после второго , но, к сожалению, это не сработает, и я не могу понять, что короче.источник