Ternary ke-n

17

Saya mendefinisikan terary ke-n sebagai terner yang mengembalikan n dan memiliki bentuk:

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

Tulis fungsi atau program lengkap yang diberi input n akan menampilkan atau mengembalikan ternary ke-n. Kode-Golf.

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

Terner 1000-th saya pikir ada semacam harmoni zen untuk itu.

Caridorc
sumber
1
Apakah trailing whitespace diizinkan?
rink.attendant.6
@minuman tidak, tidak ada ruang pelatihan
Caridorc
1
Karena "ternary" berarti 3, bukankah seharusnya Anda menamainya "n-ary", yang disebut dalam matematika?
mbomb007
4
Cara untuk "mengedit" komentar adalah: hapus, dan tambahkan yang baru.
Reto Koradi
1
@RetoKoradi Anda dapat mengedit komentar jika dalam waktu lima menit setelah mempostingnya.
mbomb007

Jawaban:

8

Pyth - 19 18 17 bytes

Ruang-ruang itu membunuhku, memikirkan cara yang lebih baik untuk menanganinya.

+j" ? "SQ*tQ" : 0

Itu hanya bergabung dengan angka-angka " ? "dan kemudian menyatukan bagian kedua.

+              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

Cobalah online di sini .

Maltysen
sumber
10

CJam, 18 18 byte

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

Cobalah online .

Penjelasan

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
sumber
12
Saya suka itu :).
Alex A.
9

Ruby, 31 byte

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

Uji:

> f[1]
=> "1"
> f[7]
=> "1 ? 2 ? 3 ? 4 ? 5 ? 6 ? 7 : 0 : 0 : 0 : 0 : 0 : 0"
daniero
sumber
2
Jadi array * string== array.join string... menarik
Caridorc
Ini sangat keren. Karena penasaran, apa yang terjadi ketika Anda melakukannya 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 Baik keras dan tidak dapat dipahami. Bagus.
Alex A.
2
@daniero Peringatan: anti-string dapat dihasilkan
Caridorc
8

CJam, 19 byte

Hanya permulaan ...

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

Bagaimana itu bekerja

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. 

Cobalah online di sini

Pengoptimal
sumber
Heck, terlambat 1 menit.
Dennis
3
wow Anda cukup cepat dalam coding di Cjam: O
Caridorc
@ Dennis Saya pikir solusi awal Anda, yang identik dengan solusi pertama Pengoptimal, sebenarnya yang pertama. Setidaknya saya cukup yakin bahwa saya melihatnya muncul pertama kali. Tetapi waktu posting Anda diperbarui ketika Anda mengeditnya dalam masa tenggang.
Reto Koradi
1
@RetoKoradi id posnya adalah 52870. Tambang 52869 :)
Pengoptimal
Ah, baiklah, saya tidak memiliki izin untuk melihat posting yang dihapus di situs ini. Keduanya pasti muncul pada saat yang sama untuk saya, dan saya hanya memperhatikan yang teratas. Sepertinya saya ingat bahwa SE mungkin melakukan beberapa hal yang funky untuk memposting waktu saat mengedit dalam masa tenggang. Kalau tidak, Anda dapat memposting tempat tempat kosong, dan mengisi konten dalam masa tenggang, agar terlihat seperti Anda memiliki jawaban pertama, dan itu sebenarnya berisi konten yang bermanfaat sejak awal karena pengeditan dalam masa tenggang tidak dilacak.
Reto Koradi
6

Brainfuck, 305

(Tanpa nomor input dari STDIN, lihat edit di bagian bawah)

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

Saya menggunakan ini algoritma yang indah untuk mencetak angka, yang membutuhkan 155 byte dari keseluruhan program.

Ini berfungsi untuk input hingga 32768 (batasan algoritma 16-bit). Itu tidak menghasilkan spasi tambahan dan juga berfungsi untuk input 1:

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

Jalan cepat:

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

Bagian pertama (181 byte)

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

Bagian kedua (27 byte)

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

Jika diizinkan untuk memetakan 8 perintah Brainfuck menjadi 3 bit, maka program ini akan memakan waktu 114 byte dan 3 bit lainnya

Unary, ~ 4.08 * 10 ^ 275 byte

Ini akan menjadi terlalu panjang untuk di sini, tapi itu hanya 408452257862560239329948606295286361112603208650130608525040044700379331457759667646985586658469601803889628246410788572492437928714867190270708935427798983714797786123292750743771225096145575210320040188155473030775033228313350778616384531426430459309802833775612506568528463 nol dan bekerja sama dengan program Brainfuck.

