N-ty trójka

17

Zdefiniowałem n-ty trójskładnik jako trójskładnik, który zwraca n i ma postać:

1 ? 2 ? 3 ? n - 1 ? n : 0 : 0 : 0  # n - 1 zeroes

Napisz funkcję lub pełny program, który otrzyma dane wejściowe n, wyświetli lub zwróci n-tą trójkę. Code-Golf.

Przypadki testowe

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

Tysiącletnia, jak sądzę, harmonia zen.

Caridorc
źródło
1
Czy dozwolone są końcowe białe znaki?
rink.attendant. 6
@ lodowisko nie, brak miejsca na trening
Caridorc
1
Skoro „trójskładnik” oznacza 3, czyż nie powinieneś nazywać go „n-ary”, o czym mówi matematyka?
mbomb007,
4
Sposób „edycji” komentarza: usuń go i dodaj nowy.
Reto Koradi,
1
@RetoKoradi Możesz edytować komentarz, jeśli jest on w ciągu pięciu minut od opublikowania.
mbomb007

Odpowiedzi:

8

Pyth - 19 18 17 bajtów

Przestrzenie mnie zabijają, myśląc o lepszym sposobie radzenia sobie z nimi.

+j" ? "SQ*tQ" : 0

Po prostu łączy liczby przez a, " ? "a następnie łączy drugą część.

+              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

Wypróbuj online tutaj .

Maltysen
źródło
10

CJam, 18 18 bajtów

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

Wypróbuj online .

Wyjaśnienie

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.
jimmy23013
źródło
12
Kocham :).
Alex A.,
9

Ruby, 31 bajtów

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

Test:

> f[1]
=> "1"
> f[7]
=> "1 ? 2 ? 3 ? 4 ? 5 ? 6 ? 7 : 0 : 0 : 0 : 0 : 0 : 0"
daniero
źródło
2
Więc array * string== array.join string... ciekawe
Caridorc
To jest naprawdę fajne. Z ciekawości, co się dzieje, kiedy to robisz f[0]?
Alex A.,
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 Zarówno głośny, jak i niezrozumiały. Ładny.
Alex A.,
2
@daniero Ostrzeżenie: anty-string może być generowany
Caridorc
8

CJam, 19 bajtów

To dopiero początek ...

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

Jak to działa

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. 

Wypróbuj online tutaj

Optymalizator
źródło
Cholera, 1 minuta za późno.
Dennis,
3
wow, jesteś dość szybki w kodowaniu w Cjam: O
Caridorc
@Dennis Myślę, że twoje początkowe rozwiązanie, które było identyczne z pierwszym rozwiązaniem Optimizer, było właściwie pierwsze. Przynajmniej jestem pewien, że zobaczyłem, jak wyskakuje pierwszy. Ale twój czas postu został zaktualizowany, gdy edytowałeś go w okresie karencji.
Reto Koradi,
1
@RetoKoradi jego identyfikator postu to 52870. Mój to 52869 :)
Optymalizator
Ach, ok, nie mam uprawnień do wyświetlania usuniętych postów na tej stronie. Oba musiały wtedy wyskoczyć dla mnie w tym samym czasie i zauważyłem tylko ten pierwszy. Wydaje mi się, że pamiętam, że SE może robić fajne rzeczy, aby publikować czasy podczas edycji w okresie karencji. W przeciwnym razie możesz opublikować pusty symbol zastępczy i wypełnić treść w okresie karencji, aby wyglądać, jakbyś miał pierwszą odpowiedź, i tak naprawdę zawierał użyteczną treść od samego początku, ponieważ zmiany w okresie karencji nie są śledzone.
Reto Koradi,
6

Brainfuck, 305

(Bez numeru wejściowego z STDIN, patrz edycja u dołu)

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

Użyłem tego pięknego algorytmu do wydrukowania liczby, która zajmuje 155 bajtów całego programu.

Działa dla danych wejściowych do 32768 (16-bitowe ograniczenie algorytmu). Nie tworzy spacji końcowych i działa 1również jako dane wejściowe :

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

Szybkie przejście:

Konfiguracja (97 bajtów)

-                                 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)

Pierwsza część (181 bajtów)

>>>+.-<<<                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

Druga część (27 bajtów)

>>-----<<<        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"
]

Gdyby można było zamapować 8 poleceń Brainfuck na 3 bity, program ten zająłby 114 bajtów i kolejne 3 bity

Unary, ~ 4,08 * 10 ^ 275 bajtów

Byłoby to zbyt długo, ale to jest po prostu 408452257862560239329948606295286361112603208650130608525040044700379331457759667646985586658469601803889628246410788572492437928714867190270708935427798983714797786123292750743771225096145575210320040188155473030775033228313350778616384531426430459309802833775612506568528463 zer i działa tak samo jak program brainfuck.

