Dengan N, elemen ke-n keluaran dari ['A', 'B', 'AB', 'C', 'D', 'CD', 'ABCD', 'E', ...]?

12

Pertimbangkan daftar berikut:

expected = [
'A',
'B',
'AB',
'C',
'D',
'CD',
'ABCD',
'E',
'F',
'EF',
'G',
'H',
'GH',
'EFGH',
'ABCDEFGH',
'I',
'J',
'IJ',
'K',
'L',
'KL',
'IJKL',
'M',
'N',
'MN',
'O',
'P',
'OP',
'MNOP',
'IJKLMNOP',
'ABCDEFGHIJKLMNOP',
...
]

Inilah salah satu cara untuk melihatnya - Anda sedang belajar cara menulis karakter Cina dan ingin belajar potongan besar dari mereka, berlatih mereka saat Anda pergi. Anda mulai dengan A, lalu pergi dengan B, lalu sudah ada urutan yang merupakan sepasang dari dua sehingga Anda menggabungkannya. Lalu Anda pergi dengan C dan D, membuat pasangan lain, berlatihlah. Kemudian Anda berlatih: ABCD. Kemudian hal yang sama berlaku dengan E hingga H, kemudian berlatih: ABCDEFGH. Daftar ini tidak terbatas.

Tujuannya adalah untuk menghasilkan dan mencetak elemen ke-n dari daftar ini, indeks naik dari nol. Asumsikan bahwa setelah 'Z', Anda mendapatkan 'A' lagi.

Kriteria yang menang adalah panjang kode sumber.

d33tah
sumber
3
Tidak yakin saya mengerti, kapan BCatau kapan CDEF? Apa yang memutuskan apa yang kita gabungkan dan yang tidak? Bagaimana itu tak terbatas jika dimulai Akembali setelahnya Z(maksud Anda pada titik setelah ABCDEFGHIJKLMNOPQRSTUVWXZkita miliki ABCDEFGHIJKLMNOPQRSTUVWXZABatau sesuatu?)
Jonathan Allan
5
Test case untuk huruf yang membungkus dihargai ( x,y,z,a,b...).
Stewie Griffin
7
Saya sangat menyarankan Anda menggunakan Sandbox di masa depan untuk meningkatkan tantangan Anda. Di sana, Anda akan menerima umpan balik dari sesama pengguna untuk memastikan tantangan Anda cocok untuk situs PPCG utama! Secara pribadi, saya akan meninggalkan pos di Sandbox selama minimal 2 hari sehingga semua orang memiliki kesempatan untuk melihat pos tersebut.
JungHwan Min
2
@JungHwanMin: tidak apa-apa untuk mencetak daftar tanpa batas. Saya akan melewati mengembalikan daftar bilangan bulat.
d33tah
4
Apa yang dimaksud dengan "Saya akan mengembalikan daftar bilangan bulat"? Apakah output dari daftar bilangan bulat dapat diterima atau tidak? Jika demikian, bagaimana dengan "Asumsikan bahwa setelah 'Z', Anda mendapatkan 'A' lagi" - haruskah ini menjadi kasus dengan format output ini (setelah saya + 25 kita dapatkan saya lagi)? (Juga perbarui posting dengan informasi yang relevan - jangan tinggalkan spesifikasi untuk ditemukan di komentar.)
Jonathan Allan

Jawaban:

8

Python 2, 53 byte

x,y=0,1
exec"x^=y-x;y+=x/y;"*input()
print range(x,y)

Cobalah online!

Mirip dengan konstruksi ini dengan transformasi x = u-v,y = u

KSab
sumber
Penyederhanaan yang bagus! Pernyataan pertama bisa x^=y-xuntuk -1 byte.
xnor
@ xnor oh benar, konyol saya
KSab
6

JavaScript (ES6), 59 byte

Kita dapat menyimpan 2 byte dengan membuat urutan 1-diindeks dan menggunakan penyederhanaan yang mirip dengan yang digunakan oleh KSab :

n=>(x=g=y=>n?g(y+=y==(x^=y-x),n--):x<y?[x++,...g(y)]:[])(1)

Cobalah online!


JavaScript (ES6), 61 byte

Mengembalikan daftar bilangan bulat non-pembungkus.

n=>(g=v=>n?g(u&-u^v?v*2:!!u++,n--):v?[u-v,...g(v-1)]:[])(u=1)

Cobalah online!

Berdasarkan konstruksi oleh Donald Knuth. Entri OEIS terkait: A182105 .

Bagaimana?

Ini adalah fungsi rekursif dua tahap.

(un,vn)(u1,v1)=(1,1)

(un+1,vn+1)={(un+1,1),if (unANDun)=vn(un,2vn),otherwise

[unvn,unvn+1,,un]


JavaScript (ES6), 97 byte

Mengembalikan pembungkus huruf besar.

n=>(s=i='',g=v=>(s+=String.fromCharCode(65+i++%26),n--)?g(u&-u^v?v*2:!!u++):s.substr(u-v,v))(u=1)

Cobalah online!

Atau 91 byte dalam huruf kecil.

Arnauld
sumber
2

Bahasa Wolfram (Mathematica) , 80 71 byte

Range@#2+#-#2&@@Nest[If[#~BitAnd~-#==#2,{#+1,1},{#,2#2}]&@@#&,{1,1},#]&

Cobalah online!

Mengembalikan daftar bilangan bulat alih-alih string alfabet pembungkus. Diindeks 0.

Menggunakan OEIS A182105 , terima kasih kepada @Arnauld.

Mencetak daftar tanpa batas, 54 byte

Do[j=Range@i;#∣i&&Print@j[[-#;;]]&/@(2^j/2),{i,∞}]

Cobalah online!

1-diindeks. Versi TIO limbukannya mencegah crash.

JungHwan Min
sumber
1

Jelly , 16 byte

1;ẎṀ+ƊẎQṭƊƊ¡ị@‘Ṿ

13

Program lengkap. Mencetak ,daftar integer yang terpisah.

Erik the Outgolfer
sumber
1

Arang , 45 42 35 byte

FN⊞υ⎇∧›Lυ¹⁼L§υ±¹L§υ±²⁺⊟υ⊟υ§αL⭆υκ⮌⊟υ

Cobalah online! Tautan adalah untuk mengucapkan versi kode. 1-diindeks. Saya tidak dapat menemukan formula sederhana untuk menghasilkan hasilnya jadi saya cukup mengikuti prosedur yang diberikan dalam pertanyaan. Penjelasan:

FN

Ulangi jumlah yang diberikan nkali.

⊞υ

Dorong elemen berikutnya ke array kosong yang telah ditentukan u, dihitung sebagai ...

⎇∧›Lυ¹⁼L§υ±¹L§υ±²

... jika ada lebih dari satu elemen udan dua elemen terakhir memiliki panjang yang sama ...

⁺⊟υ⊟υ

... lalu tambahkan elemen kedua dari belakang ke elemen terakhir (yang membangun hasilnya dalam urutan terbalik) ...

§αL⭆υκ

... jika tidak, huruf berikutnya dapat ditemukan dengan menghitung berapa banyak huruf yang telah kita tambahkan sejauh ini dan secara siklis mengindeks ke dalam alfabet huruf besar yang telah ditentukan. (Mengambil jumlah atau panjang jumlah gagal ketika daftar kosong, dan memetakan daftar ke dalam string menghemat dua byte di atas casing khusus daftar kosong.)

⮌⊟υ

Ambil elemen terakhir u, yang merupakan nelemen terbalik dari daftar yang diinginkan, dan cetak secara terbalik.

Neil
sumber