Dari artikel Wikipedia :
Aritmatika lokasi (Latin arithmeticæ localis) adalah sistem angka biner aditif (non-posisional), yang dieksplorasi John Napier sebagai teknik perhitungan dalam risalahnya Rabdology (1617), baik secara simbolis maupun pada kotak seperti papan catur.
Apa?
Angka lokasi adalah cara penulisan angka menggunakan huruf alfabet.
Notasi biner belum distandarisasi, sehingga Napier menggunakan apa yang disebutnya angka lokasi untuk mewakili angka biner. Sistem Napier menggunakan notasi nilai-tanda untuk mewakili angka; menggunakan huruf berturut-turut dari alfabet Inggris untuk mewakili kekuatan dua: berturut-turut: a = 2 ^ 0 = 1, b = 2 ^ 1 = 2, c = 2 ^ 2 = 4, d = 2 ^ 3 = 8, e = 2 ^ 4 = 16 dan seterusnya.
Sebuah contoh
ab
= 1 + 2 = 3 pada basis 10
aabb
= 1 + 1 + 2 + 2 = 6 di basis 10
Catatan yang aabb
dapat disingkat menjadi bc
dengan mengganti 2 contoh surat dengan yang lebih tinggi.
Tambahan
Anda baru saja menggabungkan dua angka dan menyederhanakan.
acd
+ bde
= acdbde
= abcdde
= acebe
= abcf
= 39
pada basis 10
Pengurangan
Hapus saja semua digit yang tampak sama di kedua bagian pengurangan. Perluasan (konversi b
ke aa
) mungkin diperlukan
abde
- ad
= be
= 18 dalam basis 10
Perkalian
Ini agak sulit.
Katakanlah kita ingin mengalikan acd
(13) dengan def
(56). Pertama Anda mengatur acd
secara vertikal:
a
c
d
Kemudian Anda tambahkan def
setelah yang pertama a
:
a def
c
d
Sekarang, c adalah 2 posisi kemudian dalam abjad dari, jadi kita tambahkan 2 posisi dalam alfabet untuk def
untuk membuat fgh
. Itu ditambahkan ke baris kedua.
a def
c fgh
d
Terakhir, d adalah 1 posisi kemudian dalam alfabet dari c, jadi kami menambahkan 1 posisi dalam alfabet fgh
untuk dibuat ghi
. Itu ditambahkan ke baris ketiga.
a def
c fgh
d ghi
Kemudian Anda mengambil jumlah dari kanan: def
+ fgh
+ ghi
= deffgghhi
= deggghhi
= deghhhi
= deghii
= deghj
(728)
Contoh lain dari perkalian
Memasukkan:
bc * de
Pertama:
b
c
Kemudian
b ef
c
Kemudian
b ef
c fg
Perhatikan bahwa kami menulis ef
di baris pertama. Itu karena bc
dimulai dengan b
, dan b
merupakan huruf kedua dalam alfabet, jadi kita perlu beralih de
dengan 1 huruf, jadi itu menjadi ef
.
Kemudian
ef+fg
Keluaran:
eh
Divisi
Ini bukan bagian dari tantangan ini, karena ini bisa menjadi sangat kompleks.
Tantangan Anda yang sebenarnya
Program atau fungsi Anda harus mengambil input sebagai string yang terlihat seperti ini:
a + b
Dan Anda harus menampilkan:
ab
Tentu saja, program atau fungsi harus mendukung nomor panjang sewenang-wenang (sampai string atau masukan batas bahasa Anda) dengan salah satu operator +
, -
atau *
. Beberapa contoh lagi:
Memasukkan:
ab + bd
Keluaran:
acd
Memasukkan:
d - ab
Keluaran:
ac
Memasukkan:
ab * cd
Keluaran:
cf
Catatan:
- Urutan huruf dalam output tidak masalah, tetapi Anda selalu dapat mengasumsikan bahwa urutan huruf dalam angka dalam input akan naik (sebelum z).
- Anda dapat mengambil input dengan trailing newline dan output dengan trailing newline.
- Anda mungkin tidak mengambil input sebagai daftar
ab
,*
danbd
untukab * bd
. - Alfabet bahasa Inggris digunakan (
abcdefghijklmnopqrstuvwxyz
) - Output Anda harus disederhanakan (
aa
tidak diizinkan,b
diperlukan) - Input akan disederhanakan (
b
+c
, bukanaa
+bb
atauaa
+aaaa
) - Anda mungkin memerlukan ruang sebelum dan operator (
+
,-
, atau*
), atau Anda mungkin memerlukan ada menjadi tidak ada. - Hanya akan ada satu operator per input.
- Anda dapat berasumsi bahwa output dan input tidak akan pernah melebihi 2 ^ 27-1 (
abcdefghijklmnopqrstuvwxyz
) - Ini kode-golf , jadi jawaban tersingkat dalam byte menang!
sumber
d is 2 positions later in the alphabet than c
apakah ini wright? bukankah seharusnya begitu1
?That is added to the second row.
pada kalimat yang sama, bukankah begituthird
?bc*de==efgh
tapiefgh
ini240
tidak144
bc*de
seharusnyaeh
Jawaban:
Jelly ,
2625 byteMenggunakan operator Jelly (
×
bukan*
dan_
bukan-
) dalam string input sebagaimana diizinkan oleh OP .(Membutuhkan ruang di sekitar operator)
Cobalah online! atau lihat test suite
Bagaimana?
sumber
Mathematica, 168 byte
Solusi awal saya (sebelum posting diedit untuk mengklarifikasi bahwa output harus disederhanakan) adalah
64
byte lebih pendek:Ini hanya mengubah solusi itu agar berfungsi. Mungkin lebih pendek untuk benar-benar menggunakan metode yang dijelaskan dalam tantangan, tetapi saya tetap ingin menerapkannya.
Penjelasan:
Mengganti setiap urutan huruf dengan integer yang sesuai dengan kode karakter aritmatika, kemudian mengubah string yang dihasilkan menjadi ekspresi (yang secara otomatis akan menyederhanakan menjadi integer), kemudian menghasilkan string
a
karakter dengan panjang sama dengan integer itu, dan akhirnya menggantikan identik yang berdekatan karakter dengan kode karakter berikutnya hingga titik tetap tercapai.sumber
JavaScript (ES6),
136134133 byteDisimpan 1 byte berkat Luke
Uji kasus
Tampilkan cuplikan kode
sumber
Perl 5 , 95 byte
94 byte kode +
-p
bendera.Cobalah online!
Tiga langkah di sini:
-
s/\w/a x 2**(-97+ord$&)/ge;
Mengkonversi input menjadi stringa
saja.-
s/(.*)-\1|+//;/*/&&($_=$`x length$')
akan mengeksekusi operator (yang sangat sederhana pada stringa
):+
adalah rangkuman,-
berarti melepaskan dari bagian pertama sebanyak yanga
ada di bagian kedua, dan*
berarti menduplikasi bagian pertama sebanyak yang adaa
di bagian kedua bagian.-
1while s/(.)\1/chr 1+ord$1/e
melipat huruf yang sama berturut-turut menjadi huruf berikutnya dalam alfabet.sumber
05AB1E , 29 byte
Cobalah online! atau sebagai Test suite
Penjelasan
sumber
C & x86 asm, 340 Bytes
Kompilasi dengan -O0
Penjelasan
Karena C tidak punya
eval()
, saya menggunakan tabel instruksi x86 sebagai gantinya. Saya harus memilih instruksi yang panjangnya sama (atau diisi dengan nops), dan yang diharapkan src dan tujuan dari jenis yang sama. Yang sangat mengganggu adalah bahwa MUL hanya dapat menulis ke register, dan opcode MUL 1-byte hanya dapat menulis ke EAX. Selain itu, sepertinya tidak ada instruksi SUB register-writing yang dikurangi dari memori, bukan sebaliknya, maka XCHG.sunting
Karena ditanya dalam komentar, penilaian yang lebih tradisional akan terlihat seperti ini:
Ini sebenarnya sedikit lebih pendek, pada 301 karakter, karena beberapa alasan: 1. Karena harus ada banyak fungsi, overhead masing-masing dapat dipotong dengan beberapa aturan preprosesor. 2. Linux modern melindungi dari eksekusi pada stack, sehingga panggilan mprotect () untuk menonaktifkan 34 byte ini dikorbankan. 3. Panggilan XCHG sangat sub-optimal, dengan biaya 30 byte lagi. Jika bukan karena hal-hal itu, kombo x86 akan menang sekitar 10-20 byte.
Juga cincang 2 byte dari keduanya dengan meningkatkan panggilan islower () di g.
sumber
GNU sed + coreutils, 329 bytes
Ya, saya tidak tahu apa yang merasuki saya, tapi setidaknya saya tahu skrip sedikit lebih baik sekarang. Perhatikan bahwa solusi ini memerlukan
e
ekstensi sed GNU , yang menjalankan perintah shell.Saya berasumsi bahwa tidak akan ada ruang di sekitar operator. Dari terminal saya:
Dan, bagi mereka yang lebih waras daripada saya: versi komentar!
sumber
sed: file golf.sed line 24: ":" lacks a label
PHP, 168
Output Naik dengan menggunakan eval
PHP, 185 Bytes
Output Naik
Versi Online
Diperluas
PHP, 201 Bytes
Output Decending
Versi Online
Diperluas
sumber
Python 3 ,
176167 byteCobalah online!
sumber
m>=2**(t+1)
denganm>=2**t*2
, dan lima byte dengan menggantia=a.split();m=eval(i(a[0])+a[1]+i(a[2]))
dengan sesuatu sepertib,c,d=a.split();m=eval(i(b)+c+i(d))
.2**(ord(i)-97)
dengan1<<ord(i)-97
.PHP, 130
versi yang diperluas:
jalankan bersama
php -R <code>
.sumber
AWK, 201 byte
"(awk '$0="a s"'<<<1)"|getline v
adalah cara terbaik yang bisa saya lakukan untuk melakukanevaluate
inAWK
. Saya mungkin "curang" sedikit untuk menyebut ini adilAWK
, karena saya mengeksekusi perintah, tetapi setidaknya perintah jugaAWK
:)Saya yakin saya kehilangan beberapa cara untuk mengurangi byte-count, tapi saya yakin tidak bisa melihatnya.
Penggunaan cukup standar, misalnya memasukkan kode
FILE
dan lakukan:Perhatikan bahwa spasi tidak diperlukan dan karakter non-op / non [az] akan diabaikan secara diam-diam. Dapat diperluas untuk bekerja dengan angka yang lebih besar dari "abcdefghijklmnopqrstuvwxyz" dengan mengubah loop. Untuk melakukan pembagian, cukup tambahkan
/
karakter ke string operasi :). Juga, akan mencetak baris kosong jikaresult <= 0
.sumber