Der n-te Ternary

17

Ich definiere den n-ten Ternären als einen Ternären, der n zurückgibt und die folgende Form hat:

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

Schreiben Sie eine Funktion oder ein vollständiges Programm, das bei einer Eingabe von n das n-te Ternär ausgibt oder zurückgibt. Code-Golf.

Testfälle

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

Das 1000. Ternär Ich denke, es gibt eine Art Zen-Harmonie.

Caridorc
quelle
1
Darf Leerzeichen nachgestellt werden?
rink.attendant.6
@ Eisbahn nein, kein Trainingsraum
Caridorc
1
Da "ternär" 3 bedeutet, sollten Sie es nicht "n-ary" nennen, worauf es in der Mathematik bezogen ist?
mbomb007
4
Die Möglichkeit, einen Kommentar zu "bearbeiten", besteht darin, ihn zu löschen und einen neuen hinzuzufügen.
Reto Koradi
1
@RetoKoradi Sie können einen Kommentar bearbeiten, wenn er nicht länger als fünf Minuten nach seiner Veröffentlichung liegt.
mbomb007

Antworten:

8

Pyth - 19 18 17 Bytes

Die Räume töten mich und denken über eine bessere Art nach, mit ihnen umzugehen.

+j" ? "SQ*tQ" : 0

Es verbindet die Zahlen nur durch ein " ? "und verkettet dann den zweiten Teil weiter.

+              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

Probieren Sie es hier online aus .

Maltysen
quelle
10

CJam, 18 18 Bytes

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

Probieren Sie es online aus .

Erläuterung

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
quelle
12
Ich liebe das :).
Alex A.
9

Ruby, 31 Bytes

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

Prüfung:

> f[1]
=> "1"
> f[7]
=> "1 ? 2 ? 3 ? 4 ? 5 ? 6 ? 7 : 0 : 0 : 0 : 0 : 0 : 0"
daniero
quelle
2
Also array * string== array.join string... interessant
Caridorc
Das ist wirklich cool. Was passiert aus Neugier, wenn Sie es tun 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 Sowohl laut als auch unverständlich. Nett.
Alex A.
2
@ Daniero Warnung: Anti-String kann generiert werden
Caridorc
8

CJam, 19 Bytes

Nur ein Anfang ...

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

Wie es funktioniert

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. 

Probieren Sie es hier online aus

Optimierer
quelle
Verdammt, 1 Minute zu spät.
Dennis
3
wow du bist ziemlich schnell im codieren in Cjam: O
Caridorc
@ Tennis Ich denke, Ihre ursprüngliche Lösung, die mit der ersten Lösung von Optimizers identisch war, war tatsächlich die erste. Zumindest bin ich mir ziemlich sicher, dass es zuerst aufgetaucht ist. Ihre Beitragszeit wurde jedoch aktualisiert, als Sie sie innerhalb der Kulanzfrist bearbeiteten.
Reto Koradi
1
@ RetoKoradi seine Beitrags-ID ist 52870. Meins ist 52869 :)
Optimierer
Ah, ok, ich habe keine Berechtigung, gelöschte Beiträge auf dieser Site zu sehen. Beide müssen dann für mich gleichzeitig aufgetaucht sein, und ich habe nur den oberen bemerkt. Ich scheine mich zu erinnern, dass SE möglicherweise ein paar unkonventionelle Dinge tut, um Zeiten zu posten, in denen innerhalb der Kulanzfrist gearbeitet wird. Andernfalls können Sie einen leeren Platzhalter posten und den Inhalt innerhalb der Kulanzfrist ausfüllen, damit er so aussieht, als ob Sie die erste Antwort erhalten hätten. Er enthält von Anfang an nützliche Inhalte, da Änderungen innerhalb der Kulanzfrist nicht nachverfolgt werden.
Reto Koradi
6

Brainfuck, 305

(Ohne Eingabenummer von STDIN, siehe Bearbeiten unten)

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

