Tantangan ini sederhana. Diberi nomor, keluaran representasi ascii-art dari angka, menggunakan sistem angka Maya-20 Base.
Apa itu sistem Maya?
Bangsa Maya menggunakan basis 20 untuk menyimpan angka, jadi posisi pertama adalah 1
tempat, berikutnya 20
tempat, kemudian 400
, dll.
Jumlah Jadi Maya 1
adalah 1
dalam basis 10, tapi 10
sebenarnya 20
dalam basis 10, 207
adalah 807
dalam basis 10, dll ..
Dan mereka mewakili jumlah mereka sebagai piktograf, dengan simbol khusus untuk 0
.
-------------------
| | | | |
| | | | |
|-------------------|
| |
| |
-------------------
Itu nol mereka. (Setidaknya setengah picascii setengah artistikness ascii art version)
Itu adalah gambaran nyata dari simbol nol Maya. 1
Ini adalah lima mereka:
--------------------------------
| |
--------------------------------
Dan 4:
---- ---- ---- ----
| | | | | | | |
| | | | | | | |
---- ---- ---- ----
Akhirnya, untuk menyatukannya:
---- ---- ----
| | | | | |
| | | | | |
---- ---- ----
--------------------------------
| |
--------------------------------
--------------------------------
| |
--------------------------------
Jadi mereka memiliki x//5
bar, dan x%5
titik di atas bar. Dan jika x=0
, mereka menggunakan shell / roti bukannya ruang kosong.
Untuk lebih banyak gambar, coba halaman Wikimedia Commons dari gambar angka Maya .
Tapi ini hanya untuk angka hingga 19
. Kami tidak diizinkan memiliki lebih dari satu 4
bar dan 4
titik dalam satu 'cerita' ... Jadi, kami naik!
Output untuk 20 adalah:
----
| |
| |
----
-------------------
| | | | |
| | | | |
|-------------------|
| |
| |
-------------------
Perhatikan ini biasanya tidak valid, karena memiliki 1
dan 0
pada saat yang sama. Tetapi 3
(perhatikan bahwa, jawaban Anda memerlukan setidaknya 3) baris baru sebelum nilai 0
tempat baru.
Cerita dasar memiliki titik, makna 1
, dan makna batangan 5
. Tetapi sebenarnya memiliki makna titik 20^0
dan makna bar 20^0 * 5
.
Setiap cerita naik kekuatan. Titik-titik cerita kedua berarti 20
( 20^1
) dan 100
( 20^1 * 5
).
Jadi jumlahnya 506
dapat direpresentasikan sebagai:
----
| |
| |
----
--------------------------------
| |
--------------------------------
----
| |
| |
----
--------------------------------
| |
--------------------------------
Ini (20^0) * 1 + (20^0 * 5) * 1 + (20^1 * 5) * 1 + (20^2) * 1 = 1 + 5 + 100 + 400 = 506
.
Misi Anda, jika Anda memilih tidak atau memilih untuk (tidak masalah), adalah untuk menghasilkan representasi seni ASCI dari nomor base-10.
Aturan lain:
- Leading / trailing space tidak apa-apa, selama titik, bar, dan cangkang utuh.
- Batang, titik, dan cangkang harus persis seperti apa yang dimiliki oleh uji kasus. Tidak mengubah ukuran.
- Memimpin '0 tidak apa-apa. (shell terkemuka pada output)
- Anda tidak harus memiliki persis 3 baris baru antara setiap nilai tempat atau cerita, cukup setidaknya 3.
Kasus uji:
15
--------------------------------
| |
--------------------------------
--------------------------------
| |
--------------------------------
--------------------------------
| |
--------------------------------
12
---- ----
| | | |
| | | |
---- ----
--------------------------------
| |
--------------------------------
--------------------------------
| |
--------------------------------
4
---- ---- ---- ----
| | | | | | | |
| | | | | | | |
---- ---- ---- ----
0
-------------------
| | | | |
| | | | |
|-------------------|
| |
| |
-------------------
24
----
| |
| |
----
---- ---- ---- ----
| | | | | | | |
| | | | | | | |
---- ---- ---- ----
33
----
| |
| |
----
---- ---- ----
| | | | | |
| | | | | |
---- ---- ----
--------------------------------
| |
--------------------------------
--------------------------------
| |
--------------------------------
20
----
| |
| |
----
-------------------
| | | | |
| | | | |
|-------------------|
| |
| |
-------------------
1: Mereka juga menggunakan kepala para dewa untuk simbol-simbol, tetapi untuk tantangan ini peti / roti / zelda akan digunakan.
but for this challenge the shell/bread will be used.
. Bukan kulit, bukan roti. Tautan LOZ ke dada sebelumnya.Jawaban:
Ruby,
223180177179 byteFungsi anonim, mengembalikan string multiline.
Lupa menambahkan spasi tambahan yang diperlukan, dan juga rekursi. Juga bermain golf sedikit lebih dengan menggeser sesuatu di sekitar.
sumber
Python 3.5,
404400392312311308290281285281 byte:( Terima kasih kepada Adnan untuk tip menghemat 9 byte (
290->281
) dan Neil untuk tip menghemat 4 byte (285->281
)! )Cobalah online! (Ideone)
Analisis
Untuk keperluan analisis ini, kita akan menggunakan set karakter
0123456789ABCDEFGHIJ
untuk mewakili setiap digit dalam basis 20.Jadi, saya bisa saja mengubah basis 10 menjadi basis 20 menggunakan salah satu dari dua algoritma yang saya miliki. Algoritma pertama yang saya pikirkan untuk digunakan adalah apa yang saya sebut algoritma kekuatan . Ini bukan yang saya gunakan dalam kode karena itu akan membuatnya lebih lama dari yang seharusnya, jadi saya tidak akan berbicara tentang ini. Namun, saya memang membuat skrip python yang mengubah bilangan bulat apa pun di basis 10 menjadi basis lain yang disediakan menggunakan metode ini, yang dapat Anda gunakan di sini di repl.it. Yang saya gunakan sebagai gantinya untuk tantangan ini adalah apa yang saya sebut algoritma pembagian , yang menurut saya dijelaskan cukup baik di sini. Tetapi pada dasarnya apa yang terjadi adalah bahwa dibutuhkan nomor basis 10 yang disediakan dan membaginya dengan basis yang perlu dikonversi ke angka, yang dalam hal ini adalah 20, sampai sisanya adalah 0 atau 1. Kemudian diperlukan kuotiant dan sisanya , dalam urutan itu, dari operasi divisi terakhir , dan kemudian semua sisa lainnya dari operasi divisi lainnya dalam urutan dari yang terakhir hingga yang pertama. Semua digit ini kemudian disatukan, dan urutan yang digabungkan itu dibalik adalah nomor basis 10 Anda di basis 20! Untuk mengilustrasikan ini, anggap Anda ingin mengonversi nomor basis 10
431
ke basis 20. Jadi, apa yang akan kami lakukan adalah ini:Kemudian, akhirnya kita akan mengambil daftar yang kita miliki, yang dalam hal ini berisi
B11
, dan membalikkannya sehingga sekarang kita miliki11B
. Dalam melakukan ini, kami akhirnya mendapatkan jawaban akhir kami! 431 di basis 10 dikonversi ke basis 20 adalah11B
, yang dapat dikonfirmasi menggunakan skrip Python saya yang menggunakan algoritma kekuatan yang sudah saya bagikan tautan di atas, tetapi saya akan melakukannya lagi di sini . Berikut ini adalah salah satu yang juga menggunakan algoritma pembagian yang dijelaskan dalam jawaban ini dan mengembalikan jawaban yang sama dengan yang kekuatan.Seluruh proses ini pada dasarnya apa yang terjadi dalam naskah saya dalam
while
lingkaran:while not p or z:p+=[z%20];z=z//20
. Satu-satunya perbedaan adalah bahwa nomor>9
yang tidak direpresentasikan sebagai huruf melainkan sebagai diri mereka sendiri.Pindah, setelah nomor basis 10 telah dikonversi ke basis 20, untuk setiap digit dalam basis 20 integer, yang akan kita panggil
g
,g mod 5
titik-titik dicetak dang//5
bar kemudian dicetak. Kemudian program mencetak 3 baris kosong dan beralih ke digit berikutnya. Namun, jika digitnya adalah0
, maka satu "roti" dicetak diikuti oleh 3 baris baru, dan kemudian program bergerak ke digit berikutnya. Jadi, dengan mengambil nomor basis 2011B
, kita pergi ke digit pertama. Digit pertama adalah1
, dan karena itu akan mencetak 0 bar sejak1//5=0
, dan 1 titik sejak1%5=1
. Jadi, pertama-tama kita akan mendapatkan ini:dan kemudian 3 baris baru. Beralih ke digit kedua, kita juga melihat bahwa itu adalah 1, sehingga akan menghasilkan hal yang sama:
dan juga 3 baris baru. Akhirnya, pindah ke digit terakhir, kita melihat bahwa itu a
B
. SejakB=11
di base 20, program akan menghasilkan 1 dot sejak11%5=1
dan 2 bar sejak11//5=2
. Jadi sekarang, kita dapatkan ini:Akhirnya, menyatukan semua ini, kita mendapatkan ini:
Dan, itulah angka utama untuk 431! Anda akhirnya memiliki nomor basis 10 Anda yang diwakili dalam angka 20 angka Maya dasar.
Catatan: Anda mungkin atau mungkin tidak memperhatikan
lambda
fungsi itu dalam kode saya. Apapun, fungsi ini digunakan untuk pembuatan titik-titik karena banyak titik harus dihasilkan bersebelahan.sumber
S,N,M,X=' -|\n'
bukanS,N,M,X=' ','-','|','\n'
?401
mengandung nol di dalam.Python 3, 243 byte
Diskusi
n//20and m(n//20)
panggilanm()
secara rekursif jika ada kekuatan yang lebih tinggi dari 20 untuk ditangani. Rekursi dilakukan sebelum mencetak nilai tempat saat ini, sehingga kekuatan yang lebih tinggi dapat dicetak terlebih dahulu.Jika nilai tempat saat ini adalah nol (r! = 0), maka
for a,b,f
-loop mencetak unit dan kemudian lima.a
adalah baris pertama / keempat dan barisb
kedua / ketiga. Kuncinya ada diprint(*((a,b,b,a)*f),sep=x)
. Untuk unit, f = 1 menghasilkanprint(*(a,b,b,a),sep=x)
, yang mencetak 4 baris yang membentuk simbol satuan (x adalah a '\ n'). Untuk balita, f = jumlah balita untuk dicetak (r // 5), sehingga tupel (a, b, b, a) dikalikan (yaitu, diulang) dengan jumlah balita yang akan dicetak. Jika f = 2, kita dapatkanprint(*(a,b,b,a,a,b,b,a),sep=x)
, yang mencetak dua simbol untuk lima.Jika nilai tempat saat ini adalah 0, maka simbol nol dicetak.
sumber
Python, 411 byte
Saya membuat ini untuk menghasilkan kasus uji, Anda dapat menggunakannya sebagai patokan. Agak golf.
sumber
s=math.sqrt
dan memanggils(s(w))
alih-alihmath.sqrt(math.sqrt(w))
w**0.25
bahkan lebih baik daripadas(s(w))
. Meski sudah lebih lama?JavaScript (ES6), 254 byte
sumber
Missing } in template expression
. Saya tidak tahu banyak. Bagaimana cara memperbaikinya?Python 3, 213 byte
Datang dengan versi yang lebih pendek menggunakan pendekatan yang berbeda:
penjelasan
9 baris pertama atau lebih, buat string yang digunakan untuk membuat simbol
Inti dari solusi adalah fungsi rekursif
m
, yang membangun daftar string, satu string untuk setiap baris dalam output. Secara skematis,m
terlihat seperti:m
dapat ditulis ulang seperti:Panggilan rekursif didahulukan
m(n//20)
sehingga angka yang paling signifikan dilakukan terlebih dahulu.[n%5*a,n%5*b,n%5*b,n%5*a]
adalah string untuk simbol seseorang.a
adalah baris teratas untuk satu simbol.n%5
adalah jumlah satu simbol untuk digit ini. Jadi,n%5*a
adalah string untuk baris atas (dan bawah)n%5
. Demikian pula, 'n% 5 * b` adalah string untuk baris ke-2 (dan ke-3).Ekspresi
[:n%5*4]
bertindak sepertiif
untuk menghindari garis kosong tambahan dalam output jika tidak ada 'yang' untuk output. Itu tidak diperlukan, tetapi membuat output terlihat lebih baik.n%20//5
adalah jumlah simbol untuk lima yang dibutuhkan.[c,d,d,c]
adalah string untuk membuat satu simbol untuk lima.[t,w,w,v+h*19+v,y,y,t]
adalah string untuk membuat simbol nol[x,x]
menempatkan setidaknya tiga garis kosong antara kelompok digit Mayasumber