EDYTOWAĆ : Pomieszałem, ten program tak naprawdę nie pobiera danych od użytkownika, po prostu używa bieżącej wartości wskaźnika jako danych wejściowych. Aby móc przeanalizować liczbę, byłoby o wiele więcej i nie mogę się tym martwić.

Działa więc z wartością wprowadzoną bezpośrednio do programu (dodając n razy „+” przed programem), ale nie z STDIN

Kametrixom
źródło
5

JavaScript (ES6), 42 39 bajtów

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

Funkcja zewnętrzna fpobiera wartość wejściową, a następnie wywołuje grekurencyjnie funkcję wewnętrzną, aby zbudować łańcuch od środka, używając wartości wejściowej jako wartości maksymalnej w celu przetestowania przypadku podstawowego.

Nie golfowany:

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);
}
apsillery
źródło
4

Python 56 55

t=lambda n:' ? '.join(map(str,range(1,n+1)))+' : 0'*~-n
Caridorc
źródło
4

C # - 76

Func<int,string>F=k=>{var r="";for(;k>1;)r=" ? "+k--+r+" : 0";return"1"+r;};
Brandon
źródło
3

Haskell, 53 bajty

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

Jak to działa: zbuduj ciąg od wewnątrz na zewnątrz, zaczynając od pustego ciągu i przechodząc od ndołu do 2góry, przygotowując bieżącą liczbę i a ?oraz dodając a : 0. Wreszcie postaw na 1pierwszy plan.

Inne podejście (dzięki @Mauris jest teraz o 9 bajtów krótszy):

Haskell, 60 51 bajtów

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

Jak to działa: literał, 1po którym następuje ? <x>dla każdego <x>w, [2..n]a następnie stała : 0dla każdego <x>w [2..n].

nimi
źródło
Podejście oparte na twoich 60 bajtach, które spadają do 51:g n='1':((=<<[2..n])=<<[(" ? "++).show,\x->" : 0"])
Lynn
Faktycznie, można je dostać w dół do 51 bardziej bezpośrednio tylko zastępując (\_->" : 0")=<<[2..n]z[2..n]>>" : 0"
Lynn
3

Pyth, 17 bajtów

jd.iSQs*RtQ,\?":0

Demonstracja.

isaacg
źródło
3

Julia, 44 31 bajtów

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

Tworzy to nienazwaną funkcję, która przyjmuje liczbę całkowitą jako dane wejściowe i zwraca ciąg znaków. Aby to nazwać, nadaj mu nazwę, np f=n->....

Najpierw łączymy liczby całkowite od 1 do n , oddzielając każdy ?znak spacji i jeden ciąg. Następnie dołączamy do tego ciąg " : 0"powtórzony n -1 razy.

Przykłady:

julia> f(1)
"1"

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

julia> f(0)
can't repeat a string -1 times
Alex A.
źródło
2

JavaScript ES7, 62 bajty

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

Nie wiem, czy mogę bardziej grać w golfa. Ale to dość proste rozwiązanie

Tylko Firefox:

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

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

Odpowiednik 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: ')))

Downgoat
źródło
2

CoffeeScript, 52 bajty

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

Wyjaśnienie

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
lodowisko. dozorca 6
źródło
2

SWI-Prolog, 90 bajtów

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

Na pewno nie wygra, ale \+ (between(1,TopBound,N),\+do_something(N))konstrukcja jest całkiem interesująca, aby powtórzyć coś na sekwencji liczb całkowitych.

Fatalizować
źródło
2

Swift 145 (135 bez białych znaków)

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

Czy możesz uwierzyć, że część podciągów jest w rzeczywistości dłuższa niż część do wytworzenia wyrażenia.

Ben Lu
źródło
1
Uwielbiam Swift <3 Naprawdę chciałbym, aby zrobili to, abyś mógł uzyskać dostęp do Ciągów z indeksami całkowitymi, takimi jak str[1]lub str[0...5]. Oczywiście możesz zrobić małe rozszerzenie, ale chciałbym, żeby standardowa biblioteka
włączyła
@Kametrixom jabłko kiedyś pozwoliło na to w pierwszej wersji beta, ale różne kodowania Unicode uniemożliwiają to. Jest tak głównie dlatego, że niektóre symbole mają dwa bajty lub więcej, a niektóre nie. Dlatego nie ma gwarancji, aby pobrać ten sam znak w różnych kodowaniach z tym samym indeksem. Mój opis może być niedokładny, ale właśnie dlatego jabłko wprowadziło brzydką składnię indeksu ciągów znaków.
Ben Lu
Ostatnio naprawdę przyzwyczaiłem się do używania Swift do gry w golfa kodu, spójrz na moją odpowiedź Swift
Kametrixom
2