Ich habe diesen schönen Algorithmus benutzt, um eine Zahl zu drucken, die 155 Bytes des gesamten Programms einnimmt.

Es funktioniert für Eingaben bis zu 32768 (16-Bit-Beschränkung des Algorithmus). Es erzeugt keine nachgestellten Leerzeichen und funktioniert auch für Eingaben 1:

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

Kurzanleitung:

Setup (97 Byte)

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

Erster Teil (181 Bytes)

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

Zweiter Teil (27 Bytes)

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

Wenn es erlaubt wäre, die 8 Brainfuck-Befehle auf 3 Bits abzubilden, würde dieses Programm 114 Bytes und weitere 3 Bits belegen

Unär, ~ 4,08 * 10 ^ 275 Bytes

Es wäre hier zu lang sein, aber es ist nur 408452257862560239329948606295286361112603208650130608525040044700379331457759667646985586658469601803889628246410788572492437928714867190270708935427798983714797786123292750743771225096145575210320040188155473030775033228313350778616384531426430459309802833775612506568528463 Nullen und funktioniert genauso wie das Programm Brainfuck.

EDIT : Ich habe es vermasselt, dieses Programm nimmt keine Benutzereingaben wirklich, es verwendet nur den aktuellen Zeigerwert als Eingabe. Um eine Zahl analysieren zu können, wäre viel mehr erforderlich, und das kann ich mir nicht leisten.

Es funktioniert also mit einem Wert, der direkt in das Programm eingegeben wurde (indem n-mal "+" vor dem Programm angehängt wird), nicht jedoch mit STDIN

Kametrixom
quelle
5

JavaScript (ES6), 42 bis 39 Byte

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

Die äußere Funktion fübernimmt den Eingabewert und ruft dann die innere Funktion grekursiv auf, um die Zeichenfolge von der Mitte aus aufzubauen. Dabei wird der Eingabewert als Maximum zum Testen des Basisfalls verwendet.

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);
}
Apsillers
quelle
4

Python 56 55

t=lambda n:' ? '.join(map(str,range(1,n+1)))+' : 0'*~-n
Caridorc
quelle
4

C # - 76

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

Haskell, 53 Bytes

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

So funktioniert es: Erstellen Sie die Zeichenfolge von innen nach außen, indem Sie mit einer leeren Zeichenfolge beginnen und von nunten nach unten eine Schleife 2ausführen , wobei Sie der aktuellen Zahl und einem voranstellen und einem ?anhängen : 0. Endlich ein 1vor allem setzen.

Ein anderer Ansatz (dank @Mauris jetzt 9 Bytes kürzer):

Haskell, 60 51 Bytes

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

Wie es funktioniert: ein Literal 1gefolgt von ? <x>für jedes <x>In [2..n]gefolgt von einer Konstante : 0für jedes <x>In [2..n].

nimi
quelle
Ein Ansatz, der auf Ihren 60 Bytes basiert und 51 g n='1':((=<<[2..n])=<<[(" ? "++).show,\x->" : 0"])
Lynn,
Eigentlich können Sie es bis zu 51 weitere direkt durch nur Ersatz (\_->" : 0")=<<[2..n]mit[2..n]>>" : 0"
Lynn
3

Pyth, 17 Bytes

jd.iSQs*RtQ,\?":0

Demonstration.

isaacg
quelle
3

Julia, 44 31 Bytes

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

Dadurch wird eine unbenannte Funktion erstellt, die eine Ganzzahl als Eingabe akzeptiert und eine Zeichenfolge zurückgibt. Um es zu nennen, geben Sie ihm einen Namen, zf=n->... .

Zuerst fügen wir die ganzen Zahlen 1 bis n zusammen und trennen jedes mit ?und Leerzeichen in einer einzelnen Zeichenkette. Dann hängen wir die Zeichenkette an, die n" : 0" wiederholt 1-mal .

Beispiele:

julia> f(1)
"1"

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

julia> f(0)
can't repeat a string -1 times
Alex A.
quelle
2

JavaScript ES7, 62 Byte

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

Ich weiß nicht, ob ich mehr Golf spielen kann. Aber es ist eine ziemlich einfache Lösung

Nur Firefox:

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

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

ES5-Äquivalent:

// 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
quelle
2

CoffeeScript, 52 Bytes

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

Erläuterung

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
rink.attendant.6
quelle
2

SWI-Prolog, 90 Bytes

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

Auf jeden Fall nicht gewinnen, aber die \+ (between(1,TopBound,N),\+do_something(N))Konstruktion ist ziemlich interessant, um etwas auf einer Folge von ganzen Zahlen zu wiederholen.

Tödlich
quelle
2

Swift 145 (135 ohne Leerzeichen)

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

Können Sie glauben, dass der Teil der Teilzeichenfolge tatsächlich länger ist als der Teil, der den Ausdruck erzeugt?

Ben Lu
quelle
1
Ich muss Swift <3 lieben, aber ich wünsche mir wirklich, dass sie es schaffen, damit Sie auf Strings mit Integer-Indizes wie str[1]oder zugreifen können str[0...5]. Natürlich können Sie eine kleine Erweiterung vornehmen, aber ich wünschte, die Standardbibliothek hätte dies aktiviert
Kametrixom
@Kametrixom apple hat dies in der ersten Beta einmal erlaubt, aber die verschiedenen Unicode-Codierungen hindern Sie daran. Dies liegt hauptsächlich daran, dass einige Symbole zwei oder mehr Bytes lang sind und andere nicht. Daher kann nicht garantiert werden, dass dasselbe Zeichen in verschiedenen Codierungen mit demselben Index abgerufen wird. Meine Beschreibung mag nicht genau sein, aber das ist im Grunde der Grund, warum Apple die hässliche mundgerechte String-Index-Syntax eingeführt hat.
Ben Lu
In letzter Zeit habe ich mich richtig an Swift für Code
Golfing gewöhnt.
2

Perl, 36 Bytes

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

35Zeichen +1für-n .

Laufen mit:

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

Java, 71

Ich konnte mir nicht helfen, nachdem ich die Antwort von RCB kommentiert hatte . Also hier ist ein weiteres Java (71 wie wow, wenn Java nicht das längste ist!)

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

Java, 125 88 Bytes

Original

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

Mit schönerer Formatierung und Variablennamen:

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

Verbessert - Dank Jack Ammos Kommentaren unten:

String f(int n){String s="",e=s;for(int i=1;i<n;){s+=i+++" ? ";e+=" : 0";}return s+n+e;}
RCB
quelle
1
Sie brauchen diesen Triadenoperator nicht, um an e anzuhängen, nur um das Leerzeichen zu berücksichtigen. Nehmen Sie einfach an, Sie brauchen immer das Leerzeichen vor dem Doppelpunkt e+=" : 0";. Sie können dann 1 Byte speichern, indem Sie i nachträglich erhöhen, wenn es anstelle der forloop-Zeile verwendet wird. In for(int i=1;i<n;){s+=i+++" ? ";Ihrer return-Anweisung wird der nach n hinzugefügte Speicherplatz nicht mehr benötigt return s+n+e;. Sie können auch 1 Byte speichern, indem Sie verwenden e=s. Außerdem ist die if-Anweisung am Anfang nicht erforderlich, da die for-Schleifenlogik dieses Ergebnis sowieso garantiert.
Jack Ammo
@ JackAmmo Ausgezeichnete Tipps, danke! Die if-Anweisung war erforderlich, um nachgestellte Leerzeichen zu vermeiden, jedoch nicht mehr, nachdem Sie die for-Schleifenlogik verbessert haben. Ich habe die Änderungen übernommen und deine Antwort positiv bewertet.
RCB
1

JavaScript (ES6), 59 Byte

Der gleiche Ansatz wie bei meiner CoffeeScript-Antwort. String.prototype.repeatkostet zu viele Zeichen.

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

Demo

Firefox erstmal, da es sich um ES6 handelt.

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

rink.attendant.6
quelle
1

K, 36 Bytes

{(3_,/(" ? ",)'$!x),(4*-1+x)#" : 0"}
kirbyfan64sos
quelle
1

Python 2, 63 60 58 56

Probieren Sie es hier aus

Einfache Lösung: (63)

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

Edit : Ich wollte unbedingt eine rekursive Funktion ausprobieren. Hier ist es: (56)

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

Edit : Weiß jemand, warum das nicht funktioniert? Ich habe versucht, eine Liste mit einem Index von zu erstellen c<n, aber das hat aufgrund eines Stapelüberlauffehlers nicht funktioniert. Dasselbe mit diesem:

f=lambda n,c=1:`c`+((c<n)*(' ? '+f(n,c+1))or~-n*' : 0')
mbomb007
quelle
Der Index funktioniert nicht, da er eine Liste mit der bewerteten Funktion erstellen muss (die offensichtlich für immer laufen würde). Dasselbe passiert mit Ihrer Multiplikation, sie muss die Funktion immer noch auswerten, obwohl sie dies tut 0*.
FryAmTheEggman
@FryAmTheEggman Okay, danke. Ich habe noch nie zuvor eine solche Situation erlebt.
mbomb007
1

rs , 77 bytes

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

Live-Demo und Testfälle.

Erläuterung:

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

Erweitern Sie die Zahl in eine Reihe von N Unterstrichen.

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

Erstellen Sie wiederholt einen Bereich von Unterstrichen, die durch Leerzeichen getrennt sind. Dies würde zB ___zu _ __ ___.

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

An den letzten Satz von Unterstrichen (mit der Länge N) N-1 Instanzen von anhängen : 0 .

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

Ersetzen Sie jede Gruppe von Unterstrichen durch ihre Länge ?, gefolgt von EXCEPT für die erste.

^./1

Ersetzen Sie die erste durch die Nummer 1.

Aufgrund des Formats funktioniert dies auch 0gut: Es wird nur die leere Zeichenfolge gedruckt.

kirbyfan64sos
quelle
1

Swift, 79 75 Bytes

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

fwird implizit als Funktion mit einem IntParameter deklariert, der a zurückgibtString

Arbeitet mit n >= 1 und stürzt zur Laufzeit ab, wenn n == 0. Es gibt keine nachgestellten Leerzeichen

Bearbeiten: 2 * 2 Zeichen konnten entfernt werden, da die String-Interpolation nicht immer die kürzeste ist

Hinweis zum Bearbeiten: Das Kompilieren dieses Codes dauert ewig (es hört nicht auf), aber es würde definitiv dauern, wenn der Compiler damit umgehen könnte. Schauen Sie sich die Version vor dieser Bearbeitung an, um eine zu erhalten, die kompiliert werden kann

Kametrixom
quelle
1

> <> , 32 + 3 = 35 Bytes

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

Beachten Sie, dass die zweite Zeile ein Leerzeichen enthält. Die +3 ist für die -vFlagge, zB wie ausgeführt

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

Eingabe als Codepunkt übernehmen wie

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

ist 34 Bytes, aber ich bevorzuge die obige Version, da es einfacher zu testen ist und es sowieso nicht gewinnen wird.

Erläuterung

Es gibt einiges an Pseudo-Rekursion und Missbrauch, schauen wir uns das an.

Die erste Zeile druckt das "1 ? 2 ? ... n-1 ? " Teil. Der Stack beginnt ndank des -vFlags nur mit der Eingabe , und wir tun Folgendes:

: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

> <> ist toroidal, daher wird der obige Befehl in einer Schleife ausgeführt, bis der Stapel noben aus n-1Nullen besteht und sich an diesem Punkt zur zweiten Zeile bewegt.

Wenn die zweite Zeile zum ersten Mal ausgeführt wird, wird der nBefehl ausgeführt und noben im Stapel gedruckt . Dies lässt nur die n-1Nullen und wir machen das Folgende, ebenfalls in einer Schleife:

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
quelle
" ? "ooo Drucken Sie die Rückseite von "?" (Aber hey, Palindrome) ist das Drucken der Rückseite kürzer als das Drucken der tatsächlichen Zeichenfolge?
Caridorc
@Caridorc Ja, weil> <> nur char-by-char drucken kann, indem Sie von einem Stapel
abspringen
sp3000 gut zu wissen.
Caridorc
1

Scala, 78 71 52 50 Bytes

def f(n:Int)=(1 to n).mkString(" ? ")+" : 0"*(n-1)
user42083
quelle
1

Objective-C, 346 Bytes

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

Wenn Sie 0für das intoder etwas Negatives eintreten, wird ein Ergebnis NSRangeExceptionaufgrund des outStringInhalts ausgelöstnil . Dies sollte unter iOS 2.0 und höher und vielen der neuesten Versionen von Mac OS X ausgeführt werden.

Eine Aufschlüsselung des Codes:

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

Standardfunktionsdeklaration in Objective-C.

NSMutableString *outString=@"".mutableCopy;

Erzeugt einen String, zu dem die Ausgabe gehen soll outString, und macht ihn veränderbar. (Mit anderen Worten, es kann gelesen und geschrieben werden.

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

Fügt den ersten Teil der Zeichenfolge zur Ausgabe hinzu.

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

Bereinigt den Anfang der Zeichenfolge, um sicherzustellen, dass er ? 1durch ersetzt wird 1. Hinweis: Wenn 0angegeben, tritt an dieser Stelle das NSRangeExceptionauf, da kein Index vorhanden ist 1.

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

Fügt der Zeichenfolge den zweiten Teil der Zeichenfolge hinzu.

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

Spuckt den String mit wieder aus NSLogund beendet die Funktion.

Ausgabe:

Die Eingabe 0ergibt folgendes Absturzprotokoll :

    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 gibt dies:

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

2 gibt dies:

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

7 gibt dies:

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 gibt dies:

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
quelle
1

C 84 78 Bytes

C, obwohl es nicht das kürzeste ist, als Funktion:

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

Im Namen des Golf, der intist Typspezifizierer links weg von i, fund nweil es ist die Standardeinstellung. ikann nicht initialisiert werden, da es sich um eine globale Variable handelt, die standardmäßig Null ist. fgibt keinen Wert zurück, aber das verursacht nur eine Warnung. printfist nicht #include'd. Zum Ausführen ist hier eine vollständige Programmversion:

#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
quelle
Sie können dies möglicherweise mit verkürzen for(printf(...);--i;).
Lirtosiast
1

C 63 Bytes

Wiederverwendbare Funktion, nimmt n als Argument.

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

Ungolfed und kommentiert (ziemlich unkompliziert):

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
quelle
1

Common Lisp, 84

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

Zuerst, (loop for i from 1 to (read) collect i) erzeugt eine Liste von ganzen Zahlen von 1 bis was in gesetzt wird, die als einziges Argument für die Funktion verwendet wird. Die wahre Magie liegt jedoch in der Steuerzeichenfolge, die wie Linienrauschen aussieht. "~{~A ? ~}"Durchläuft die gesamte Liste, die im ersten Argument gespeichert ist, und gibt jede Zahl mit der ?für die erste Hälfte aus. ~@*Setzt die Argumentliste auf das erste Argument zurück. ~{~[~;~:;0~^ ? ~]~}wiederholt die Liste und gibt sie aus0 ? für jedes verbrauchte Argument aus, gibt aber nichts aus, wenn das Argument 0 oder 1 ist.

Kerzen
quelle