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.
Jawaban:
Pyth -
191817 bytesRuang-ruang itu membunuhku, memikirkan cara yang lebih baik untuk menanganinya.
Itu hanya bergabung dengan angka-angka
" ? "
dan kemudian menyatukan bagian kedua.Cobalah online di sini .
sumber
CJam,
1818 byteCobalah online .
Penjelasan
sumber
:)
.Ruby, 31 byte
Uji:
sumber
array * string
==array.join string
... menarikf[0]
?irb(main):007:0> f[0] ArgumentError: negative argument from (irb):6:in * from (irb):6:in block in irb_binding from (irb):7:in [] from (irb):7 from /usr/bin/irb:11:in <main>
CJam, 19 byte
Hanya permulaan ...
Bagaimana itu bekerja
Cobalah online di sini
sumber
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
:Jalan cepat:
Penyiapan (97 byte)
Bagian pertama (181 byte)
Bagian kedua (27 byte)
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
sumber
JavaScript (ES6),
4239 byteFungsi luar
f
mengambil 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:
sumber
Python
5655sumber
C # - 76
sumber
Haskell, 53 byte
Cara kerjanya: membangun string dari dalam ke luar dengan mulai dengan string kosong dan perulangan dari
n
bawah ke atas2
dengan menambahkan angka saat ini dan a?
dan menambahkan a: 0
. Akhirnya letakkan1
di depan semua.Pendekatan yang berbeda (berkat @Mauris sekarang lebih pendek 9 byte):
Haskell,
6051 byteCara kerjanya: literal
1
diikuti oleh? <x>
masing-masing<x>
dalam[2..n]
diikuti oleh konstanta: 0
untuk masing-masing<x>
dalam[2..n]
.sumber
g n='1':((=<<[2..n])=<<[(" ? "++).show,\x->" : 0"])
(\_->" : 0")=<<[2..n]
dengan[2..n]>>" : 0"
Pyth, 17 byte
Demonstrasi.
sumber
Julia,
4431 byteIni 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:
sumber
JavaScript ES7, 62 byte
Saya tidak tahu apakah saya bisa bermain golf lebih dari ini. Tapi ini solusi yang cukup mudah
Hanya Firefox:
Setara dengan ES5:
sumber
CoffeeScript, 52 byte
Penjelasan
sumber
SWI-Prolog, 90 byte
Jelas tidak akan menang, tetapi
\+ (between(1,TopBound,N),\+do_something(N))
konstruksinya cukup menarik untuk mengulangi sesuatu pada urutan bilangan bulat.sumber
Swift 145 (135 w / o whitespace)
Bisakah Anda percaya bagian untuk substring sebenarnya lebih panjang daripada bagian untuk menghasilkan ekspresi.
sumber
str[1]
ataustr[0...5]
. Tentu saja Anda dapat membuat ekstensi kecil, tapi saya berharap pustaka standar mengaktifkan iniPerl, 36 byte
35
karakter+1
untuk-n
.Jalankan dengan:
sumber
Java, 71
Saya tidak bisa menahan diri setelah mengomentari jawaban RCB . Jadi inilah Java yang lain (71 seperti wow, kapan Java bukan yang terpanjang!)
sumber
Jawa,
12588 byteAsli
Dengan pemformatan yang lebih baik dan nama variabel:
Membaik - Terima kasih atas komentar Jack Ammo di bawah ini:
sumber
e+=" : 0";
. Anda kemudian dapat menyimpan 1 byte dengan post-incrementing i saat digunakan alih-alih pada baris forloopfor(int i=1;i<n;){s+=i+++" ? ";
. Pernyataan pengembalian Anda tidak lagi membutuhkan ruang yang ditambahkan setelah nreturn s+n+e;
. Anda juga dapat menyimpan 1 byte dengan menggunakane=s
. Juga, pernyataan if di awal tidak diperlukan karena for loop logic akan menjamin hasil itu.JavaScript (ES6), 59 byte
Pendekatan yang sama seperti jawaban CoffeeScript saya, menggunakan bantuan string template.
String.prototype.repeat
biaya terlalu banyak karakter.Demo
Firefox hanya untuk saat ini, seperti ES6.
sumber
K, 36 byte
sumber
Python 2,
63605856Coba di sini
Solusi mudah: (63)
Sunting : Saya benar-benar ingin mencoba fungsi rekursif. Ini dia: (56)
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:sumber
0*
.rs , 77 byte
Demo langsung dan uji kasus.
Penjelasan:
Perluas nomornya menjadi serangkaian N garis bawah.
Berulang kali membuat kisaran garis bawah, dipisahkan oleh spasi. misalnya ini akan berubah
___
menjadi_ __ ___
.Tambahkan ke set terakhir dari garis bawah (panjang N) N-1 instance dari
: 0
.Ganti setiap kelompok garis bawah dengan panjangnya, didahului oleh
?
, KECUALI untuk yang pertama.Ganti yang pertama dengan angka 1.
Karena formatnya, ini juga menangani dengan
0
baik: ia hanya mencetak string kosong.sumber
Swift,
7975 bytef
secara implisit dinyatakan sebagai fungsi dengan satuInt
parameter yang mengembalikan aString
Bekerja dengan
n >= 1
dan lumpuh saat runtime saatn == 0
. Tidak ada spasi putih tertinggalSunting: 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
sumber
> <> , 32 + 3 = 35 byte
Perhatikan bahwa ada spasi tambahan di baris kedua. +3 adalah untuk
-v
flag, misalnya run likeMengambil input sebagai titik kode seperti
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 inputn
, berkat-v
bendera, dan kami melakukan hal berikut:> <> adalah toroidal, jadi perintah di atas dijalankan dalam satu lingkaran sampai tumpukan terdiri
n
atasn-1
nol di bawahnya, di mana titik itu bergerak ke baris kedua.Pertama kali baris kedua dieksekusi,
n
instruksi dijalankan, mencetakn
di bagian atas tumpukan. Ini menyisakann-1
nol saja, dan kami melakukan hal berikut, juga dalam satu lingkaran:sumber
" ? "ooo
Cetak kebalikan dari "?" (Tapi hei, palindrom) sedang mencetak kebalikannya lebih pendek daripada mencetak string yang sebenarnya?Scala,
78715250 bytesumber
Objective-C, 346 bytes
Dimasukkan
0
untukint
atau sesuatu yang negatif menimbulkanNSRangeException
karenaoutString
mengandungnil
. Ini harus dijalankan di iOS 2.0 dan yang lebih baru dan banyak dari versi terbaru Mac OS X.Rincian kode:
Deklarasi fungsi standar di Objective-C.
Membuat string untuk menuju keluaran,
outString
,, dan membuatnya bisa berubah. (Dengan kata lain, itu bisa dibaca dan ditulis.Menambahkan bagian pertama dari string ke output.
Bersihkan awal string untuk memastikan
? 1
diganti dengan1
. Catatan: jika0
diberikan, ini adalah di manaNSRangeException
akan terjadi, karena tidak ada indeks1
.Menambahkan bagian kedua dari string ke string.
Keluarkan string kembali menggunakan
NSLog
dan menutup fungsi.Keluaran:
Memasukkan
0
memberikan log kerusakan ini:1
memberikan ini:2
memberikan ini:7
memberikan ini:200
memberikan ini:sumber
C,
8478 byteC, meskipun bukan yang terpendek, sebagai fungsi:
Dalam nama golf, yang
int
jenis specifier yang tersisa offi
,f
dann
karena itu adalah default.i
dapat diinisialisasi karena merupakan variabel global dan default ke nol.f
tidak mengembalikan nilai, tetapi itu hanya menyebabkan peringatan.printf
bukan#include
d Untuk menjalankan, ini adalah versi program lengkap:sumber
for(printf(...);--i;)
.C, 63 byte
Fungsi yang dapat digunakan kembali, mengambil n sebagai argumen.
Tidak disatukan dan dikomentari (cukup mudah):
sumber
Common Lisp, 84
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, mengeluarkan0 ?
untuk setiap argumen yang dikonsumsi, tetapi menghasilkan apa-apa jika argumen adalah 0 atau 1.sumber