Tantangan ini hanya mengembalikan daftar bilangan bulat, mirip dengan fungsi rentang Python, kecuali bahwa setiap angka berurutan harus sedalam itu dalam daftar.
Aturan :
- Buat program atau fungsi non-anonim
- Itu harus mengembalikan atau mencetak hasilnya
- Hasilnya harus dikembalikan dalam daftar (daftar) atau array (array)
- Jika parameternya nol, kembalikan daftar kosong
- Ini harus dapat menangani parameter integer 0 <= n <70.
- (solusi rekursif meledak cukup cepat)
- Fungsi harus dapat dipanggil dengan hanya satu parameter.
- Perilaku lain tidak terdefinisi.
- Ini kode golf, jadi kode terpendek menang.
Contoh Panggilan:
rangeList(6)
> [0, [1, [2, [3, [4, [5]]]]]]
Kasus uji:
0 => []
1 => [0]
2 => [0, [1]]
6 => [0, [1, [2, [3, [4, [5]]]]]]
26 => [0, [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]]]]]]]]]]]]]]]]]]]]]]]]]]
69 => [0, [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]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
EDIT: jawaban isaacg adalah yang terpendek sejauh ini. Saya akan memperbarui jawaban yang diterima jika ada yang menemukan jawaban yang lebih pendek dalam bahasa yang ada di posting tantangan. Terima kasih sudah bermain!
code-golf
array-manipulation
mbomb007
sumber
sumber
import math
menggunakan Python misalnya, saya tidak berpikir itu bisa terjadi di dalam suatu fungsi.Jawaban:
Pyth, 13 byte
Coba di sini.
sumber
APL (
1318)Dengan asumsi
⎕IO=0
:Penjelasan:
×⍵:
jika⍵
positif,,∘⊂∘,
: gabungkan operan kiri ke lampirkan operan kanan (yaitux ,∘⊂∘, y = [x, [y]]
)/
: mengurangi⍳⍵
: angka-angka0..⍵-1
⊃
: ungkapkan hasilnya⋄
: jika tidak⍬
: kembalikan daftar kosong/
gagal⍬
, dan⍳0
memberikan daftar kosong.)Tambahan:
Fungsi ini mengembalikan array bersarang. Namun, agak sulit untuk mengatakan ini dari output default APL. Ini memisahkan item array dengan spasi, jadi Anda hanya bisa mengatakan bersarang dengan spasi ganda. Berikut adalah fungsi yang akan mengambil array bersarang, dan mengembalikan string, memformat array bersarang dalam gaya Python (yaitu
[a,[b,[c,...]]]
).sumber
f←
ke awal program Anda kecuali Anda memodifikasinya untuk menerima input pengguna.Haskell, 67 byte
Di Haskell semua elemen daftar harus dari jenis yang sama, jadi saya tidak bisa mencampur bilangan bulat dengan daftar bilangan bulat dan saya harus mendefinisikan jenis daftar kustom
L
. Fungsi helper#
secara rekursif membuat daftar yang diperlukan. Fungsi utamap
memeriksa daftar kosong dan memanggil yang#
sebaliknya.Karena tipe data baru tidak dapat dicetak secara default (aturan memperbolehkan hanya untuk mengembalikan daftar), saya menambahkan beberapa kode lagi untuk tujuan demonstrasi:
Sekarang:
sumber
Python, 48 byte
Menggunakan daftar perkalian untuk menangani kasus khusus.
sumber
*(i<n-1)
bisa dilakukan karena[:n+~i]
, ini daftar tunggal.Mathematica, 33
sumber
CJam, 16 byte
Ini adalah program lengkap. Dibutuhkan input melalui STDIN dan mencetak array terakhir ke STDOUT.
Seperti dengan entri CJam lainnya,
0
input akan dicetak""
karena itu adalah representasi dari array kosong di CJam.Cara kerjanya :
Cobalah online di sini
sumber
JavaScript (ES6) 40
Solusi rekursif, cukup kuat, tidak ada pukulan. Perbarui Gagal di dekat 6500 dengan 'terlalu banyak rekursi'
Solusi berulang (45) Tidak ada batasan kecuali penggunaan memori
Coba F (1000): Konsol FireBug tidak akan menampilkan lebih dari 190 array bersarang, tetapi mereka ada di sana
sumber
Java,
88107105104102 byteCukup lama dibandingkan dengan yang lain, meskipun Anda tidak bisa melakukan jauh lebih baik dengan Java. Pemeriksaan untuk menentukan apakah akan melanjutkan rekursi adalah semua yang diperlukan.
sumber
import java.util.*;
ini mandiri (atau sepenuhnya memenuhi syaratjava.util.List
danjava.util.Stack
, tapi itu jauh lebih lama). +19 untuk menjadikannya 107, masih 7 lebih baik daripada jawaban Java yang saya kerjakan: Do!=n
bisao<n
, dan Anda dapat menukar ternary keo<n?o++:""
.final
onint n
bisa dihapus.Python 2, 56 byte
Saya menduga ini bisa bermain golf lebih banyak.
Tes:
sumber
CJam, 17 byte
Saya tahu Pengoptimal telah menemukan 16, tetapi di sini adalah yang terbaik yang dapat saya lakukan:
Ini adalah blok, hal yang paling dekat dengan fungsi di CJam, yang mengambil integer di stack, dan meninggalkan array bersarang yang diinginkan.
Gunakan program ini untuk mengujinya , yang menempatkan input pada stack, lalu memanggil fungsi dan memeriksa stack. Perhatikan bahwa untuk
0
, output stack akan berisi""
- ini adalah representasi asli CJam dari array kosong.sumber
Ruby 46
Uji secara online: http://ideone.com/uYRVTa
sumber
C # - 100
Rekursi sederhana. Periksa nol case khusus dan centang dengan satu variabel, turun dengan yang lainnya
C ++ 87
(Visual C ++ 2012)
Yang ini bagus, maksud saya Bizantium, tapi ide dasarnya sama dengan c # one.
Ini implementasi array gaya C, jadi tidak memberi Anda array, ia memberikan pointer int, di mana saya menyimpan int dan pointer lainnya. Seperti ini
[0,*] *->[1,#] #-> [2,&] &-> etc
:, di mana simbol adalah kode pseudo untuk nilai int pointer dan -> adalah tempat pointer ke dalam memori.Alangkah baiknya untuk menggunakan implementasi array bergerigi c style yang telah saya buat (batuk), tetapi saya mempertahankannya cukup masuk akal untuk berada di dalam aturan pertanyaan.
Ada cukup banyak operator ternary yang menyalahgunakan di sini, dan juga cukup banyak menyalahgunakan para pemain implisit dari int ke bool.
Contoh: Jika kita membiarkan
int *bar = (int*)A(3);
, kita dapat melihat:Yang merupakan pointer bicara untuk [0, [1, [2]]].
Oke, baiklah. Sebenarnya tidak harus mengerikan. Berikut ini beberapa kode uji untuk menjalankan kode c ++ ini:
}
sumber
C++
.Array g(params object[]a)=>a;Array f(int y,int x=0)=>y<1?g():y<2?g(x):g(x,f(y-1,x+1));
Pyth, 15 byte
Yang sebenarnya mengatakan, dalam Python:
sumber
qJ_1
sama dengan!Q
. DanJtQ
sebenarnya membuang 1 byte.?Y!Qu[HG)_UtQ[tQ
[tQ
ke]tQ
, yang setara, Anda menukar dengan urutan operasi?
, sehingga Anda dapat menggantinya!Q
denganQ
. Ini menghasilkan?u[HG)_UtQ]tQQY
- 1 byte lebih tersimpan.Haskell ,
65 59 4541 byteDaftar bersarang ini adalah struktur data yang sama dengan yang di-root
Tree
, kecuali bahwa mereka juga bisa kosong. Oleh karena itu, kita dapat menggunakan daftar mereka - juga disebutForest
untuk mewakili mereka.Cobalah online!
Penjelasan
Pertama-tama kita perlu mengimplementasikan
Tree
tipe data:Dari sana hanya rekursi menggunakan dua parameter
m
(penghitungan) dann
untuk melacak kapan harus mengakhiri:Alternatif, 61 byte
Cobalah online!
Penjelasan
Fungsi ini
unfoldForest
mengambil daftar nilai awal dan fungsix -> (y,[x])
. Untuk setiap nilai awalx
ia membuka pohon menggunakan fungsi, menghasilkan tuple di(y,xs)
manay
akan menjadi root danxs
digunakan untuk mengulangi prosedur:sumber
Perl - 44
Akan menambahkan penjelasan atas permintaan. Anda bisa mencobanya di sini .
sumber
nil
atau apa pun yang setara dengannya ? Saya bertanya karena pada halaman yang Anda tautkan ke array yang paling dalam terlihat seperti(3,)
undef
adalah persamaannil
ataunull
dalam Perl dan tidak ada elemen tambahan. Perl meratakan array sehingga ini membuat referensi array bersarang.JavaScript, 93 byte
Ini tidak ideal, tetapi saya bisa mencobanya. Saya akan mencoba dan golf ini lebih lanjut nanti, meskipun untuk saat ini saya tidak melihat cara yang jelas untuk melakukannya.
sumber
Python, 75 byte
Ini hanya untuk pertunjukan. Ini adalah program yang saya tulis ketika membuat / mendesain tantangan ini.
sumber
Python, 44
Secara rekursif menciptakan pohon. Yang
[:n]
pada akhirnya adalah kasus khususn==0
untuk memberikan daftar kosong.sumber
and
danor
dapat menghilangkan spasi di sebelah bilangan bulat, tetapielse
tidak bisa.else
dimulai dengane
, dan hal-hal seperti1e6
adalah literal angka yang valid.else
, misalnyax = 1 if y==2else 5
bekerja.Joe , 8 byte
Catatan: Ini adalah jawaban yang tidak bersaing. Versi pertama Joe dirilis setelah pertanyaan ini.
Apa yang kita punya di sini?
F:
mendefinisikan fungsi F yang merupakan rantai/+,
,M]
danR
. Saat Anda meneleponFn
, pertamaRn
dievaluasi, rentang pengembalian dari 0 hingga n, eksklusif.M]
membungkus setiap elemen ke daftar. Kemudian daftar tersebut diterapkan/+,
.x +, y
kembalix + [y]
./
adalah lipatan yang tepat. Jadi,/+,a b c d...
kembali[a, [b, [c, [d...]]]
.Contoh doa (kode diindentasikan oleh 3, dihasilkan oleh 0):
sumber
Ruby - Versi rekursif - 52
Versi non-rekursif:
666257Output sampel (sama untuk kedua versi)
Versi non-rekursif dapat menangani input besar secara sewenang-wenang.
Kedua versi juga dengan anggun menerima angka negatif
sumber
stack level too deep (SystemStackError)
)PHP 5.4 (67 byte):
Saya tahu saya tahu.
Itu jauh dari jawaban tersingkat.
Tapi berhasil!
Ini dia:
Anda dapat mengujinya di sini: https://ideone.com/42L35E (abaikan kesalahan)
Javascript (57 byte):
Ini adalah kode persis sama kecuali Javascript pilih-pilih tentang pengembalian dan saya telah mengurangi nama variabel:
Lihat? Kode yang sama!
ES6 (49 byte):
Pada dasarnya kode persis sama, tetapi dikurangi untuk ES6:
sumber
f=lambda
...But it's pretty standard codegolf for functions that they have to be callable by name (aka, more than once and without typing the entire function again.)
-> tidak pernah mendengar hal ini, dan saya menggunakan situs web ini selama hampir satu tahun. Selain itu, ini adalah argumen yang tidak valid karena Anda dapat menetapkan fungsi ke variabel.Javascript (114 byte):
Semua orang melakukan rekursif, jadi saya ingin mencoba solusi berulang. Saya punya terlalu banyak kasus khusus.
Saya memegang daftar master, dan kemudian loop dan menambahkan daftar baru dengan nomor baru.
sumber
Gangguan Umum (95 byte):
sumber
JavaScript,
3537 byteSolusi rekursif
Cobalah online!
sumber
05AB1E , 11 byte
Cobalah secara online atau verifikasi semua kasus uji .
Alternatif 11-byte:
Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
05AB1E tidak memiliki loop yang mengarah ke bawah, jadi untuk loop di kisaran
(input, 0]
saya juga harus:ݨR
; buat rentang[0, input]
, hapus item terakhir, balikkan), dan kemudian lewati (vy
);[0, input)
sebagai gantinya (F
), dan ambil perbedaan absolut antara loop-index dan input-1 (NI<α
).sumber