Quipus adalah perangkat kuno yang digunakan oleh suku Inca di era Pra-Polandia untuk mencatat angka dalam sistem posisi sepuluh basis simpul pada tali, yang berfungsi sebagai berikut:
Setiap kelompok simpul adalah angka, dan ada tiga jenis utama simpul: simpul terbuka sederhana; "long knots", terdiri dari simpul overhand dengan satu atau lebih putaran tambahan; dan angka delapan knot.
- Kekuatan sepuluh ditunjukkan oleh posisi sepanjang string, dan posisi ini selaras antara untaian beruntun.
- Digit pada posisi untuk 10 dan kekuatan yang lebih tinggi diwakili oleh kelompok simpul sederhana (misalnya, 40 adalah empat simpul sederhana dalam satu baris dalam posisi "puluhan").
- Digit dalam posisi "yang" diwakili oleh simpul panjang (mis., 4 adalah simpul dengan empat putaran). Karena cara simpul diikat, angka 1 tidak dapat ditunjukkan dengan cara ini dan diwakili dalam posisi ini oleh angka delapan simpul.
- Nol diwakili oleh tidak adanya simpul di posisi yang sesuai.
Detail
Untuk tantangan ini, setiap helai quipu mewakili angka tunggal (meskipun, seperti yang dinyatakan dalam artikel Wikipedia, Anda dapat mewakili banyak angka pada satu helai, dalam tantangan ini, kami tidak akan).
Simpul
Setiap simpul akan diwakili oleh karakter ASCII tunggal.
.
mewakili simpul sederhana:
mewakili satu putaran ikatan panjang8
mewakili simpul angka delapan|
mewakili tidak adanya simpul serta pembatas antara digit.
Membangun Quipus
Quipu dibangun mengikuti aturan-aturan ini.
- Helai berjalan dari atas ke bawah dalam urutan posisi yang menurun (seperti dalam, satuan digit akan berada di ujung bawah untai). Digit sepanjang untai dipisahkan oleh karakter (
|
). - Kekuatan 10 digit mewakili ditentukan oleh posisinya di sepanjang untai dengan cara yang sama kekuatan digit 10 akan dihitung menggunakan indeksnya dalam angka dengan sistem angka kami. Yaitu,
24
dengan a2
di tempat puluhan dan4
di tempat unit, akan diwakili oleh dua knot, pembatas (|
), lalu empat knot. - Digit dalam posisi yang sama disejajarkan ke arah bawah untai. Jika satu digit pada suatu posisi akan memiliki simpul lebih sedikit daripada digit lain dari angka lain di posisi yang sama, tidak adanya simpul tersebut diwakili oleh (
|
). - Simpul sederhana berturut-turut (
.
) menunjukkan nilai pada posisi mereka. - Setiap digit diwakili oleh setidaknya 1 karakter. Ketika nilai digit adalah 0 untuk semua angka dalam quipu, itu diwakili oleh tidak adanya simpul (
|
). - Tempat unit diperlakukan secara khusus. Satu di tempat satuan diwakili oleh simpul angka-delapan (
8
). Nilai dua atau lebih di tempat unit diwakili oleh simpul panjang berturut-turut (:
). - Ketika digit satuan adalah 0 untuk semua angka dalam quipu tidak ada simpul tidak dicetak tetapi, pembatas trailing untuk puluhan digit dipertahankan.
- Tidak ada pembatas yang mengikuti digit unit.
Aturan
- Input akan terdiri dari daftar bilangan bulat non-kosong yang dapat diterima melalui salah satu metode input default . Anda dapat mengasumsikan bahwa bilangan bulat ini semuanya kurang dari atau sama dengan
2147483647
atau2^31-1
. Sementara kasus uji dibatasi oleh ruang, format input Anda dapat memisahkan input dengan cara apa pun yang nyaman untuk bahasa Anda, apakah itu dipisahkan koma, dipisahkan oleh baris baru, dalam array, dan sebagainya. - Keluaran terdiri dari satu Quipu yang dibangun sesuai dengan aturan yang dijelaskan di atas. Output dapat diberikan melalui salah satu metode output default .
- Kode Anda harus berupa program atau fungsi, meskipun tidak harus berupa fungsi yang disebutkan.
- Knot perlu waktu untuk diikat sehingga menghemat waktu, kode Anda sesingkat mungkin.
Seperti biasa, jika masalahnya tidak jelas, beri tahu saya. Semoga berhasil dan bermain golf dengan baik!
Contohnya
Memasukkan:
5 3 1 0
Keluaran:
:|||
:|||
::||
::||
::8|
Memasukkan:
50 30 10 0
Keluaran:
.|||
.|||
..||
..||
...|
||||
Memasukkan:
330
Keluaran:
.
.
.
|
.
.
.
|
Memasukkan:
204 1
Keluaran:
.|
.|
||
||
||
:|
:|
:|
:8
Memasukkan:
201 0 100 222
Keluaran:
.||.
.|..
||||
|||.
|||.
||||
|||:
8||:
Memasukkan:
1073741823 2147483647
Keluaran:
|.
..
||
|.
||
.|
.|
.|
..
..
..
..
||
|.
|.
|.
|.
..
..
..
||
.|
.|
.|
..
..
..
..
||
|.
|.
|.
|.
..
..
..
..
||
|.
|.
..
||
.|
.|
..
..
..
..
..
..
||
|.
|.
..
..
||
|:
|:
|:
|:
::
::
::
Memasukkan:
0
Keluaran:
|
Jawaban:
Pyth, 64 byte
Cobalah online!
Bagaimana itu bekerja
sumber
8
. Bahkan, itu hanya sebuah8
simpul ketika angka terakhir adalah 1 (lihat aturan 6). Anda mengonversi semua simpul akhir dan itu tidak cocok dengan spek. Juga, Cobalah Online Anda! Tautan memiliki kode yang berbeda dari yang diposting di sini, rupanyaTidak dapat dibaca ,
31833001 byteIni adalah tantangan yang menyenangkan untuk dikerjakan, hidup dan mati, di antara perayaan Natal. Terima kasih telah memposting! Golf ini menarik karena spesifikasinya penuh dengan perkecualian dan case khusus, yang membutuhkan banyak syarat. Selain itu, walaupun saya tidak perlu mengonversi ke dan dari desimal kali ini, saya memang membutuhkan fungsi "maks" untuk menentukan jumlah digit terbesar di setiap angka dan nilai digit terbesar di setiap tempat.
Versi pertama ini adalah 4844 bytes, hanya untuk memberi Anda gambaran tentang seberapa banyak saya bermain golf ini.
Program mengharapkan input sebagai daftar bilangan bulat yang dipisahkan koma . Tidak ada spasi atau baris baru. Menggunakannya akan menghasilkan perilaku yang tidak terdefinisi.
Penjelasan
Saya akan memandu Anda melalui cara program bekerja dengan menunjukkan kepada Anda bagaimana ia memproses input spesifik
202,100,1
.Pada awalnya, kita membangun beberapa nilai yang kita perlukan nanti - kebanyakan kode ASCII dari karakter yang akan kita hasilkan.
Seperti yang Anda lihat,
'8'
dan'.'
sudah tersedia.'|'
, bagaimanapun, benar-benar 124, bukan 14. Kami menggunakan loop sementara untuk menambahkan dua kali nilai sementara di slot # 1 ke atasnya untuk mendapatkan 124 (yaitu 14 + 55 × 2, karena loop sementara berjalan untuk 56−1 = 55 iterasi). Ini menghemat beberapa byte karena literer bilangan bulat besar seperti 124 sangat panjang. Dalam diagram berikut, saya menunjukkan lokasi setiap variabel yang digunakan program.Selanjutnya, kami ingin memasukkan semua karakter dan menyimpannya di kaset mulai dari sel # 12 ( p adalah pointer berjalan untuk ini). Pada saat yang sama, kami ingin tahu berapa lama angka terpanjang (berapa digit). Untuk mencapai hal ini, kita menyimpan total running di unary ke kiri mulai dari sel # −1 (kita menggunakan q sebagai pointer berjalan). Setelah nomor input pertama (
202
), rekaman sekarang terlihat seperti ini:Anda akan memperhatikan bahwa angka-angka dimatikan oleh 4. Nah, ketika kami pertama kali memasukkan mereka, mereka adalah nilai ASCII mereka, jadi mereka "mati" dengan 48 dan koma adalah 44. Untuk setiap karakter, kami menyalin 46 dari
'.'
ke dalam r dan kemudian kurangi dengan loop sementara (yang mengurangkan 45) dan kemudian kita tambahkan 1. Kita melakukannya sehingga koma (pemisah kita) adalah 0, sehingga kita dapat menggunakan kondisional untuk mengenalinya.Juga, Anda akan memperhatikan bahwa kami meninggalkan sel # 11 di 0. Kami membutuhkannya untuk mengenali batas nomor pertama.
Karakter selanjutnya adalah koma, jadi kami menyimpan 0 di # 15, tapi tentu saja kali ini kami tidak maju q . Sebagai gantinya, kita mengatur q kembali ke 0 dan mulai “menimpa” 1 yang telah kita tempatkan.
Setelah semua karakter yang tersisa diproses, kami mendapatkan ini:
Seperti yang Anda lihat, angka 1 yang ditulis oleh q sekarang menunjukkan (secara unary) panjang angka terpanjang.
Kami sekarang menggunakan loop sementara untuk memindahkan q ke paling kiri, dan kemudian menempatkan pointer lain di sana yang akan saya panggil r2 . Tujuan dari r2 akan menjadi jelas nanti.
Pada titik ini, izinkan saya mengklarifikasi terminologi yang akan saya gunakan selama ini.
Sekarang kembali ke pemrograman reguler kami. Seluruh sisa program adalah loop besar yang bergerak q maju hingga mencapai sel # 0. Setiap sel di sepanjang jalan mewakili suatu tempat, dengan yang ditempatkan di paling kanan, dan q akan mulai dari yang paling signifikan. Dalam contoh kita, itu adalah ratusan tempat.
Kami melanjutkan dengan menambah titik sel q di (yaitu, * q ).
Kami sekarang berada di "tahap 2" untuk ratusan tempat. Pada tahap ini, kita akan mengetahui digit terbesar di antara semua digit di ratusan tempat. Kami menggunakan trik penghitungan unary yang sama untuk ini, kecuali kali ini penunjuk disebut r dan penunjuk r2 menandai posisi awal yang harus diatur ulang setiap kali kami beralih ke nomor berikutnya.
Mari kita mulai dengan angka pertama. Kita mulai dengan mengatur p ke 11 (posisi awal yang dikodekan dari semua angka). Kami kemudian menggunakan loop sementara untuk menemukan ujung angka dan mengatur p2 di sana untuk menandai posisi. Pada saat yang sama, kami juga mengatur q2 ke 0:
Jangan terganggu oleh fakta bahwa q2 menunjuk ke dalam vars. Kami tidak memiliki lapisan sel kosong di sana karena kami dapat mendeteksi sel # 0 hanya karena itu nomor nol.
Selanjutnya, kita pergi melalui angka saat ini dengan mengurangi p dan q2 bersama-sama sampai * p nol. Di setiap tempat, nilai * q2 memberi tahu kita apa yang perlu kita lakukan. 1 berarti "tidak melakukan apa-apa", jadi kami terus berjalan. Akhirnya kita menemukan 2 dalam sel # −3. Setiap kali * q2 tidak sama dengan 1, q2 selalu sama dengan q .
Seperti yang sudah saya nyatakan, tahap 2 adalah "menentukan digit terbesar di tempat ini". Jadi kita atur r ke r2 , gunakan loop sementara untuk mengurangi * p dan pindahkan r ke kiri dan isi rekaman dengan 1s, dan kemudian gunakan loop sementara lainnya untuk memindahkan r kembali ke kanan dan naikkan * p lagi untuk mengembalikan nilai. Ingat bahwa setiap while dijalankan untuk satu iterasi yang lebih sedikit daripada nilai yang kita gunakan; karena ini, jumlah 1s yang ditulis akan menjadi 3 lebih (daripada 4 lebih) dari nilai digit, dan nilai akhir yang disimpan kembali dalam * p akan menjadi 2 lebih. Dengan demikian, ini telah dikurangi secara efektif * p oleh 2.
Setelah itu, kita menetapkan p ke nilai p2 dan kemudian kita melakukan semua itu lagi. Untuk kedua kalinya, atur q2 ke 0, cari ujung angka dengan memindahkan p ke kanan, dan kemudian pergi melalui digit angka ini dengan menurunkan p dan q2 bersamaan. Sekali lagi kita akan menjumpai 2 dalam sel # −3 dan menulis bahwa 1s tersisa dari * r .
Dalam kasus angka ketiga, kita akhirnya tidak melakukan apa-apa karena tidak memiliki ratusan tempat (jadi q2 tidak pernah mencapai q ), tapi tidak apa-apa karena itu tidak mempengaruhi perhitungan nilai digit maksimum.
Kami juga mengatur sel * (r - 4) , yang telah saya tandai dengan panah yang tidak berlabel di sini, menjadi 1 (meskipun sudah pada 1). Saya tidak akan memberi tahu Anda mengapa, tapi mungkin Anda sudah menebaknya?
Peningkatan * q berikutnya membawa kita ke tahap 3, yaitu "kurangi angka maksimum dari semua digit di tempat saat ini". Seperti sebelumnya, kita mengatur ulang p ke 11 dan q2 ke 0 dan kemudian melewati semua angka seperti yang kita lakukan pada tahap sebelumnya; kecuali saat ini, * q = 3 bukannya 2. Setiap kali q2 memenuhi q dan p ada di ratusan tempat, kami menggunakan loop while untuk mengurangi * p sebanyak yang ada 1s di blok kiri * r2 (5 dalam contoh kita) dengan menggunakan rsebagai pointer berjalan. Kami sebenarnya menurunkannya sekali lagi sehingga angka terbesar berakhir pada −2, untuk alasan yang akan menjadi jelas nanti:
Setelah kami memproses semua angka, kami sekarang berada di akhir tahap 3. Di sini kami melakukan dua hal tunggal.
Anda sekarang mengerti bahwa kami terus menelusuri angka-angka, menemukan tempat saat ini (ditunjukkan oleh nilai non-1 * q ) dalam setiap angka, dan melakukan sesuatu tergantung pada nilai * q . Kita melihat bahwa * q mula-mula bertambah menjadi 2 (= menghitung nilai digit maksimum), lalu 3 (kurangi nilai digit maksimum dari setiap digit di tempat ini) dan kemudian kita kurangi dari itu untuk membuatnya negatif. Dari sana, itu akan terus naik hingga mencapai 1, sehingga mengembalikan nilai yang berarti "tidak melakukan apa-apa". Pada saat itu, kami pindah ke tempat berikutnya.
Sekarang, ketika * q negatif, kita mengeluarkan. * q berada pada nilai yang tepat sehingga kita akan menampilkan jumlah baris karakter yang benar sebelum mencapai 1; jika digit terbesar adalah 2, kita perlu menghasilkan 3 baris. Mari kita lihat apa yang terjadi pada setiap nilai * q :
'.'
(titik) atau':'
(titik dua). Kita memutuskan mana dengan melihat q : jika −1, kita berada di tempat yang sama, jadi output a':'
(yang kita hitung sebagai'8'
+2), jika tidak a'.'
.'|'
(pipa) dan kemudian menambah nilainya. Dengan cara ini akan mencapai −2 di tempat yang tepat dan kemudian kita output'.'
s /':'
s untuk sisa digit itu.'|'
(tetapi hanya jika keluar adalah nol, karena kalau tidak kita masih dalam tahap 2 atau 3).'.'
(dan keluaran ketiga a'|'
seperti sebelumnya).'|'
s terlepas dari * p ". Dengan cara ini kita mendapatkan lapisan di antara digit.Sekarang kita menambah q untuk pindah ke tempat berikutnya, puluhan tempat, dan kenaikan * q di sana. Di awal Tahap 2, rekaman itu terlihat seperti ini:
Kemudian kami melakukan Tahap 2 seperti sebelumnya. Ingat ini secara efektif mengurangi 2 dari setiap digit di tempat ini dan juga meninggalkan angka unary kiri * r2 yang menunjukkan digit maksimum. Kami meninggalkan nomor unary sebelumnya sendirian dan terus memperpanjang kaset ke kiri; itu hanya akan membutuhkan kode tambahan yang tidak perlu untuk "membersihkan". Ketika kita selesai dan kita bertambah * q , pada awal Tahap 3 rekaman itu sekarang:
Sebenarnya, ini bohong. Ingat sebelumnya di mana saya mengatakan kami menetapkan * (r - 4) ke 1 dan saya tidak memberi tahu Anda mengapa? Sekarang saya akan memberi tahu Anda alasannya. Ini untuk kasus-kasus seperti ini, di mana digit terbesarnya adalah 0, artinya semua digit di tempat ini adalah 0. Pengaturan * (r - 4) , ditunjukkan oleh panah tanpa label di atas, ke 1 memperpanjang angka unary dengan 1, tetapi hanya dalam kasus khusus ini. Dengan cara ini kita berpura-pura seolah digit terbesar adalah 1, yang berarti kita akan menghasilkan satu baris tambahan.
Setelah Tahap 3 (kurangi digit maksimum dari semua digit di tempat saat ini), termasuk langkah ekstra yang membuat * q negatif, rekaman itu terlihat seperti ini. Terakhir kali digit terbesar diwakili oleh −2 di blok * p , tapi kali ini mereka semua −3 karena mereka semua benar-benar nol tetapi kami berpura-pura seolah-olah digit maksimumnya adalah 1.
Sekarang mari kita lihat apa yang terjadi ketika * q berlanjut ke 1:
'|'
dan menambahnya.'|'
karena itulah yang selalu kita lakukan ketika * q = 0, terlepas dari * p .Jadi, kami mendapat dua baris pipa.
Akhirnya, kita memindahkan * q ke tempat seseorang. Yang ini menjadi menarik karena kita perlu menampilkan
':'
s jika digit sebenarnya adalah 1 tetapi 1'8'
jika 1. Mari kita lihat bagaimana hasil program. Pertama, kami menambahkan * q untuk memulai Tahap 2:Setelah Tahap 2 ("hitung nilai digit maksimum"), kita tinggal dengan ini:
Setelah Tahap 3 (“kurangi nilai digit maksimum dari semua digit di tempat saat ini”) rekaman itu terlihat seperti ini:
Sekarang mari kita lihat setiap iterasi * q secara bergantian:
':'
(daripada a'.'
karena q = −1).'|'
dan increment.'|'
. Namun, kali ini, alih-alih bertambah, kasus khusus memicu. Hanya jika kita mengeluarkan tempat terakhir ( q = −1), dan kita berada di baris kedua-terakhir untuk itu ( * q = −2), dan digit sebenarnya adalah 1 ( * p = −3) , lalu alih-alih menambahkannya ke −2, kami menetapkannya ke −1. Dengan kata lain, kita menggunakan −1 sebagai nilai khusus untuk menunjukkan bahwa pada iterasi berikutnya, kita perlu output'8'
sebagai gantinya':'
.':'
.'|'
. Kondisi khusus tidak terpicu karena * q tidak lagi −2. Karena itu, increment.'8'
.'|'
s di sini, tetapi dalam kasus khusus di mana kita berada di tempat yang ( q = −1), kita lewati itu.Setelah ini, q bertambah menjadi 0 dan loop sementara besar berakhir.
Sekarang Anda tahu bagaimana input suka
202,100,1
bekerja. Namun, ada satu lagi kasus khusus yang belum kami bahas. Anda mungkin ingat bahwa ketika kami sedang memproses tempat terakhir, ketika * p −3 kita atur ke −1 untuk1
(alih-alih menambahnya menjadi −2) sehingga iterasi berikutnya akan menghasilkan sebuah'8'
gantinya. Ini hanya berfungsi karena kami memiliki iterasi di mana * p adalah −3 dan kami membuat keputusan apakah akan menambahnya atau menetapkannya ke −1. Kami tidak memiliki iterasi seperti itu jika semua digit di tempat yang adalah 0 atau 1. Dalam kasus seperti itu semua nilai * p untuk 1s akan dimulai pada −2; tidak ada kesempatan untuk memutuskan untuk mengaturnya ke −1daripada menambahnya dari −3 . Karena itu, ada kondisi casing khusus lain di dalam Tahap 3 ("kurangi digit maksimum dari setiap digit di tempat saat ini"). Saya mengklaim bahwa setelah mengurangkan nilai digit maksimum dari setiap digit (pada titik mana digit maksimumnya berada pada −1), kami hanya menguranginya sekali lagi, tetapi sebenarnya ada kondisi yang menyatakan sebagai berikut:Jika digit yang kita lihat sama dengan digit maksimum di tempat ini ( * p = −1), dan tempat ini adalah tempat yang ( q = −1), dan digit maksimum adalah 1 ( * (r + 5) = 0, yaitu blok unary di paling kiri hanya 5 sel panjang), hanya kemudian kita meninggalkan * p di −1 untuk menunjukkan bahwa satu-satunya iterasi dari output harus menghasilkan suatu
'8'
. Dalam semua kasus lain, kami menurunkannya sekali lagi.Selesai Selamat Tahun Baru!
Sunting 1 (3183 → 3001): Beberapa golf Selamat Tahun Baru! Saya berhasil menyingkirkan variabel p2 dan r2 sepenuhnya! p sekarang berlari bolak-balik untuk terus menemukan awal dan akhir angka, tetapi tampaknya lebih pendek dalam kode. Saya mencoba untuk menghilangkan q2 juga, tetapi saya tidak bisa membuat kode lebih pendek seperti itu.
Saya juga menemukan beberapa tempat lagi di mana saya bisa menerapkan trik golf yang tidak dapat dibaca seperti menggunakan kembali nilai terakhir dari loop sementara. Untuk memberi Anda contoh, alih-alih
Saya dapat menyimpan
'""""
(lakukan yang pertama, kemudian yang kedua) dan'"""
(konstan 1) dengan menulisnya dengan cara yang sepertiTentu saja, ini hanya berfungsi jika saya tahu bahwa loop sementara akan berjalan untuk setidaknya satu iterasi, tetapi jika itu terjadi, nilai kembalinya adalah pd sehingga saya dapat menggunakannya sebagai syarat untuk if.
sumber
Javascript (ES6)
750744690604498346245234 byteSaya baru mengenal PPCG dan berpikir saya mungkin mencoba yang ini dan berpikir itu agak sederhana. Wah, ternyata aku salah !! Saya sudah mengusahakannya untuk sementara waktu dan saya harus banyak bermain golf ...
Saran sangat dianjurkan! - Meskipun masuk akal ini tidak akan menjadi tugas yang mudah.
Keluaran tali ketika input adalah array angka (misalnya:)
[204, 1]
.Penjelasan
Contoh
Input: Array angka:
[4,8,15,16,23,42]
Output:
sumber
Python 3,
624598595574561535532527525426345328324294288286283280267265255251245238235234230228 byteYah, karena pertanyaan ini membutuhkan jawaban, saya telah memberikan satu di sini, di mana input harus berupa string angka yang dipisahkan oleh spasi, seperti
"204 1"
. Wah, itu panjang. Saran golf (atau jawaban yang lebih baik) dipersilakan.Sunting: Bytes disimpan dengan mencampur tab dan spasi.
Sunting: Saya menyimpan banyak byte dengan mengubah cara saya memperoleh digit angka (membuat daftar dari string angka nol, kemudian di badan kode, transpos untuk mendapatkan ratusan digit, sepuluh digit, dll. .)
Sunting: Dan saya menyimpan lebih banyak dengan memasukkan
:8
loop terakhir ke dalam loop quipu utama.Sekarang seandainya saya bisa mengetahui mengapaMencari tahu dan solusinya mengambil terlalu banyak byte. (Juga jumlah byte turun karena entah bagaimana tab kembali menjadi empat spasi. Mungkin pemformatan blok kode di situs ini)b=d[j*v+i]==m(d[i::v])
tidak berhasil.Sunting: Saya mengatur ulang cara membuat quipus. Sekarang ia membuat satu untai pada satu waktu, kemudian transpos untuk dicetak.
Sunting: Mengubah jawaban saya kembali menjadi program Python 3 untuk menyimpan lebih banyak byte.
Sunting: Saya menemukan bug dalam kode saya yang membuatnya sehingga tidak mencetak nol di tengah angka dengan benar (lihat kotak uji di
204 1
atas). Dalam memperbaiki ini, saya berhasil golf :)Sunting: Saya mengubah pencetakan untuk menghemat 10 byte. Dan saya meletakkan semua hitungan byte lama kembali, hanya karena.
Sunting: Memotong tugas
v
penggunaanmap
selama empat byte. Penghargaan untuk CarpetPython , karena saya mendapat ide dari jawaban mereka di sini .Sunting: Mengubah tengah "untuk loop di dalam for loop", menjadi hanya satu untuk loop selama enam byte.
Edit: Sekarang menggunakan
enumerate
. Tidak lagi menggunakanl=len(z)
. Mengubah ternerif-else
menjadi daftar terner. Lihat di bawah untuk detailnya.Sunting: Sp3000 menyarankan sunting
print
dan sunting ke kondisi ternary yang masing-masing menyimpan satu byte.Tidak Disatukan:
sumber
0
, seperti0 12 4
.for r in zip(*x):print(''.join(r))
->print(''.join(r)for r in zip(*x))
C,
238235 byteMengandalkan C preprocessor untuk membuat kode sesingkat mungkin. Sebagai efek samping, juga membuatnya cukup banyak tidak terbaca.
Pada Ubuntu 14.04, Anda dapat mengkompilasi kode dengan lugas
gcc quipu.c
(abaikan peringatan). Contoh menjalankan executable:Diuji terhadap semua kasus uji OP.
Kode sumber tidak digabungkan:
sumber
Mathematica
436 453 357 352347 byteDi atas
IntegerDigits
; bantalan setiap angka dengan nol di sebelah kiri (untuk memastikan jarak yang sama); setiap nomor input, sekarang didekomposisi menjadi digit, sesuai dengan deretan array; setiap kolom mewakili nilai tempat. Array dipindahkan.Contoh
sumber
Transpose@Join
? Itu harus di, kan?R -
446444Saya melihat belum ada solusi R, jadi di sini ada satu. Fungsi ini mengambil vektor dengan bilangan bulat.
Tidak disatukan
sumber
if(v>0)
dalamif(i<r)
klausa Anda ? Apakah R menerima rentang sepertiz+1:z
kapanv==0
? Jika demikianq[z+1:z,j]
tidak akan terpengaruh sama sekali, saya akan berpikir. Juga, apakah R memilikielse
kata kunci dan semacamelse if
kata kunci? Jika demikian, Anda dapat bermain golf dengan beberapa persyaratan ini.if(v>0)
diperlukan karena jikav=0
, indeks akan keluar dari batas (yaitu, mencoba untuk mendapatkan baris nrow + 1). R memang memilikielse
, dan saya benar-benar mencoba saran Anda dan digunakan dielse
mana mungkin, tetapi ternyata jumlah byte yang sama.