EDIT : Saya kacau, program ini tidak mengambil input pengguna benar-benar, hanya menggunakan nilai pointer saat ini sebagai input. Untuk dapat mengurai angka lebih banyak akan diperlukan dan saya tidak dapat repot untuk melakukan itu.

Jadi ia bekerja dengan nilai yang langsung dimasukkan ke dalam program (dengan menambahkan n kali "+" sebelum program) tetapi tidak dengan STDIN

Kametrixom
sumber
5

JavaScript (ES6), 42 39 byte

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

Fungsi luar fmengambil nilai input dan kemudian memanggil fungsi bagian dalamg secara rekursif untuk membangun string dari tengah keluar, menggunakan nilai input sebagai maksimum untuk menguji kasus dasar.

Tidak Disatukan:

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
sumber
4

Python 56 55

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

C # - 76

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

Haskell, 53 byte

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

Cara kerjanya: membangun string dari dalam ke luar dengan mulai dengan string kosong dan perulangan dari nbawah ke atas 2dengan menambahkan angka saat ini dan a ?dan menambahkan a : 0. Akhirnya letakkan 1di depan semua.

Pendekatan yang berbeda (berkat @Mauris sekarang lebih pendek 9 byte):

Haskell, 60 51 byte

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

Cara kerjanya: literal 1diikuti oleh ? <x>masing-masing <x>dalam [2..n]diikuti oleh konstanta : 0untuk masing-masing <x>dalam [2..n].

nimi
sumber
Sebuah pendekatan berdasarkan 60 byte Anda yang turun ke 51:g n='1':((=<<[2..n])=<<[(" ? "++).show,\x->" : 0"])
Lynn
Sebenarnya, Anda bisa turun ke 51 lebih langsung dengan hanya menggantinya (\_->" : 0")=<<[2..n]dengan[2..n]>>" : 0"
Lynn
3

Pyth, 17 byte

jd.iSQs*RtQ,\?":0

Demonstrasi.

isaacg
sumber
3

Julia, 44 31 byte

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

Ini menciptakan fungsi tanpa nama yang menerima integer sebagai input dan mengembalikan string. Untuk menyebutnya, berikan nama, mis f=n->....

Pertama kita menggabungkan bilangan bulat 1 ke n , memisahkan masing-masing dengan ?dan spasi menjadi satu string. Kemudian kita menambahkan ini string yang " : 0"diulang n -1 kali.

Contoh:

julia> f(1)
"1"

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

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

JavaScript ES7, 62 byte

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

Saya tidak tahu apakah saya bisa bermain golf lebih dari ini. Tapi ini solusi yang cukup mudah

Hanya Firefox:

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

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

Setara dengan 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
sumber
2

CoffeeScript, 52 byte

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

Penjelasan

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
sumber
2

SWI-Prolog, 90 byte

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

Jelas tidak akan menang, tetapi \+ (between(1,TopBound,N),\+do_something(N))konstruksinya cukup menarik untuk mengulangi sesuatu pada urutan bilangan bulat.

Fatalisasi
sumber
2

Swift 145 (135 w / o whitespace)

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

Bisakah Anda percaya bagian untuk substring sebenarnya lebih panjang daripada bagian untuk menghasilkan ekspresi.

Ben Lu
sumber
1
Harus mencintai Swift <3 Namun saya sangat berharap mereka membuatnya sehingga Anda dapat mengakses string dengan indeks Integer seperti str[1]atau str[0...5]. Tentu saja Anda dapat membuat ekstensi kecil, tapi saya berharap pustaka standar mengaktifkan ini
Kametrixom
@Kametrixom apple pernah mengizinkan ini dalam beta pertama, tetapi berbagai pengkodean unicode mencegah Anda melakukannya. Itu terutama karena beberapa simbol dua byte atau lebih panjang dan beberapa tidak. Jadi tidak dijamin untuk mengambil karakter yang sama dalam pengkodean yang berbeda dengan indeks yang sama. Deskripsi saya mungkin tidak akurat, tapi itu pada dasarnya mengapa apel memperkenalkan sintaks string string yang jelek.
Ben Lu
Baru-baru ini saya benar-benar terbiasa menggunakan Swift untuk Code Golfing, lihat jawaban Swift saya
Kametrixom
2