Perl, 36 bajtów

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

35znaki +1dla -n.

Biegnij z:

echo 10 | perl -nE'say join(" ? ",1..$_)." : 0"x($_-1)'
hmatt1
źródło
2

Java, 71

Nie mogłem się powstrzymać po skomentowaniu odpowiedzi RCB . Oto kolejna Java (71 jak wow, kiedy Java nie jest najdłuższa!)

String t(int n){String s=""+n;for(;--n>0;)s=n+" ? "+s+" : 0";return s;}
Jack Ammo
źródło
2

Jawa, 125 88 bajtów

Oryginalny

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;}

Z ładniejszym formatowaniem i nazwami zmiennych:

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;
}

Ulepszony - dzięki komentarzom Jacka Ammo poniżej:

String f(int n){String s="",e=s;for(int i=1;i<n;){s+=i+++" ? ";e+=" : 0";}return s+n+e;}
RCB
źródło
1
nie potrzebujesz tego operatora triadycznego do dołączania do e tylko po to, aby uwzględnić przestrzeń, po prostu załóż, że zawsze potrzebujesz przestrzeni przed okrężnicą e+=" : 0";. Następnie możesz zapisać 1 bajt, zwiększając po i, gdy jest używany zamiast w linii forloop. for(int i=1;i<n;){s+=i+++" ? ";Twoja instrukcja return nie będzie już wymagała dodawania spacji po n return s+n+e;. Możesz także zapisać 1 bajt, używając e=s. Ponadto instrukcja if na początku nie jest konieczna, ponieważ logika pętli for i tak gwarantuje ten wynik.
Jack Ammo
@JackAmmo Doskonałe wskazówki, dzięki! Instrukcja if była konieczna, aby uniknąć spacji końcowych, ale już nie po ulepszeniach logiki pętli for. Wprowadziłem zmiany i głosowałem za odpowiedzią.
RCB
1

JavaScript (ES6), 59 bajtów

Takie samo podejście jak w mojej odpowiedzi CoffeeScript, przy pomocy ciągów szablonów. String.prototype.repeatkosztuje zbyt wiele postaci.

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

Próbny

Firefox tylko na razie, ponieważ jest to 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));

lodowisko. dozorca 6
źródło
1

K, 36 bajtów

{(3_,/(" ? ",)'$!x),(4*-1+x)#" : 0"}
kirbyfan64sos
źródło
1

Python 2, 63 60 58 56

Wypróbuj tutaj

Łatwe rozwiązanie: (63)

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

Edycja : Naprawdę chciałem wypróbować funkcję rekurencyjną. Oto on: (56)

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

Edycja : Czy ktoś wie, dlaczego to nie działa? Próbowałem listy z indeksem c<n, ale to nie działało z powodu błędu przepełnienia stosu. To samo z tym:

f=lambda n,c=1:`c`+((c<n)*(' ? '+f(n,c+1))or~-n*' : 0')
mbomb007
źródło
Indeks nie działa, ponieważ musi utworzyć listę zawierającą ocenianą funkcję (która oczywiście działałaby wiecznie). To samo dzieje się z mnożeniem - nadal musi oceniać funkcję, nawet jeśli to robi 0*.
FryAmTheEggman
@FryAmTheEggman W porządku, dzięki. Nigdy wcześniej nie miałem takiej sytuacji.
mbomb007,
1

rs , 77 bajtów

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

Prezentacje na żywo i przypadki testowe.

Wyjaśnienie:

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

Rozwiń liczbę na serię N znaków podkreślenia.

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

Wielokrotnie twórz zakres podkreśleń oddzielonych spacjami. Ten przykład okaże ___się _ __ ___.

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

Dołącz do ostatniego zestawu znaków podkreślenia (o długości N) N-1 : 0.

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

Zastąp każdą grupę znaków podkreślenia ich długością, poprzedzoną przez ?, Z WYJĄTKIEM pierwszej.

^./1

Zastąp pierwszy z numerem 1.

Ze względu na format to również 0dobrze się obsługuje : po prostu drukuje pusty ciąg.

kirbyfan64sos
źródło
1

Szybki, 79 75 bajtów

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

fjest niejawnie zadeklarowany jako funkcja z jednym Intparametrem, który zwraca aString

Działa z n >= 1i ulega awarii w czasie wykonywania, gdy n == 0. Brak końcowych białych znaków

Edycja: Udało się usunąć 2 * 2 znaki, ponieważ interpolacja ciągów znaków nie zawsze jest najkrótsza

Uwaga do edycji: Ten kod trwa wieczność (nie zatrzymuje się) do kompilacji, ale na pewno tak by było, gdyby kompilator był w stanie go obsłużyć. Spójrz na wersję przed tą edycją, aby uzyskać kompilację

Kametrixom
źródło
1

> <> , 32 + 3 = 35 bajtów

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

Zauważ, że w drugim wierszu jest spacja. +3 oznacza -vflagę, np. Działa jak

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

Przyjmowanie danych wejściowych jako punktu kodowego, takiego jak

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

ma 34 bajty, ale wolę powyższą wersję, ponieważ łatwiej jest ją przetestować i i tak nie wygra.

Wyjaśnienie

Trwa pseudo-rekurencja i nadużycia, więc spójrzmy.

Pierwszy wiersz drukuje "1 ? 2 ? ... n-1 ? " część. Stos zaczyna się od samego wejścia n, dzięki -vflagi, i wykonujemy następujące czynności:

: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

> <> jest toroidalne, więc powyższe wykonuje się w pętli, dopóki stos nie będzie składał się z ngóry z n-1zerami poniżej, w tym momencie przechodzi do drugiej linii.

Przy pierwszym uruchomieniu drugiego wiersza ninstrukcja jest uruchamiana, drukując nna górze stosu. Pozostawia to tylko n-1zera i wykonujemy następujące czynności, również w pętli:

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
Sp3000
źródło
" ? "ooo Drukuj odwrotność „?” (Ale hej, palindromy) czy wydrukowanie odwrotności jest krótsze niż wydrukowanie samego ciągu?
Caridorc,
@Caridorc Tak, ponieważ> <> może drukować char-by-char tylko przez wyskakiwanie ze stosu :)
Sp3000
sp3000 miło wiedzieć.
Caridorc,
1

Scala, 78 71 52 50 bajtów

def f(n:Int)=(1 to n).mkString(" ? ")+" : 0"*(n-1)
użytkownik42083
źródło
1

Cel C, 346 bajtów

-(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);}

