N-тая тройка


17

Я определяю 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-й троичный я думаю, в ней есть какая-то дзенская гармония.


1
Разрешен ли конечный пробел?
rink.attendant.6

@ грин нет, тренировок нет
Caridorc

1
Поскольку «троичный» означает «3», разве вы не должны называть его «n-ary», на что он ссылается в математике?
mbomb007

4
Способ «отредактировать» комментарий: удалите его и добавьте новый.
Рето Коради

1
@RetoKoradi Вы можете редактировать комментарий, если он опубликован в течение пяти минут.
mbomb007

Ответы:


8

Pyth - 19 18 17 байт

Пространства убивают меня, думая о лучшем способе справиться с ними.

+j" ? "SQ*tQ" : 0

Он просто соединяет числа через a " ? "и затем объединяет вторую часть.

+              String concatenation
 j" ? "        Join by the string
  SQ           1-indexed inclusive range to input
 *             String repetition
  tQ           Input - 1
  " : 0        String implicitly closed by end of program

Попробуйте это онлайн здесь .


10

CJam, 18 18 байтов

ri,:)":?0"*2/ze_S*

Попробуйте онлайн .

объяснение

ri,:)          e# Generate the list 1..n.
":?0"*         e# Insert ":?0" between every two numbers.
2/             e# Split into pairs, e.g. 1:, ?0, 2:, ?0, ..., ?0, n.
z              e# First items in every pair before second items in every pair.
e_             e# Concatenate the two parts.
S*             e# Insert spaces.

12
Я люблю :).
Алекс А.

9

Рубин, 31 байт

f=->n{[*1..n]*' ? '+' : 0'*~-n}

Тестовое задание:

> f[1]
=> "1"
> f[7]
=> "1 ? 2 ? 3 ? 4 ? 5 ? 6 ? 7 : 0 : 0 : 0 : 0 : 0 : 0"

2
Так что array * string== array.join string... интересно
Caridorc

Это действительно круто. Из любопытства, что происходит, когда вы делаете f[0]?
Алекс А.

1
@AlexA. 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>
Caridorc

4
@Caridorc И громко, и неразборчиво. Ницца.
Алекс А.

2
@daniero Предупреждение: может быть сгенерирована анти-строка
Caridorc

8

CJam, 19 байтов

Просто начало ...

ri_,:)'?*\(":0"*+S*

Как это устроено

ri_                       e# Read the number as integer and make a copy of it on stack
   ,:)                    e# Convert the copy to array [1 .. n]
      '?*                 e# Join the numbers with a '?'. So we have [1 '? 2 '? ... '? n]
         \(               e# Swap the stack to get original integer on top. Decrement it by 1
           ":0"*          e# Get n-1 repeated ":0" string
                +S*       e# Join the two strings and fill it with spaces. 

Попробуйте это онлайн здесь


Черт возьми, на 1 минуту позже.
Деннис

3
вау, ты довольно быстро разбираешься в Cjam: O
Caridorc

@ Денис Я думаю, что ваше первоначальное решение, которое было идентично первому решению Оптимизаторов, было на самом деле первым. По крайней мере, я почти уверен, что увидел это всплывающим первым. Но ваше время публикации было обновлено, когда вы редактировали его в течение льготного периода.
Рето Коради

1
@RetoKoradi его пост ID 52870. Мой 52869 :)
Оптимизатор

Ах, хорошо, у меня нет разрешения на просмотр удаленных сообщений на этом сайте. Должно быть, оба всплыли одновременно для меня, и я заметил только один из них. Кажется, я помню, что SE может делать некоторые интересные вещи, чтобы публиковать время при редактировании в течение льготного периода. В противном случае вы можете опубликовать пустой заполнитель и заполнить контент в течение льготного периода, чтобы он выглядел так, как если бы у вас был первый ответ, и на самом деле он содержал полезный контент с самого начала, поскольку изменения в льготном периоде не отслеживаются.
Рето Коради

6

Brainfuck, 305

(Без ввода номера из STDIN, см. Редактирование внизу)