Perl, 36 byte

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

35karakter +1untuk -n.

Jalankan dengan:

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

Java, 71

Saya tidak bisa menahan diri setelah mengomentari jawaban RCB . Jadi inilah Java yang lain (71 seperti wow, kapan Java bukan yang terpanjang!)

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

Jawa, 125 88 byte

Asli

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

Dengan pemformatan yang lebih baik dan nama variabel:

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

Membaik - Terima kasih atas komentar Jack Ammo di bawah ini:

String f(int n){String s="",e=s;for(int i=1;i<n;){s+=i+++" ? ";e+=" : 0";}return s+n+e;}
RCB
sumber
1
Anda tidak memerlukan operator triadik untuk menambahkan e hanya untuk memperhitungkan ruang, anggap saja Anda selalu membutuhkan ruang di depan titik dua e+=" : 0";. Anda kemudian dapat menyimpan 1 byte dengan post-incrementing i saat digunakan alih-alih pada baris forloop for(int i=1;i<n;){s+=i+++" ? ";. Pernyataan pengembalian Anda tidak lagi membutuhkan ruang yang ditambahkan setelah n return s+n+e;. Anda juga dapat menyimpan 1 byte dengan menggunakan e=s. Juga, pernyataan if di awal tidak diperlukan karena for loop logic akan menjamin hasil itu.
Jack Ammo
@JackAmmo Tip luar biasa, terima kasih! Pernyataan if diperlukan untuk menghindari trailing spasi, tetapi tidak lagi setelah perbaikan Anda untuk logika loop. Saya telah memasukkan perubahan dan meningkatkan jawaban Anda.
RCB
1

JavaScript (ES6), 59 byte

Pendekatan yang sama seperti jawaban CoffeeScript saya, menggunakan bantuan string template. String.prototype.repeatbiaya terlalu banyak karakter.

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

Demo

Firefox hanya untuk saat ini, seperti 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));

rink.attendant.6
sumber
1

K, 36 byte

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

Python 2, 63 60 58 56

Coba di sini

Solusi mudah: (63)

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

Sunting : Saya benar-benar ingin mencoba fungsi rekursif. Ini dia: (56)

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

Sunting : Adakah yang tahu mengapa ini tidak berhasil? Saya mencoba daftar dengan indeks c<n, tetapi itu tidak berhasil karena kesalahan stack overflow. Sama dengan ini:

f=lambda n,c=1:`c`+((c<n)*(' ? '+f(n,c+1))or~-n*' : 0')
mbomb007
sumber
Indeks tidak berfungsi karena harus membuat daftar berisi fungsi yang dievaluasi (yang jelas akan berjalan selamanya). Hal yang sama terjadi dengan perkalian Anda, masih perlu mengevaluasi fungsi meskipun sedang melakukannya 0*.
FryAmTheEggman
@FryAmTheEggman Baiklah, terima kasih. Saya belum pernah mengalami situasi seperti ini terjadi sebelumnya.
mbomb007
1

rs , 77 byte

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

Demo langsung dan uji kasus.

Penjelasan:

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

Perluas nomornya menjadi serangkaian N garis bawah.

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

Berulang kali membuat kisaran garis bawah, dipisahkan oleh spasi. misalnya ini akan berubah___ menjadi _ __ ___.

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

Tambahkan ke set terakhir dari garis bawah (panjang N) N-1 instance dari : 0.

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

Ganti setiap kelompok garis bawah dengan panjangnya, didahului oleh ? , KECUALI untuk yang pertama.

^./1

Ganti yang pertama dengan angka 1.

Karena formatnya, ini juga menangani dengan 0baik: ia hanya mencetak string kosong.

kirbyfan64sos
sumber
1

Swift, 79 75 byte

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

fsecara implisit dinyatakan sebagai fungsi dengan satu Intparameter yang mengembalikan aString

Bekerja dengan n >= 1dan lumpuh saat runtime saatn == 0 . Tidak ada spasi putih tertinggal

Sunting: Berhasil menghapus 2 * 2 karakter, karena interpolasi string tidak selalu yang terpendek

Catatan untuk diedit: Kode ini membutuhkan waktu lama (tidak berhenti) untuk dikompilasi, tetapi pasti akan dilakukan jika kompiler dapat mengatasinya. Lihatlah versi sebelum edit ini untuk mendapatkan yang mengkompilasi

