Tantangan
Diberikan representasi ASCII dari nomor Babel sebagai input, output angka dalam angka Arab Barat.
Sistem Angka Babilonia
Bagaimana orang Babilonia menghitung? Menariknya, mereka menggunakan sistem Base 60 dengan elemen sistem Base 10. Pertama mari kita perhatikan kolom unit sistem:
Bangsa Babilonia hanya memiliki tiga simbol: T
(atau, jika Anda dapat menerjemahkannya:) 𒐕
yang mewakili 1, dan <
(atau, jika Anda dapat menerjemahkannya:) 𒌋
yang mewakili 10, dan \
(atau, jika Anda menerjemahkannya:) 𒑊
yang mewakili nol.
Catatan: Secara teknis, \
(atau 𒑊
) bukan nol (karena orang Babel tidak memiliki gagasan 'nol'). 'Nol' ditemukan kemudian, demikian \
juga simbol placeholder ditambahkan kemudian untuk mencegah ambiguitas. Namun, untuk keperluan tantangan ini, cukup untuk dianggap \
sebagai nol
Jadi, di setiap kolom Anda hanya menambahkan nilai simbol, misalnya:
<<< = 30
<<<<TTTTTT = 46
TTTTTTTTT = 9
\ = 0
Tidak akan ada lebih dari lima <
atau lebih dari sembilan T
di setiap kolom. \
akan selalu muncul sendiri di kolom.
Sekarang, kita perlu memperluas ini untuk menambahkan lebih banyak kolom. Ini bekerja persis sama dengan basis enam puluh lainnya, di mana Anda mengalikan nilai kolom paling kanan dengan , yang ke kiri dengan 60 1 , yang ke kiri dengan 60 2 dan seterusnya. Anda kemudian menjumlahkan nilai masing-masing untuk mendapatkan nilai angka.
Kolom akan dipisahkan oleh spasi untuk mencegah ambiguitas.
Beberapa contoh:
<< <TT = 20*60 + 12*1 = 1212
<<<TT \ TTTT = 32*60^2 + 0*60 + 4*1 = 115204
Aturan
- Anda bebas menerima input ASCII (
T<\
) atau input Unicode (𒐕𒌋𒑊
) - Nomor yang dimasukkan akan selalu di bawah
- The
<
s akan selalu ke kiriT
s di setiap kolom \
akan selalu muncul sendiri di kolom
Kemenangan
Kode terpendek dalam byte menang.
sumber
<<<<TTTTTT <TTTTTTT <<<<TTTTTT <<<<
"How did the Babylonians count? Interestingly, they used a Base 60 system with an element of a Base 10 system."
Yang masih digunakan sampai sekarang; sistem angka Babel persis seperti yang kita gunakan untuk jam. Dua digit desimal masing-masing selama detik, menit, dan jam, 60 detik ke menit, 60 menit ke jam.Jawaban:
JavaScript (ES6), 44 byte
Mengambil input sebagai array karakter ASCII.
Cobalah online!
Bagaimana?
Sistem Angka Babilonia dapat dilihat sebagai bahasa 4-instruksi yang bekerja dengan satu register - sebut saja akumulator.
Dimulai dengan , setiap karakter c dalam larik input a memodifikasi akumulator k sebagai berikut:k = 0 c Sebuah k
space
: kalikan dengan 60 (diimplementasikan sebagai: tambahkan 59 k ke k )<
: tambahkan ke kT
: increment\
: tidak melakukan apapun; ini adalahNOP
instruksi dari bahasa ini (diimplementasikan sebagai: tambah hingga k )sumber
C (gcc) ,
140138136 byteCobalah online!
sumber
Perl 6 , 39 byte
-3 byte terima kasih kepada nwellnhof
Cobalah online!
Menggunakan karakter paku.
Penjelasan:
sumber
{:60[.words>>.&{sum (.ords X%151)X%27}]}
(40 byte)Jelly ,
1312 byteTautan monadik yang menerima daftar karakter yang menghasilkan bilangan bulat.
Cobalah online!
Bagaimana?
Lain 12:
ḲO⁽¡€%:5§ḅ60
(⁽¡€
adalah1013
, jadi ini modulos1013
denganO
nilai-nilai rdinal mendapatkan53
,5
dan1
untuk<
,T
,\
masing-masing kemudian melakukan bilangan bulat divisi,:
dengan5
mendapatkan10
,1
dan0
)sumber
05AB1E , 13 byte
Cobalah online!
Untuk menebus betapa malasnya saya dengan jawaban Jelly saya, berikut ini adalah kiriman di 05AB1E xD.
sumber
8740
?•Yη•
(4 byte)1|Ç7%-13%O60β
juga 13 - apakah golf?Python 2 ,
96938785 byteCobalah online!
Disimpan:
sumber
(ord(c)%5/2or 11)-1
8740%ord(c)/4
Excel VBA, 121 byte
Terbatas untuk Office 32-Bit yang
^
berfungsi sebagaiLongLong
tipe literal dalam versi 64-BitMembawa input dari sel
A1
dan output ke jendela langsung vbe.Tidak Disatukan dan Dikomentari
sumber
Dyalog APL ,
3330 byteCobalah online!
Edit: -3 byte terima kasih kepada ngn
'\ T<'⍳
mengganti karakter dengan angka (posisinya di string konstan), dan⌽
membalikkan input sehingga 'digit' yang paling signifikan adalah yang terakhir. Hal ini memungkinkan+\2=
untuk menjaga hitungan berjalan dari kekuatan yang diinginkan dari 60 (diterapkan oleh60*
) dengan menghitung berapa kali spasi (indeks 2 dalam konstanta string) ditemui.⌊10*⍵-3
memberikan kekuatan sepuluh yang diinginkan untuk setiap karakter. Urutan karakter dalam konstanta string dan -3 offset menyebabkan '\' dan ruang untuk pergi ke angka negatif, menghasilkan pecahan ketika karakter tersebut dinaikkan ke kekuatan 10, yang memungkinkan mereka dihilangkan oleh⌊
.Yang harus kita lakukan sekarang adalah mengalikan kekuatan-dari-10 digit dengan nilai-nilai kekuatan-dari-60 tempat dan menjumlahkannya
+/
.sumber
' '
:{+/(⌊10*⍵-3)×60*+\2=⍵}'\ T<'⍳⌽
Python 2 , 62 byte
Cobalah online!
Ini menggunakan teknik dari jawaban Arnauld .
sumber
Kanvas ,
201716 byteCoba di sini!
Penjelasan:
sumber
APL (NARS ⎕io ← 0), 28 karakter, 56 byte
beberapa tes dengan jenis cek:
Setiap jenis hasil adalah angka.
sumber
JavaScript (Node.js) ,
12211410710683 byteCobalah online!
Saya sedikit terobsesi dengan operasi array "gaya fungsional", menggunakan input ASCII, sejauh yang saya tahu, JS tidak terlalu pandai mendapatkan kode-kode golfily
Saya menyimpan ini untuk anak cucu, tetapi ini adalah solusi yang naif / bodoh, saya sarankan Anda memeriksa jawaban Arnauld yang jauh lebih menarik dari implementasi tantangan
sumber
c<'T'
bekerja di tempatc=='<'
&&
dengan|
.for...of
loop: PRetina ,
292623 byteCobalah online! Menggunakan pemisahan baris baru, tetapi tautan menyertakan tajuk untuk menggunakan spasi sebagai gantinya untuk kenyamanan. Sunting: Disimpan 3 byte dengan bantuan dari @KevinCruijssen. Menyimpan 3 byte lebih lanjut berkat @FryAmTheEggman. Penjelasan:
Ganti masing
<
- masing dengan 10T
detik.Ambil baris pertama, kalikan dengan 60, dan tambahkan baris berikutnya. Kemudian ulangi sampai hanya ada satu baris yang tersisa.
Hitung
T
s.Versi 51 byte yang lebih cepat:
Cobalah online! Menggunakan pemisahan baris baru, tetapi tautan menyertakan tajuk untuk menggunakan spasi sebagai gantinya untuk kenyamanan. Penjelasan:
Cocokkan setiap baris satu per satu, dan hitung jumlah
T
s dan 10 kali jumlah<
s. Ini mengubah setiap baris menjadi nilai "digit" basis-60.Basis konversi 60, menjalankan baris pada suatu waktu. Perhitungan dilakukan dalam desimal untuk kecepatan.
sumber
<
tanpa+
, kecuali saya tidak melihat semacam tepi case.$&
sekarang selalu satu karakter, saya dapat menggunakan karakter default, menyimpan dua byte lebih lanjut!_
lama$*
di versi Retina default sebelumnya1
.<
sebagai pertandingan tunggal dan ulangi 10 kali panjangnya (jumlah<
dalam pertandingan), dan perubahan yang saya usulkan berulang setiap<
10 kali secara terpisah (yang telah Anda golf 2 byte lebih banyak menggunakan implisit 1 dengan10*
). Sekarang saya lebih mengerti mengapa+
awalnya ada di sana. Saya tidak tahu terlalu banyak tentang Retina builtins, hanya regex secara umum, maka perubahan yang saya usulkan karena saya sudah membacanya berulang setiap>
10 kali. ;)Bash (dengan sed dan dc), 50 byte
Membawa input yang dibatasi ruang
stdin
, dari menjadistdout
Cobalah online!
Penjelasan
Menggunakan sed untuk mengubah input dengan sekelompok kecocokan ekspresi reguler hingga, misalnya, input
<<<TT \ TTTT
telah ditransformasikan menjadiA+A+A+1+1+60*60*1+1+1+1+
. Kemudian input ini diumpankan ke dc dengan perintah eksekusi input eksplisit?
, didahului olehz
(mendorong panjang stack (0) ke stack sehingga kita memiliki tempat untuk menambahkan tambahan) dan diikuti olehp
(cetak).sumber
J ,
3430 byteCobalah online!
sumber
Dyalog APL,
3532 byteCobalah online!
31 dalam dzaima / APL
sumber
Noether , 55 byte
Cobalah online!
Pendekatan yang sama dengan @Arnauld.
sumber
Arang , 26 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Kosongkan hasilnya.
Ulangi karakter input. The
≡
perintah dibungkus dalam blok untuk mencegah menemukan "default" blok.Beralih dari karakter saat ini ...
jika itu spasi maka kalikan hasilnya dengan 60 ...
jika a
<
maka tambahkan 10 ke hasilnya ...jika itu
T
maka kenaikan hasilnya.Cetak hasilnya.
sumber
R ,
9881 byteCobalah online!
Sangat panjang karena penguraian string.Terima kasih Giusppe untuk mencukur 16 byte yang tidak perlu.Tentukan
y
nilai bytecode dari input unicode danR = y("T<\") = y("𒐕𒌋𒑊")
Amati itu
R%%3 = 1,2,0
danR%%6 = 1,5,0
... jadiR%%3 * R%%6 = 1,10,0
!Sisanya mudah: jumlah per kolom, kemudian produk-titik dengan kekuatan menurun 60.
sumber
scan(,"")
terpecah pada spasi secara otomatis?/60
dapat diganti dengan-1
ekspresi eksponen untuk byte lain, ditambah<-
dapat diganti oleh=
karena itu semua di dalam tanda kurung.Ruby ,
5046 byteCobalah online!
Port dasar jawaban Arnauld ditingkatkan oleh GB untuk -4 byte.
sumber
C (gcc) ,
656463 byteCobalah online!
sumber
return o
dengans=o
menyimpan 5 byte lainnya.Java 8,
6460 byte-4 byte terima kasih kepada @ceilingcat .
Cobalah online. Penjelasan:
sumber
Perl -F // -E, 39 byte
Ini membaca nomor yang akan dikonversi dari STDIN.
Ini penting untuk solusi yang sama seperti yang diberikan oleh @Arnauld menggunakan JavaScript.
sumber
F #, 128 byte
Cobalah online!
Ungolfed akan terlihat seperti ini:
Seq.mapFoldBack
menggabungkanSeq.map
danSeq.foldBack
.Seq.mapFoldBack
iterates melalui urutan mundur, dan utas nilai akumulator melalui urutan (dalam hal ini,i
).Untuk setiap elemen dalam urutan, angka Babel dihitung (oleh
Seq.sumBy
, yang memetakan setiap karakter ke angka dan total hasilnya) dan kemudian dikalikan dengani
.i
kemudian dikalikan dengan 60, dan nilai ini kemudian diteruskan ke item berikutnya dalam urutan. Keadaan awal untuk akumulator adalah 1.Misalnya, urutan panggilan dan hasil
Seq.mapFoldBack
input<<<TT \ TTTT
adalah:Fungsi akan mengembalikan tuple
seq<int>, int
. Thefst
mengembalikan fungsi item pertama dalam tuple itu, danSeq.sum
melakukan penjumlahan yang sebenarnya.Mengapa tidak menggunakan
Seq.mapi
atau serupa?Seq.mapi
memetakan setiap elemen dalam urutan, dan menyediakan indeks ke fungsi pemetaan. Dari sana Anda bisa melakukannya60 ** index
(di mana**
operator daya di F #).Tetapi
**
membutuhkanfloats
, tidakints
, yang berarti bahwa Anda perlu menginisialisasi atau melemparkan semua nilai dalam fungsi sebagaifloat
. Seluruh fungsi akan mengembalikan afloat
, yang (menurut saya) agak berantakan.Menggunakannya
Seq.mapi
dapat dilakukan seperti ini untuk 139 byte :sumber
Tcl , 134 byte
Cobalah online!
Dalam daftar terbalik, saya loop menambah hasil dalam penghitungan
<
danT
(dengan-all
opsi regexp) dan menambah kekuatan alami 60.Versi yang benar (lihat komentar)
sumber
regsub {\\} $l0 l
sebelum loop foreach ....APL (Dyalog Extended) , 18 byte SBCS
Fungsi awalan diam-diam anonim.
Cobalah online!
sumber
05AB1E (warisan) , 10 byte
Cobalah online!
05AB1E , 11 byte
Cobalah online!
Algoritma yang sama, tetapi di 05AB1E modern
O
tidak bekerja pada daftar int dan daftar campuran, jadi kita perlu€O
sebagai gantinya.sumber