-[->+>+<<]>>>++++[>++++++++<-]>[<+>-]+++++++[>+++++++++<-]>[<+>-]++++++[>++++++++
<-]>[<+>-]++<<<<>>>+.-<<<[>.>.<.>>>>>++++++++++<<[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<
]>>[-]>>>++++++++++<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>[-]>>[>++++++[-<++++++++>]<.<<
+>+>[-]]<[<[->-<]++++++[->++++++++<]>.[-]]<<++++++[-<++++++++>]<.[-]<<[-<+>]<+<<<
<-]>>-----<<<[->>.>.<.>>.<<<<]

Я использовал этот прекрасный алгоритм для печати числа, которое занимает 155 байт всей программы.

Работает на входах до 32768 (16-битное ограничение алгоритма). Он не создает конечные пробелы и работает для ввода 1:

input    output
0        [infinite loop (til underflow)]
1        "1"
2        "1 ? 2 : 0"
4        "1 ? 2 ? 3 ? 4 : 0 : 0 : 0"
etc.

Быстрая прогулка:

Настройка (97 байт)

-                                 Decrease input (position 0)
[->+>+<<]  >>>                    Copy input twice to the right and 
                                      shift 3 positions to the right
++++[>++++++++<-]>   [<+>-]       Precalculate number 32 (=" ") at position 3
+++++++[>+++++++++<-]>  [<+>-]    Precalculate number 63 (="?") at position 4
++++++[>++++++++<-]>    [<+>-]    Precalculate number 48 (="0") at position 5
++<<<<                            Precalculate number 2 for later use. This number
                                      will be printed in each iteration. (position 6)

Первая часть (181 байт)

>>>+.-<<<                Go to the char "0" we saved, increase it, print it,
                             decrease it and go back (this prints "1" everytime)
[                        While our second copy of the number isn't zero
    >.>.<.>>>                Move to " ", print, move to "?", print,
                                 move to " " again, print, move to our
                                 number at the end which is initially 2

    [>>+>+<<<-]>>>[<<<+>>>-]<<+>[<->[>++++++++++<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>[-]
        ++++++++[<++++++>-]>[<<+>>-]>[<<+>>-]<<]>]<[->>++++++++[<++++++>-]]<
        [.[-]<]<             Algorithm to print the number at current position

    +<<<<                    Increase our number at the end and return to the beginning
-]                       Decrease the loop variable

Вторая часть (27 байт)

>>-----<<<        Move to our "?" char and decrease it by 5 to get ":"
[-                While our first copy of the number isn't zero decrease it
   >>.>.<.>>.<<<<     Print " ", print ":", print " ", print "0"
]

Если бы было разрешено отобразить 8 команд Brainfuck на 3 бита, эта программа заняла бы 114 байтов и еще 3 бита

Унарный, ~ 4.08 * 10 ^ 275 байт

Было бы слишком долго здесь, но это только 408452257862560239329948606295286361112603208650130608525040044700379331457759667646985586658469601803889628246410788572492437928714867190270708935427798983714797786123292750743771225096145575210320040188155473030775033228313350778616384531426430459309802833775612506568528463 нулей и работает так же, как программа Brainfuck.

РЕДАКТИРОВАТЬ : Я запутался, эта программа на самом деле не принимает пользовательский ввод, она просто использует текущее значение указателя в качестве ввода. Для возможности разбора числа потребовалось бы намного больше, и я не могу потрудиться сделать это.

Таким образом, он работает со значением, непосредственно введенным в программу (добавляя n раз «+» перед программой), но не с STDIN


5

JavaScript (ES6), 42 39 байт

f=m=>(g=k=>k-m?k+` ? ${g(k+1)} : 0`:m)(1)

Внешняя функция fпринимает входное значение, а затем вызывает внутреннюю функцию.g рекурсивно чтобы построить строку из середины, используя входное значение в качестве максимума для проверки базового случая.

Ungolfed:

function f(max) {
    function g(count) {
        if(count==max) {
            // base case: return max for the center
            return max;
        } else {
            // recursive case: build outer shell around center
            return count + " ? " + g(count+1) + " : 0";
        }
    }

    return g(1);
}



3

Haskell, 53 байта

g n='1':foldr(\x s->" ? "++show x++s++" : 0")""[2..n]

Как это работает: построить строку изнутри, начав с пустой строки и зацикливая nснизу до 2с добавлением текущего числа и a ?и добавляя a : 0. Наконец положить 1перед всеми.

