Я определяю n-ую тройку как тройную, которая возвращает n и имеет вид:
1 ? 2 ? 3 ? n - 1 ? n : 0 : 0 : 0 # n - 1 zeroes
Напишите функцию или завершенную программу, которая с помощью ввода n будет выводить или возвращать n-ю троицу. Код-гольф.
Testcases
0 #=> undefined behaviour
1 #=> 1
2 #=> 1 ? 2 : 0
3 #=> 1 ? 2 ? 3 : 0 : 0
10 #=> 1 ? 2 ? 3 ? 4 ? 5 ? 6 ? 7 ? 8 ? 9 ? 10 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0
1000-й троичный я думаю, в ней есть какая-то дзенская гармония.
Ответы:
Pyth -
191817 байтПространства убивают меня, думая о лучшем способе справиться с ними.
Он просто соединяет числа через a
" ? "
и затем объединяет вторую часть.Попробуйте это онлайн здесь .
источник
CJam,
1818 байтовПопробуйте онлайн .
объяснение
источник
:)
.Рубин, 31 байт
Тестовое задание:
источник
array * string
==array.join string
... интересноf[0]
?irb(main):007:0> f[0] ArgumentError: negative argument from (irb):6:in * from (irb):6:in block in irb_binding from (irb):7:in [] from (irb):7 from /usr/bin/irb:11:in <main>
CJam, 19 байтов
Просто начало ...
Как это устроено
Попробуйте это онлайн здесь
источник
Brainfuck, 305
(Без ввода номера из STDIN, см. Редактирование внизу)
Я использовал этот прекрасный алгоритм для печати числа, которое занимает 155 байт всей программы.
Работает на входах до 32768 (16-битное ограничение алгоритма). Он не создает конечные пробелы и работает для ввода
1
:Быстрая прогулка:
Настройка (97 байт)
Первая часть (181 байт)
Вторая часть (27 байт)
Если бы было разрешено отобразить 8 команд Brainfuck на 3 бита, эта программа заняла бы 114 байтов и еще 3 бита
Унарный, ~ 4.08 * 10 ^ 275 байт
Было бы слишком долго здесь, но это только 408452257862560239329948606295286361112603208650130608525040044700379331457759667646985586658469601803889628246410788572492437928714867190270708935427798983714797786123292750743771225096145575210320040188155473030775033228313350778616384531426430459309802833775612506568528463 нулей и работает так же, как программа Brainfuck.
РЕДАКТИРОВАТЬ : Я запутался, эта программа на самом деле не принимает пользовательский ввод, она просто использует текущее значение указателя в качестве ввода. Для возможности разбора числа потребовалось бы намного больше, и я не могу потрудиться сделать это.
Таким образом, он работает со значением, непосредственно введенным в программу (добавляя n раз «+» перед программой), но не с STDIN
источник
JavaScript (ES6),
4239 байтВнешняя функция
f
принимает входное значение, а затем вызывает внутреннюю функцию.g
рекурсивно чтобы построить строку из середины, используя входное значение в качестве максимума для проверки базового случая.Ungolfed:
источник
Python
5655источник
C # - 76
источник
Haskell, 53 байта
Как это работает: построить строку изнутри, начав с пустой строки и зацикливая
n
снизу до2
с добавлением текущего числа и a?
и добавляя a: 0
. Наконец положить1
перед всеми.Другой подход (благодаря @Mauris теперь на 9 байт короче):
Haskell,
6051 байтКак это работает: литерал
1
следует? <x>
для каждого<x>
в[2..n]
последующей постоянной: 0
для каждого<x>
в[2..n]
.источник
g n='1':((=<<[2..n])=<<[(" ? "++).show,\x->" : 0"])
(\_->" : 0")=<<[2..n]
на[2..n]>>" : 0"
Pyth, 17 байт
Демонстрация.
источник
Юлия,
4431 байтЭто создает безымянную функцию, которая принимает целое число в качестве входных данных и возвращает строку. Чтобы назвать его, дайте ему имя, например
f=n->...
.Сначала мы объединяем целые числа от 1 до n , разделяя каждое с
?
пробелами в одну строку. Затем добавляем к этому строку," : 0"
повторяемую n -1 раз.Примеры:
источник
JavaScript ES7, 62 байта
Я не знаю, смогу ли я играть в гольф больше. Но это довольно простое решение
Только Firefox:
ES5 эквивалент:
источник
CoffeeScript, 52 байта
объяснение
источник
SWI-Пролог, 90 байт
Определенно не выиграет, но
\+ (between(1,TopBound,N),\+do_something(N))
конструкция довольно интересно повторить что-то на последовательности целых чисел.источник
Swift 145 (135 без пробелов)
Можете ли вы поверить, что часть подстроки на самом деле длиннее, чем часть для создания выражения.
источник
str[1]
илиstr[0...5]
. Конечно, вы можете сделать небольшое расширение, но я бы хотел, чтобы стандартная библиотекаPerl, 36 байт
35
символы+1
для-n
.Бежать с:
источник
Ява, 71
Я не мог помочь себе после того, как прокомментировал ответ RCB . Итак, вот еще одна Java (например, вау, когда Java не самая длинная!)
источник
Джава,
12588 байторигинал
С более хорошим форматированием и именами переменных:
Улучшено - благодаря комментариям Джека Аммо ниже:
источник
e+=" : 0";
. Затем вы можете сохранить 1 байт, увеличив значение i после его использования, а не в строке forloop. Вfor(int i=1;i<n;){s+=i+++" ? ";
операторе return больше не будет места, добавленного после nreturn s+n+e;
. Вы также можете сохранить 1 байт, используяe=s
. Кроме того, оператор if в начале не нужен, так как логика цикла for в любом случае гарантирует этот результат.JavaScript (ES6), 59 байт
Тот же подход, что и в моем ответе CoffeeScript, с использованием строк шаблона.
String.prototype.repeat
стоит слишком много символов.демонстрация
Firefox пока только для ES6.
источник
К, 36 байт
источник
Python 2,
63605856Попробуй здесь
Простое решение: (63)
редактировать : я действительно хотел попробовать рекурсивную функцию. Вот оно: (56)
Редактировать : Кто-нибудь знает, почему это не работает? Я попробовал список с индексом
c<n
, но это не сработало из-за ошибки переполнения стека. То же самое с этим:источник
0*
.RS , 77 байт
Живая демоверсия и тестовые случаи.
Объяснение:
Разложите число в серию из N подчеркиваний.
Повторно создайте диапазон подчеркиваний, разделенных пробелами. Например, это превратится
___
в_ __ ___
.Добавить к последнему набору символов подчеркивания (длиной N) N-1 экземпляров
: 0
.Замените каждую группу подчеркиваний на их длину, перед которой стоит
?
ИСКЛЮЧИТЬ первую.Замените первый номер 1.
Из-за формата это также
0
хорошо обрабатывается : он просто печатает пустую строку.источник
Swift,
7975 байтf
неявно объявлен как функция с однимInt
параметром, который возвращаетString
Работает с
n >= 1
и вылетает во время выполнения, когдаn == 0
. Там нет конечных пробеловРедактировать: удалось удалить 2 * 2 символа, потому что интерполяция строк не всегда самая короткая
Примечание для редактирования: этот код требует вечности (он не останавливается) для компиляции, но это определенно будет, если компилятор сможет его обработать. Взгляните на версию перед этим редактированием, чтобы получить ту, которая компилируется
источник
> <> , 32 + 3 = 35 байт
Обратите внимание, что на второй строке есть пробел. +3 для
-v
флага, например, бегите какПринимая ввод как кодовую точку, как
составляет 34 байта, но я предпочитаю приведенную выше версию, так как ее проще тестировать и она все равно не выиграет.
объяснение
Происходит немало псевдорекурсии и злоупотреблений, поэтому давайте посмотрим.
Первая строка печатает
"1 ? 2 ? ... n-1 ? "
деталь. Стек начинается только с вводаn
, благодаря-v
флагу, и мы делаем следующее:> <> является тороидальным, поэтому приведенное выше выполняется в цикле до тех пор, пока стек не окажется
n
сверху, сn-1
нулями внизу, после чего он переместится на вторую строку.При первом выполнении второй строки выполняется
n
инструкция с печатьюn
вверху стека. Это оставляет толькоn-1
нули, и мы делаем следующее, также в цикле:источник
" ? "ooo
Вывести на обороте знак «?» (Но, эй, палиндромы) , печать на обороте короче, чем печать фактической строки?Scala,
78715250 байтисточник
Objective-C, 346 байт
Вставка
0
дляint
или что-то негативное поднимаетNSRangeException
из-заoutString
сдерживанияnil
. Это должно работать на iOS 2.0 и более поздних версиях, а также на многих из последних версий Mac OS X.Разбивка кода:
Стандартное объявление функции в Objective-C.
Создает строку для вывода
outString
и делает ее изменчивой. (Другими словами, это может быть прочитано и записано.Добавляет первую часть строки для вывода.
Очищает начало строки, чтобы убедиться, что
? 1
она заменена на1
. Примечание: если0
был задан, это тоNSRangeException
место, где будет происходить, потому что там нет индекса1
.Добавляет вторую часть строки в строку.
Выплевывает строку обратно с помощью
NSLog
и закрывает функцию.Выход:
Ввод
0
дает этот журнал сбоя:1
дает это:2
дает это:7
дает это:200
дает это:источник
С,
8478 байтC, хотя он и не самый короткий, как функция:
Во имя игры в гольф, то
int
спецификатор типа остается прочьi
,f
иn
потому что это по умолчанию.i
может быть неинициализирован, потому что это глобальная переменная и по умолчанию ноль.f
не возвращает значение, но вызывает только предупреждение.printf
это не#include
д Чтобы запустить, вот полная версия программы:источник
for(printf(...);--i;)
.C, 63 байта
Многоразовая функция, принимает n в качестве аргумента.
Разоблаченный и прокомментированный (довольно просто):
источник
Common Lisp, 84
Во-первых,
(loop for i from 1 to (read) collect i)
генерируется список целых чисел от 1 до того, что вставлено, что используется в качестве единственного аргумента функции. Но настоящая магия этого в управляющей струне, которая похожа на шум линии."~{~A ? ~}"
перебирает весь список, сохраненный в первом аргументе, выводя каждое число с?
первой половиной.~@*
сбрасывает список аргументов к первому аргументу.~{~[~;~:;0~^ ? ~]~}
повторяет список, выводя0 ?
для каждого потребляемого аргумента, но ничего не выводя, если аргумент равен 0 или 1.источник