Kametrixom
sumber
1

> <> , 32 + 3 = 35 byte

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

Perhatikan bahwa ada spasi tambahan di baris kedua. +3 adalah untuk -vflag, misalnya run like

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

Mengambil input sebagai titik kode seperti

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

adalah 34 byte, tetapi saya lebih suka versi di atas karena lebih mudah untuk menguji dan tidak akan menang.

Penjelasan

Ada beberapa rekursi semu dan penyalahgunaan yang terjadi, jadi mari kita lihat.

Baris pertama mencetak "1 ? 2 ? ... n-1 ? " bagian. Tumpukan dimulai hanya dengan input n, berkat -vbendera, dan kami melakukan hal berikut:

: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

> <> adalah toroidal, jadi perintah di atas dijalankan dalam satu lingkaran sampai tumpukan terdiri natasn-1 nol di bawahnya, di mana titik itu bergerak ke baris kedua.

Pertama kali baris kedua dieksekusi, ninstruksi dijalankan, mencetak ndi bagian atas tumpukan. Ini menyisakan n-1nol saja, dan kami melakukan hal berikut, juga dalam satu lingkaran:

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
sumber
" ? "ooo Cetak kebalikan dari "?" (Tapi hei, palindrom) sedang mencetak kebalikannya lebih pendek daripada mencetak string yang sebenarnya?
Caridorc
@Caridorc Ya, karena> <> hanya dapat mencetak char-by-char dengan membuka tumpukan :)
Sp3000
sp3000 senang tahu.
Caridorc
1

Scala, 78 71 52 50 byte

def f(n:Int)=(1 to n).mkString(" ? ")+" : 0"*(n-1)
pengguna42083
sumber
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);}

Dimasukkan 0 untuk intatau sesuatu yang negatif menimbulkan NSRangeExceptionkarena outStringmengandung nil. Ini harus dijalankan di iOS 2.0 dan yang lebih baru dan banyak dari versi terbaru Mac OS X.

Rincian kode:

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

Deklarasi fungsi standar di Objective-C.

NSMutableString *outString=@"".mutableCopy;

Membuat string untuk menuju keluaran, outString ,, dan membuatnya bisa berubah. (Dengan kata lain, itu bisa dibaca dan ditulis.

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

Menambahkan bagian pertama dari string ke output.

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

Bersihkan awal string untuk memastikan ? 1diganti dengan 1. Catatan: jika 0diberikan, ini adalah di mana NSRangeExceptionakan terjadi, karena tidak ada indeks 1.

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

Menambahkan bagian kedua dari string ke string.

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

Keluarkan string kembali menggunakan NSLogdan menutup fungsi.

Keluaran:

Memasukkan 0memberikan log kerusakan ini:

    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 memberikan ini:

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

2 memberikan ini:

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

7 memberikan ini:

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 memberikan ini:

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

C, 84 78 byte

C, meskipun bukan yang terpendek, sebagai fungsi:

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

Dalam nama golf, yang intjenis specifier yang tersisa off i, fdan nkarena itu adalah default. idapat diinisialisasi karena merupakan variabel global dan default ke nol. ftidak mengembalikan nilai, tetapi itu hanya menyebabkan peringatan. printfbukan #included Untuk menjalankan, ini adalah versi program lengkap:

#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
sumber
Anda mungkin dapat mempersingkat ini dengan menggunakan for(printf(...);--i;).
lirtosiast
1

C, 63 byte

Fungsi yang dapat digunakan kembali, mengambil n sebagai argumen.

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

Tidak disatukan dan dikomentari (cukup mudah):

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

Common Lisp, 84

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

Pertama, (loop for i from 1 to (read) collect i) buat daftar bilangan bulat dari 1 ke apa pun yang dimasukkan, yang digunakan sebagai satu-satunya argumen ke fungsi. Tetapi keajaiban sebenarnya ada di string kontrol yang terlihat seperti garis noise. "~{~A ? ~}"mengulangi seluruh daftar yang disimpan dalam argumen pertama, menghasilkan setiap nomor dengan ?untuk babak pertama. ~@*mengatur ulang daftar argumen ke argumen pertama. ~{~[~;~:;0~^ ? ~]~}mengulangi daftar, mengeluarkan 0 ?untuk setiap argumen yang dikonsumsi, tetapi menghasilkan apa-apa jika argumen adalah 0 atau 1.

Lilin
sumber