Ваша цель - показать искусство ASCII формирования в боулинге с десятью булавками, где остаются только некоторые булавки. Побеждает несколько байтов.
Десятки штифтов имеют треугольную форму:
O O O O
O O O
O O
O
Булавки помечены от 1 до 10 как:
7 8 9 10
4 5 6
2 3
1
Рисование штифтов как O
и недостающих штифтов как .
, формирование 1 3 5 6 9 10
:
. . O O
. O O
. O
O
Входные данные:
Разделенная пробелами строка, которая перечисляет непустое подмножество чисел от 1 до 10 по порядку.
Выход:
Выведите соответствующую формацию или выведите ее в виде строки с переносами строк.
Формация должна находиться на одном уровне с левой частью экрана. Любой пробел в порядке, если видимое изображение правильное. Пустые строки до и после тоже подойдут.
Тестовые случаи:
>> 1 2 3 4 5 6 7 8 9 10
O O O O
O O O
O O
O
>> 7 10
O . . O
. . .
. .
.
>> 3 5 7 9 10
O . O O
. O .
. O
.
>> 1
. . . .
. . .
. .
O
Ответы:
брейкфук -
617616604 байтаЭто заняло у меня лучшую часть двух дней. Я думаю, это того стоило. Вероятно, есть детали, которые можно больше играть в гольф, изменяя, в какой ячейке что-то хранится или что-то в этом роде, но сейчас я просто счастлив, что все заработало.
Эта программа должна была бы быть совершенно другой, если бы в вопросе не было указано, что входные данные будут отсортированы. Это работает путем построения списка из 10 выводов вокруг входных. Это немного сбивает с толку, но, возможно, это объяснит это лучше:
При этом он запоминает, какие из выводов пользователь вставил туда, а какие - туда. Эту стратегию было бы очень сложно использовать, если входные данные не были отсортированы.
Еще одна вещь, которую упростит сортировка, - это обнаружение числа 10. Поскольку мозговой трах имеет дело с отдельными байтами, а не с «числами» как таковыми, это могло быть болезненным задом, но отсортированный ввод сделал мне намного легче иметь дело с. Причина этого связана с тем, как я хранил данные в программе. Я беру ввод по одному символу за раз и вычитаю 32 из результата. Если после этого ячейка станет ненулевой, я продвигаюсь на 4 ячейки. перед повторением. Это означает, что я получаю непустой байт ввода каждые 4 ячейки, и я эффективно сохраняю выводы как их число + 16. Однако для ввода 10 требуется два байта, поэтому мне пришлось использовать его в особом случае. Если вход не был отсортирован, мне пришлось бы просматривать контакты, но поскольку он отсортирован, он всегда будет последним, если он появится. Я проверяю, является ли (последний байт ввода + 1) == (вторым последним байтом ввода), и если да, то должно быть 10. Я избавляюсь от последнего байта и устанавливаю второй последний на то, что моя система понимает как "10". Персонажи
'1'
и'0'
не помещается в один байт, но число 26 точно подходит!Придумывать трюки, чтобы заставить что-то работать, - моя любимая часть использования этого языка. :)
Если вас интересует, как эта программа работает более подробно, вы можете увидеть программу с комментариями, которые я использовал при ее написании, чтобы убедиться, что я вспомнил, что все делал. Даже писать комментарии в Brainfuck сложно, так как нет синтаксиса комментариев. Вместо этого, все персонажи, кроме тех, которые в не
<[+.,-]>
являются опа. Легко вносить ошибки, случайно включив.
или,
в ваших комментариях! Вот почему грамматика такая шаткая, а точки с запятой везде.РЕДАКТИРОВАТЬ: В качестве примера того, как это легко облажаться: я использовал "не пробел" в одном из комментариев! Когда я удалил все не-bf символы из источника, программа, которую я использовал для этого, сохранилась в
-
. К счастью, это ничего не сломало, но теперь я удалил его, чтобы сохранить байт. :)РЕДАКТИРОВАТЬ II: Прошло много времени с тех пор, как я коснулся этого, ха-ха. В другом ответе о бреде на этом сайте я заметил, что я случайно использовал запятую в закомментированной версии. Поскольку ввод уже исчерпан, он устанавливает текущую ячейку на 0 (это зависит от реализации, но, по моему опыту, это наиболее распространенное поведение). Я исправил ошибку, но это заставило меня задуматься. Идиоматический способ установить ячейку в 0 - это
[-]
(примерноwhile (*p) { *p--; }
), что на два байта длиннее. Каждый раз, когда все входные данные были прочитаны, я могу использовать,
вместо этого. Это спасло мне 2 байта в этом ответе и 12 в этом!источник
Python 2, 108 байт
Позвони с
f("3 5 7 9 10")
.i
номер строки, где 4 - первая строка, а 1 - последняя.z
это n-й вывод в этом ряду, где 0 означает, что это первый вывод в ряду иi-1
означает, что это последний вывод в ряду.Основной взлом
i*~-i/2-~z
, который конвертирует(i, z) -> pin number
. Например,(4, 0) -> 7
как вывод 7 является первым выводом в ряду 4 (первый ряд). Вывод выглядит так:Мы хотим , чтобы функция принимает
i
к первому штифта на строкеi
, то есть4 -> 7, 3 -> 4, 2 -> 2, 1 -> 1
. Это удовлетворяет(i**2-i)/2 + 1
, и, таким образом,(i**2-i)/2 + 1 + z
дает правильный номер контакта для ввода(i, z)
Тогда упростим:
Pyth , 33 байта
Попробуйте онлайн.
Программа примерно переводится на:
(Спасибо Айзека за советы)
источник
V4
эквивалентенFNU4
иrz7
эквивалентенmvkcz\
.Пиф , 31
Попробуй это здесь .
V4
устанавливает цикл for с N в качестве переменной над [0,1,2,3].*dN
обеспечивает начальные пробелы, потому чтоd
это пробел.Чтобы найти расположение выводов, он использует
+7+dZ
- 7 + d + Z.d
является:в то время
Z
как 0 в первой строке, -4 во второй, -7 в третьей и -9 в четвертой. ЭтоZ
потому, что начинается с 0 и~Z-N4
уменьшаетсяZ
на 4, затем на 3, затем на 2.Затем он проверяет, находится ли расположение контактов на входе, используя
}+7+dZrz7
.rz7
является желаемыми выводами в виде спискаЗатем он создает,
O
если он присутствовал, и в.
противном случае. Это разделенный пробелами,jd
и печатается неявно.источник
Perl 5: 51 (50 + 1 для
-p
)Использование
r
флага дляs///
которого является одним из последних дополнений Perl 5.источник
CJam,
4841 байтВау, это стало ужасно долго
Проверьте это здесь.
объяснение
Сначала мы генерируем макет:
Это дает
А теперь мы заменим цифры цифры в соответствии с вводом:
источник
"789A456S23SS1":~S*7/N*[l~]'OerB,'.er
немного короче.er
автоматическое вещание в массив тогда."789A456S23SS1":~S*7/N*[l~]"O"erB,"."er
отлично работает в 0.6.2.Python 2,
9794При этом используется функция перевода, которая позволяет делать символьные замены в строке. Как tr в perl, за исключением того, что он намного дольше печатается. Я получаю список десятичных цифр, делая строку от 9 до 99-й степени.
источник
Javascript, 155
Первый гольф, возможно, может быть короче.
позвонить с
РЕДАКТИРОВАТЬ
Версия ES6, 130
РЕДАКТИРОВАТЬ
Версия ES6, 79не работаетВерсия ES6,
7277, без предупреждения, просто возвращаетсяисточник
.match
). Это самый элегантный из них.Руби, 91
Просто заменяет аргументы командной строки на
.
s и0
s и печатает их, используя цикл из 4 циклов.Читаемая версия
источник
GNU sed, 75
Оценка включает в себя 1 дополнительный для
-r
варианта:Ввод через STDIN:
Попробуйте онлайн .
источник
l
s .0
к10
на линии 2,1/
чтобы1 /
на линии 5, и[0-9]
в[0-9]+
строках 7 и 9 вы можете оставить первую строку на 4 байта.CJam,
4039 байтЯ знаю, что есть более короткий путь, у меня нет времени, чтобы понять это прямо сейчас.
Как это работает:
Попробуйте онлайн здесь
источник
APL (35)
Тест:
Объяснение:
17110357⊤⍨28/2
: 28-битное представление17110357
:\⍨
: Для каждого0
укажите пробел, а для каждого1
- элемент из строки слева.⎕∊⍨⍳10
: Прочитайте строку с клавиатуры и оцените ее (⎕
), затем проверьте для каждого числа от 1 до 10 (⍳10
), содержится ли оно в input (∊⍨
).'.O'[1+
...]
: добавьте 1 к каждому значению (давая 1 и 2 вместо 0 и 1), а затем замените 1 на.
2 и 2 наO
.4 7⍴
: превратить сгенерированную строку в матрицу 4 на 7⊖
: перевернуть его горизонтальноисточник
Powershell: 109
Ввод в $ я
Это было весело. Также узнал много о том, как работает конвейер.
источник
Haskell:
163160 байтЭто принимает строку разделенных пробелом чисел от
stdin
.Ungolfed:
И бонус:
C: 250 байт
Эта версия ожидает, что ее аргументы командной строки будут списком чисел.
источник
Perl, 73
И глупый бонусный подход, который не удался, 90 символов:
источник
Mathematica, 109 байт
Функция:
Вызывается:
Если разрешены анонимные функции, это можно сократить до 105 байт :
Если входные данные не должны быть строкой, разделенной пробелами, но могут представлять собой массив чисел в форме
{3,5,7,9,10}
, это можно дополнительно сократить до 79 байт :источник
Чистый bash (без coreutils), 85
Простая замена шаблона:
Список вводится через аргументы командной строки.
источник
Реболь - 117
Ungolfed:
источник
Brainfuck, 179 байтов
отформатирован:
Ожидается ввод без завершающей строки.
Попробуйте онлайн.
Лента инициализируется десятью узлами, каждый из которых содержит один, за которым следует ноль. Один является начальным значением булавки, а ноль облегчает навигацию и действует как заполнитель для символа пробела. Для каждого числа на входе этот вывод увеличивается на 3; обратите внимание, что
ord('O') - ord('.') = 33
во время фазы печати значение булавки будет умножено на 11. (Это умножение также используется для генерирования символа пробела.) Порядок выводов слева направо на ленте просто1
до10
. Если ввод оканчивается на a10
, выполняется коррекция, поскольку10
изначально он обрабатывается как a1
.После того, как ввод был обработан, после каждой строки помещается отрицательный. Затем строки печатаются в цикле, причем количество начальных пробелов определяется количеством предварительно обработанных строк.
источник
Clojure, 216 символов (тьфу)
Я уверен, что это может быть дальше.
Используйте как это:
источник
AWK: 96 байт
Заметка:
источник
C # - 192 байта
Потому что C #!
Я начал пытаться построить вывод с помощью математики, но простой метод replace-tokens-in-string кажется лучшим для языков более высокого уровня. Зависимость Linq длинна, но все же короче, чем хранение счетчика и проверка диапазона.
РЕДАКТИРОВАТЬ: UNIX строка возвращает (-3 байта)
источник
Скала,
150148Принимает разделенный пробелами набор строк
источник
JavaScript ES6, 78 байт
Используйте следующий фрагмент для проверки. Он использует подсказки и оповещения, а также регулярные обозначения функций для удобства тестирования.
источник
VB / Basic-229
Моя цель состояла в том, чтобы победить Java ^^
отредактируйте vbCr вместо chr (13)
r = r + пробел (3 - (e - b))
стенография, если
использование функции вместо суб
sub MAIN () -> sub m ()
источник
Ява - 223 символа
Раньше мне нравился этот способ, потом я понял, что мне нужен небольшой взлом, все еще вроде моего решения.
источник
К, 57 байт
Пока не очень конкурентоспособный, но это начало:
Пример использования:
Я начинаю с оценки входной строки с
.
- к счастью, числа, разделенные пробелами, являются допустимым литералом списка в K. Добавляя пустой список к результату eval, я могу гарантировать, что это список даже в случае одного вывода. Затем я создаю логический вектор, представляющий положения выводов:Затем я индексирую список строк, чтобы получить символы с пробелами для каждой позиции выводов.
Я разрезаю эту последовательность на row (
_
), инвертирую их (|
) и объединяю каждый фрагмент (,/'
):Теперь это начинает выглядеть так, как мы хотим. Осталось только добавить несколько пробелов в каждую строку (
((!4)#\:" "),'
) и вывести строки в stdout (0:
).источник
Паскаль (FPC) , 165 байт
Попробуйте онлайн!
Извлекает числа из стандартного ввода, печатает формирование в стандартный вывод.
Паскаль (FPC) , 175 байт
Попробуйте онлайн!
Функция, которая делает то же самое, беря массив позиций выводов и возвращая отформатированную строку.
источник
Powershell, 84 байта
Тестовый скрипт:
Выход:
источник
Ява -
371316294 символаВ первый раз, когда я делаю это, я почти уверен, что это дерьмо, но я новичок. Это также работает, когда номера не упорядочены. Нумерация неправильная, но у меня нет времени, чтобы выяснить, как это исправить ...
вход дан,
java B 1 2 3 5 10
например. Выход будет тогда:источник
Japt
-Rx
,29191817 байтПопытайся
объяснение
источник