Obstawianie 0za intcoś lub coś negatywnego podnosi z NSRangeExceptionpowodu outStringpowstrzymywania nil. Powinno to działać na iOS 2.0 i nowszych oraz wielu najnowszych wersjach Mac OS X.

Podział kodu:

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

Deklaracja funkcji standardowej w celu C.

NSMutableString *outString=@"".mutableCopy;

Tworzy ciąg, do którego dane wyjściowe mają się udać outString, i umożliwia ich modyfikowanie. (Innymi słowy, można go odczytać i zapisać.

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

Dodaje pierwszą część ciągu do wyniku.

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

Czyści początek łańcucha, aby upewnić się, że ? 1jest zastąpiony przez 1. Uwaga: jeśli 0podano, to tutaj NSRangeExceptionwystąpiłoby to z powodu braku indeksu 1.

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

Dodaje drugą część łańcucha do łańcucha.

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

Wyrzuca ciąg z powrotem za pomocą NSLogi zamyka funkcję.

Wynik:

Wprowadzenie 0daje następujący dziennik awarii:

    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 daje to:

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

2 daje to:

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

7 daje to:

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 daje to:

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
DDPWNAGE
źródło
1

C, 84 78 bajtów

C, mimo że nie jest najkrótszy, jako funkcja:

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

W imię golfa The intspecyfikacja typu jest pozostawione off i, fi ndlatego, że jest to ustawienie domyślne. imoże być niezainicjowany, ponieważ jest zmienną globalną i domyślnie wynosi zero. fnie zwraca wartości, ale powoduje to tylko ostrzeżenie. printfnie jest #include„d. Aby uruchomić, oto pełna wersja programu:

#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("");
}
hacatu
źródło
Możesz to skrócić, używając for(printf(...);--i;).
lirtosiast
1

C, 63 bajty

Funkcja wielokrotnego użytku, przyjmuje n jako argument.

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

Nie golfił i skomentował (całkiem prosto):

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);
    }
}
Andrea Biondo
źródło
1

Common Lisp, 84

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

Najpierw (loop for i from 1 to (read) collect i)generuje listę liczb całkowitych od 1 do wszystkiego, co jest wstawiane, co jest używane jako jedyny argument funkcji. Ale prawdziwą magią tego jest łańcuch kontrolny, który wygląda jak szum linii. "~{~A ? ~}"iteruje całą listę przechowywaną w pierwszym argumencie, wypisując każdą liczbę z wartością ?dla pierwszej połowy. ~@*resetuje listę argumentów do pierwszego argumentu. ~{~[~;~:;0~^ ? ~]~}powtarza nad listą, wypisując 0 ?dla każdego zużytego argumentu, ale wypisując nic, jeśli argument ma wartość 0 lub 1.

Świece
źródło