Другой подход (благодаря @Mauris теперь на 9 байт короче):

Haskell, 60 51 байт

 f n='1':((=<<[2..n])=<<[(" ? "++).show,\x->" : 0"])

Как это работает: литерал 1следует ? <x>для каждого <x>в [2..n]последующей постоянной : 0для каждого <x>в [2..n].


Подход, основанный на ваших 60 байтах, который сводится к 51:g n='1':((=<<[2..n])=<<[(" ? "++).show,\x->" : 0"])
Линн

На самом деле, вы можете уменьшить его до 51 напрямую, просто заменив (\_->" : 0")=<<[2..n]на[2..n]>>" : 0"
Линн


3

Юлия, 44 31 байт

n->join(1:n," ? ")*" : 0"^(n-1)

Это создает безымянную функцию, которая принимает целое число в качестве входных данных и возвращает строку. Чтобы назвать его, дайте ему имя, напримерf=n->... .

Сначала мы объединяем целые числа от 1 до n , разделяя каждое с ?пробелами в одну строку. Затем добавляем к этому строку, " : 0"повторяемую n -1 раз.

Примеры:

julia> f(1)
"1"

julia> f(3)
"1 ? 2 ? 3 : 0 : 0"

julia> f(0)
can't repeat a string -1 times

2

JavaScript ES7, 62 байта

n=>[for(i of Array(n).keys())i+1].join` ? `+' : 0'.repeat(n-1)

Я не знаю, смогу ли я играть в гольф больше. Но это довольно простое решение

Только Firefox:

var f=n=>[for(i of Array(n).keys())i+1].join` ? `+' : 0'.repeat(n-1)

alert(f(+prompt('Input: ')));

ES5 эквивалент:

// Most browsers now support .repeat
String.prototype.repeat = String.prototype.repeat || function(n){var _n = '', i = 0; for (;i < n; i += 1){_n+=this};return _n}
                                                             //Function                         
function f(n){a=[];for(i of Array(n).keys()){a.push(i+1)};return a.join(' ? ')+' : 0'.repeat(n-1)}

alert(f(+prompt('Input: ')))


2

CoffeeScript, 52 байта

f=(n)->s='';s=' ? '+n--+s+' : 0'while n;s.slice 3,-4

объяснение

f=(n)->
 s = ''                                # initialize string
 s = ' ? ' + n-- + s + ' : 0' while n  # prepend and append in decrementing loop
 s.slice 3,-4                          # chop off leading ?, trailing 0 and whitespace

2

SWI-Пролог, 90 байт

a(X):-Y is X-1,\+ (between(1,Y,L),\+writef('%w ? ',[L])),write(X),writef('%r',[' : 0',Y]).

Определенно не выиграет, но \+ (between(1,TopBound,N),\+do_something(N))конструкция довольно интересно повторить что-то на последовательности целых чисел.


2

Swift 145 (135 без пробелов)

func t(n:Int) -> String {
    let a = (1..<n).reverse().reduce("") {" ? \($1)\($0) : 0"}
    return a.substringFromIndex(advance(a.startIndex, 3))
}

Можете ли вы поверить, что часть подстроки на самом деле длиннее, чем часть для создания выражения.


1
Должен любить Swift <3 Я действительно хочу, чтобы они сделали это, чтобы вы могли получить доступ к строкам с целочисленными индексами, такими как str[1]или str[0...5]. Конечно, вы можете сделать небольшое расширение, но я бы хотел, чтобы стандартная библиотека
включала

@Kametrixom Apple однажды допустила это в первой бета-версии, но различные кодировки Unicode мешают вам сделать это. Это происходит главным образом потому, что некоторые символы имеют длину два байта или более, а некоторые - нет. Таким образом, не гарантируется получение одного и того же символа в разных кодировках с одинаковым индексом. Мое описание может быть неточным, но в основном именно поэтому компания Apple ввела синтаксис уродливого глотка.
Бен Лу

Недавно я действительно привык использовать Swift для Code Golfing, взгляните на мой ответ Swift
Kametrixom

2

Perl, 36 байт

say join(" ? ",1..$_)." : 0"x($_-1)

35символы +1для -n.

Бежать с:

echo 10 | perl -nE'say join(" ? ",1..$_)." : 0"x($_-1)'

2

Ява, 71

Я не мог помочь себе после того, как прокомментировал ответ RCB . Итак, вот еще одна Java (например, вау, когда Java не самая длинная!)

String t(int n){String s=""+n;for(;--n>0;)s=n+" ? "+s+" : 0";return s;}

2

Джава, 125 88 байт

оригинал

String f(int n){if(n==1)return"1";String s="",e="";for(int i=1;i<n;i++){s+=i+" ? ";e+=i==n-1?": 0":": 0 ";}return s+n+" "+e;}

С более хорошим форматированием и именами переменных:

String nAry(int n) {
    if (n == 1) {
        return "1";
    }
    String start = "", end = "";
    for (int i = 1; i < n; i++) {
        start += i + " ? ";
        end += (i == n - 1) ? ": 0" : ": 0 ";
    }
    return start + n + " " + end;
}

Улучшено - благодаря комментариям Джека Аммо ниже:

String f(int n){String s="",e=s;for(int i=1;i<n;){s+=i+++" ? ";e+=" : 0";}return s+n+e;}

1
вам не нужен этот триадический оператор для добавления e только для учета пробела, просто предположите, что вам всегда нужно пространство перед двоеточием e+=" : 0";. Затем вы можете сохранить 1 байт, увеличив значение i после его использования, а не в строке forloop. В for(int i=1;i<n;){s+=i+++" ? ";операторе return больше не будет места, добавленного после n return s+n+e;. Вы также можете сохранить 1 байт, используя e=s. Кроме того, оператор if в начале не нужен, так как логика цикла for в любом случае гарантирует этот результат.
Джек Боеприпасы

@JackAmmo Отличные советы, спасибо! Оператор if был необходим, чтобы избежать запаздывающих пробелов, но больше не после улучшений логики цикла for. Я включил изменения и проголосовал за ваш ответ.
RCB

1

JavaScript (ES6), 59 байт

Тот же подход, что и в моем ответе CoffeeScript, с использованием строк шаблона. String.prototype.repeatстоит слишком много символов.

f=n=>{for(s=``;n;)s=` ? ${n--+s} : 0`;return s.slice(3,-4)}

демонстрация

Firefox пока только для ES6.

f=n=>{for(s=``;n;)s=` ? ${n--+s} : 0`;return s.slice(3,-4)}

// DEMO
console.log = x => document.body.innerHTML += '<p>' + x

console.log(f(1));
console.log(f(3));
console.log(f(10));



1

Python 2, 63 60 58 56

Попробуй здесь

Простое решение: (63)

n=input()
for i in range(n-1):print-~i,'?',
print`n`+' : 0'*~-n

редактировать : я действительно хотел попробовать рекурсивную функцию. Вот оно: (56)

f=lambda n,c=1:`c`+(' ? '+f(n,c+1)if c<n else~-n*' : 0')

Редактировать : Кто-нибудь знает, почему это не работает? Я попробовал список с индексом c<n, но это не сработало из-за ошибки переполнения стека. То же самое с этим:

f=lambda n,c=1:`c`+((c<n)*(' ? '+f(n,c+1))or~-n*' : 0')

Индекс не работает, потому что он должен создать список, содержащий оцененную функцию (которая, очевидно, будет работать вечно). То же самое происходит с вашим умножением, оно все равно должно оценить функцию, даже если она это делает 0*.
FryAmTheEggman

@FryAmTheEggman Хорошо, спасибо. У меня никогда не было такой ситуации раньше.
mbomb007

1

RS , 77 байт

(\d+)/(_)^^(\1)
+^_(_+)/\1 _\1
_(_+)$/_\1( : 0)^^((^^\1))
(__+)/? (^^\1)
^./1

Живая демоверсия и тестовые случаи.

Объяснение:

(\d+)/(_)^^(\1)

Разложите число в серию из N подчеркиваний.

+^_(_+)/\1 _\1

Повторно создайте диапазон подчеркиваний, разделенных пробелами. Например, это превратится ___в _ __ ___.

_(_+)$/_\1( : 0)^^((^^\1))

Добавить к последнему набору символов подчеркивания (длиной N) N-1 экземпляров : 0.

(__+)/? (^^\1)

Замените каждую группу подчеркиваний на их длину, перед которой стоит ?ИСКЛЮЧИТЬ первую.

^./1

Замените первый номер 1.

Из-за формата это также 0хорошо обрабатывается : он просто печатает пустую строку.


1

Swift, 79 75 байт

let f={{$0+$1}((1..<$0).reduce(("1","")){($0.0+" ? \($1+1)",$0.1+" : 0")})}

fнеявно объявлен как функция с одним Intпараметром, который возвращаетString

Работает с n >= 1и вылетает во время выполнения, когда n == 0. Там нет конечных пробелов

Редактировать: удалось удалить 2 * 2 символа, потому что интерполяция строк не всегда самая короткая

Примечание для редактирования: этот код требует вечности (он не останавливается) для компиляции, но это определенно будет, если компилятор сможет его обработать. Взгляните на версию перед этим редактированием, чтобы получить ту, которая компилируется


1

> <> , 32 + 3 = 35 байт

:l(?vln" ? "ooo0$
"ooo>nl?!;" : 

Обратите внимание, что на второй строке есть пробел. +3 для -vфлага, например, бегите как

$ py -3 fish.py ternary.py -v 2
1 ? 2 : 0

Принимая ввод как кодовую точку, как

i:l(?vln" ? "ooo0$!
 "ooo>nl?!;" :

составляет 34 байта, но я предпочитаю приведенную выше версию, так как ее проще тестировать и она все равно не выиграет.

объяснение

Происходит немало псевдорекурсии и злоупотреблений, поэтому давайте посмотрим.

Первая строка печатает "1 ? 2 ? ... n-1 ? " деталь. Стек начинается только с ввода n, благодаря -vфлагу, и мы делаем следующее:

:l(?v           If (length of stack + 1 > n), go to the second line
ln              Print the length of the stack
" ? "ooo        Print the reverse of " ? " (but hey, palindromes)
0$              Push 0 and swap, keeping n on top and increasing the 
                length of the stack by 1

> <> является тороидальным, поэтому приведенное выше выполняется в цикле до тех пор, пока стек не окажется nсверху, с n-1нулями внизу, после чего он переместится на вторую строку.

При первом выполнении второй строки выполняется nинструкция с печатью nвверху стека. Это оставляет только n-1нули, и мы делаем следующее, также в цикле:

l?!;            If the stack is empty, terminate
" : "ooo        Print the reverse of " : " (but hey, palin...)
n               Print one of the 0s, decreasing the stack's length by 1
                This reuses the same n instruction from before

" ? "ooo Вывести на обороте знак «?» (Но, эй, палиндромы) , печать на обороте короче, чем печать фактической строки?
Caridorc

@Caridorc Да, потому что> <> может печатать только символ за
символом,

sp3000 приятно знать.
Каридорк


1

Objective-C, 346 байт

-(void)printTernaryOfInt:(int)ternary{NSMutableString *outString=@"".mutableCopy; for (int i=1;i<=ternary;i++) {[outString appendString:[NSString stringWithFormat:@" ? %i",i]];}[outString deleteCharactersInRange:NSMakeRange(0, 2)];for (int i=1;i<ternary;i++) {[outString appendString:[NSString stringWithFormat:@" : 0"]];}NSLog(@"%@",outString);}

Вставка 0для intили что-то негативное поднимает NSRangeExceptionиз-за outStringсдерживанияnil . Это должно работать на iOS 2.0 и более поздних версиях, а также на многих из последних версий Mac OS X.

Разбивка кода:

-(void)printTernaryOfInt:(int)ternary{ ... }

Стандартное объявление функции в Objective-C.

NSMutableString *outString=@"".mutableCopy;

Создает строку для вывода outStringи делает ее изменчивой. (Другими словами, это может быть прочитано и записано.

for (int i=1;i<=ternary;i++) {[outString appendString:[NSString stringWithFormat:@" ? %i",i]];}

Добавляет первую часть строки для вывода.

[outString deleteCharactersInRange:NSMakeRange(0, 2)];

Очищает начало строки, чтобы убедиться, что ? 1она заменена на 1. Примечание: если 0был задан, это то NSRangeExceptionместо, где будет происходить, потому что там нет индекса 1.

for (int i=1;i<ternary;i++) {[outString appendString:[NSString stringWithFormat:@" : 0"]];}

Добавляет вторую часть строки в строку.

NSLog(@"%@",outString);}

Выплевывает строку обратно с помощью NSLogи закрывает функцию.

Выход:

Ввод 0дает этот журнал сбоя:

    2015-07-11 05:15:28.036 Example App[41665:2134488] *** Terminating app due to uncaught exception 'NSRangeException', reason: '-[__NSCFString deleteCharactersInRange:]: Range or index out of bounds'
*** First throw call stack:
(
    0   CoreFoundation                      0x009b5746 __exceptionPreprocess + 182
    1   libobjc.A.dylib                     0x0063ea97 objc_exception_throw + 44
    2   CoreFoundation                      0x009b566d +[NSException raise:format:] + 141
    3   CoreFoundation                      0x00981813 mutateError + 259
    4   CoreFoundation                      0x009818c1 -[__NSCFString deleteCharactersInRange:] + 65
    5   Example App                         0x000e3785 -[ViewController printTernaryOfInt:] + 277
    6   Example App                         0x000e3645 -[ViewController placeOrder:] + 133
    7   libobjc.A.dylib                     0x006547cd -[NSObject performSelector:withObject:withObject:] + 84
    8   UIKit                               0x00d75a40 -[UIApplication sendAction:to:from:forEvent:] + 99
    9   UIKit                               0x00d759d2 -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 64
    10  UIKit                               0x00eb613a -[UIControl sendAction:to:forEvent:] + 69
    11  UIKit                               0x00eb6557 -[UIControl _sendActionsForEvents:withEvent:] + 598
    12  UIKit                               0x00eb57c1 -[UIControl touchesEnded:withEvent:] + 660
    13  UIKit                               0x00dcdcaa -[UIWindow _sendTouchesForEvent:] + 874
    14  UIKit                               0x00dce786 -[UIWindow sendEvent:] + 792
    15  UIKit                               0x00d8c681 -[UIApplication sendEvent:] + 242
    16  UIKit                               0x00d9cab8 _UIApplicationHandleEventFromQueueEvent + 21484
    17  UIKit                               0x00d702e7 _UIApplicationHandleEventQueue + 2300
    18  CoreFoundation                      0x008d706f __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
    19  CoreFoundation                      0x008ccb7d __CFRunLoopDoSources0 + 253
    20  CoreFoundation                      0x008cc0d8 __CFRunLoopRun + 952
    21  CoreFoundation                      0x008cba5b CFRunLoopRunSpecific + 443
    22  CoreFoundation                      0x008cb88b CFRunLoopRunInMode + 123
    23  GraphicsServices                    0x029e42c9 GSEventRunModal + 192
    24  GraphicsServices                    0x029e4106 GSEventRun + 104
    25  UIKit                               0x00d740b6 UIApplicationMain + 1526
    26  Example App                         0x000e3cfa main + 138
    27  libdyld.dylib                       0x02d76ac9 start + 1
    28  ???                                 0x00000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

1 дает это:

2015-07-11 05:06:02.360 Example App[41665:2134488]  1

2 дает это:

2015-07-11 05:06:07.613 Example App[41665:2134488]  1 ? 2 : 0

7 дает это:

2015-07-11 05:06:12.147 Example App[41665:2134488]  1 ? 2 ? 3 ? 4 ? 5 ? 6 ? 7 : 0 : 0 : 0 : 0 : 0 : 0

200 дает это:

2015-07-11 05:06:35.552 Example App[41665:2134488]  1 ? 2 ? 3 ? 4 ? 5 ? 6 ? 7 ? 8 ? 9 ? 10 ? 11 ? 12 ? 13 ? 14 ? 15 ? 16 ? 17 ? 18 ? 19 ? 20 ? 21 ? 22 ? 23 ? 24 ? 25 ? 26 ? 27 ? 28 ? 29 ? 30 ? 31 ? 32 ? 33 ? 34 ? 35 ? 36 ? 37 ? 38 ? 39 ? 40 ? 41 ? 42 ? 43 ? 44 ? 45 ? 46 ? 47 ? 48 ? 49 ? 50 ? 51 ? 52 ? 53 ? 54 ? 55 ? 56 ? 57 ? 58 ? 59 ? 60 ? 61 ? 62 ? 63 ? 64 ? 65 ? 66 ? 67 ? 68 ? 69 ? 70 ? 71 ? 72 ? 73 ? 74 ? 75 ? 76 ? 77 ? 78 ? 79 ? 80 ? 81 ? 82 ? 83 ? 84 ? 85 ? 86 ? 87 ? 88 ? 89 ? 90 ? 91 ? 92 ? 93 ? 94 ? 95 ? 96 ? 97 ? 98 ? 99 ? 100 ? 101 ? 102 ? 103 ? 104 ? 105 ? 106 ? 107 ? 108 ? 109 ? 110 ? 111 ? 112 ? 113 ? 114 ? 115 ? 116 ? 117 ? 118 ? 119 ? 120 ? 121 ? 122 ? 123 ? 124 ? 125 ? 126 ? 127 ? 128 ? 129 ? 130 ? 131 ? 132 ? 133 ? 134 ? 135 ? 136 ? 137 ? 138 ? 139 ? 140 ? 141 ? 142 ? 143 ? 144 ? 145 ? 146 ? 147 ? 148 ? 149 ? 150 ? 151 ? 152 ? 153 ? 154 ? 155 ? 156 ? 157 ? 158 ? 159 ? 160 ? 161 ? 162 ? 163 ? 164 ? 165 ? 166 ? 167 ? 168 ? 169 ? 170 ? 171 ? 172 ? 173 ? 174 ? 175 ? 176 ? 177 ? 178 ? 179 ? 180 ? 181 ? 182 ? 183 ? 184 ? 185 ? 186 ? 187 ? 188 ? 189 ? 190 ? 191 ? 192 ? 193 ? 194 ? 195 ? 196 ? 197 ? 198 ? 199 ? 200 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0

1

С, 84 78 байт

C, хотя он и не самый короткий, как функция:

i;f(n){while(++i<n)printf("%i ? ",i);printf("%i",n);while(--i)printf(" : 0");}

Во имя игры в гольф, то intспецификатор типа остается прочь i, fи nпотому что это по умолчанию. iможет быть неинициализирован, потому что это глобальная переменная и по умолчанию ноль. fне возвращает значение, но вызывает только предупреждение. printfэто не #includeд Чтобы запустить, вот полная версия программы:

#include <stdio.h>

i;f(n){while(++i<n)printf("%i ? ",i);printf("%i",n);while(--i)printf(" : 0");}

int main(int argc, char *argv[]){
    if(argc != 2){
        return 1;
    }
    f(atoi(argv[1]));
    puts("");
}

Вы можете сократить это, используя for(printf(...);--i;).
lirtosiast

1

C, 63 байта

Многоразовая функция, принимает n в качестве аргумента.

i;f(n){for(i=1;i<2*n;i++)printf(i-1?n/i?" ? %d":" : 0":"1",i);}

Разоблаченный и прокомментированный (довольно просто):

int f(int n) {
    int i;

    // 1 ... n, n+1 ... 2n-1
    for(i = 1; i < 2*n; i++) {
        // If i == 1, prints "1"
        // If i <= n, prints " ? %d", i (i = 2 ... n)
        // Else, prints " : 0" (i = n+1 ... 2n-1)
        printf(
            i-1 ?
                n/i ?
                    " ? %d" :
                    " : 0" :
                "1",
        i);
    }
}

1

Common Lisp, 84

(format t "~{~A ? ~}~@*~{~[~;~:;0~^ ? ~]~}" (loop for i from 1 to (read) collect i))

Во-первых, (loop for i from 1 to (read) collect i)генерируется список целых чисел от 1 до того, что вставлено, что используется в качестве единственного аргумента функции. Но настоящая магия этого в управляющей струне, которая похожа на шум линии. "~{~A ? ~}"перебирает весь список, сохраненный в первом аргументе, выводя каждое число с ?первой половиной. ~@*сбрасывает список аргументов к первому аргументу. ~{~[~;~:;0~^ ? ~]~}повторяет список, выводя 0 ?для каждого потребляемого аргумента, но ничего не выводя, если аргумент равен 0 или 1.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.