Menerapkan kalkulator skrip operasi operasi integer sederhana.
Konsep
Akumulator dimulai pada 0 dan operasi dilakukan di atasnya. Pada akhir program mengeluarkan nilai akumulator.
Operasi:
+
menambah1
akumulator-
kurangi1
dari akumulator*
mengalikan akumulator dengan2
/
membagi akumulator dengan2
Contoh skrip
Input ++**--/
harus memberikan output 3
.
Contoh implementasi
def calc(s)
i = 0
s.chars.each do |o|
case o
when '+'
i += 1
when '-'
i -= 1
when '*'
i *= 2
when '/'
i /= 2
end
end
return i
end
Aturan
- Ini adalah kode-golf , jadi jawaban terendah dalam byte menang, tetapi tidak dipilih.
- Implementasi kreatif didorong.
- Celah standar dilarang.
- Anda mendapatkan program melalui stdin atau argumen, dan Anda dapat menampilkan jawabannya melalui nilai balik atau stdout.
- Selamat bersenang-senang.
- Divisi terpotong karena itu adalah divisi integer.
- Program
-/
kembali-1
.
Uji kasus
*///*-*+-+
-1
/*+/*+++/*///*/+-+//*+-+-/----*-*-+++*+**+/*--///+*-/+//*//-+++--++/-**--/+--/*-/+*//*+-*-*/*+*+/+*-
-17
+++-+--/-*/---++/-+*-//+/++-*--+*+/*/*/++--++-+//++--*/***-*+++--+-*//-*/+*/+-*++**+--*/*//-*--**-/-*+**-/*-**/*+*-*/--+/+/+//-+*/---///+**////-*//+-+-/+--/**///*+//+++/+*++**++//**+**+-*/+/*/*++-/+**+--+*++++/-*-/*+--/++*/-++/-**++++/-/+/--*/-/+---**//*///-//*+-*----+//--/-/+*/-+++-+*-*+*+-/-//*-//+/*-+//+/+/*-/-/+//+**/-****/-**-//+/+-+/*-+*++*/-/++*/-//*--+*--/-+-+/+/**/-***+/-/++-++*+*-+*+*-+-//+/-++*+/*//*-+/+*/-+/-/*/-/-+*+**/*//*+/+---+*+++*+/+-**/-+-/+*---/-*+/-++*//*/-+-*+--**/-////*/--/*--//-**/*++*+/*+/-+/--**/*-+*+/+-*+*+--*///+-++/+//+*/-+/**--//*/+++/*+*////+-*-//--*+/*/-+**/*//+*+-//+--+*-+/-**-*/+//*+---*+//*/+**/*--/--+/*-*+*++--*+//+*+-++--+-*-*-+--**+/+*-/+*+-/---+-*+-+-/++/+*///*/*-+-*//-+-++/++/*/-++/**--+-////-//+/*//+**/*+-+/+/+///*+*///*-/+/*/-//-*-**//-/-+--+/-*--+-++**++//*--/*++--*-/-///-+/+//--+*//-**-/*-*/+*/-*-*//--++*//-*/++//+/-++-+-*/*-+++**-/-*++++**+-+++-+-***-+//+-/**-+/*+****-*+++*/-*-/***/-/*+/*****++*+/-/-**-+-*-*-++**/*+-/*-+*++-/+/-++*-/*-****-*
18773342
code-golf
math
number
arithmetic
dkudriavtsev
sumber
sumber
/
dapat menghasilkan bukan bilangan bulat.-/
dikembalikan?Jawaban:
Python 2, 48 byte
Apakah
+2
,-2
,*2
, atau/2
. Dengan melakukan+2
dan-2
bukannya+1
dan-1
, kami bekerja dalam unit yang berlipat ganda, sehingga hasil akhir perlu dibelah dua. Kecuali, divisi lantai/
sekarang perlu dibulatkan ke kelipatan 2, yang dilakukan dengan&-2
.sumber
0q{2\~-2&}/2/
(2\~
eval operator dengan operan kedua2
,-2&
adalah bitwise AND,2/
adalah pembagian akhir oleh dua.q{...}/
Adalah pendahuluan atas input dan0
hanya awal nilai.)Haskell, 51 byte
Contoh penggunaan:
foldl(#)0 $ "++**--/"
->3
.sumber
Jelly ,
1817 byteCobalah online!
Bagaimana itu bekerja
Enam baris pertama mendefinisikan tautan pembantu dengan indeks mulai dari 1 hingga 6 ; mereka menambah, tidak melakukan apa-apa, mengurangi, tidak melakukan apa pun, membagi dua (lantai), dan ganda.
Tautan utama -
O0;ṛĿ/
- mengonversi karakter input ke titik kode mereka (O
), menambahkan 0 (nilai awal) ke larik poin kode0;
, lalu mengurangi larik yang dihasilkan sebagai berikut.Nilai awal adalah elemen pertama dari array, yaitu 0 yang diawali . Quicklink
ṛĿ
dipanggil untuk setiap elemen berikut dalam array, dengan nilai pengembalian terakhir sebagai argumen kiri dan elemen saat ini sebagai yang benar. Ia memeriksa argumen yang benar (ṛ
) dan mengevaluasi tautan dengan indeks itu secara monadik (Ŀ
), sehingga menerapkan operasi yang diinginkan.sumber
Python 2, 54 byte
Input diambil sebagai string literal.
~ord(c)%5%3
memetakan operator ke operan kanan yang sesuai.Sebelumnya, saya menggunakan
hash(c)%55%3
yang tidak menghasilkan hasil yang konsisten antara berbagai versi Python. Ini mendorong saya untuk menjelajahi formula lain.sumber
hash
ini versi Python spesifik - ideone menggunakan 2.7.10 yang memberikan[1, 1, 2, 2]
sebagai empat pemetaan, sedangkan secara lokal pada 2.7.12 saya dapatkan[2, 0, 1, 0]
SILOS ,
133211 byteMengambil kode operator ASCII.
Cobalah online dengan test case:
-/
++**--/
*///*-*+-+
sumber
-/
harus mengembalikan -1 , bukan 0 .Mesin Turing - 23 negara (684 bytes)
Coba di sini - permalink
Input tidak boleh mengandung '*' karena ini adalah karakter khusus dalam kode mesin Turing. Gunakan 'x' sebagai gantinya. Keluarkan jawabannya dalam biner.
Kode tidak terobosan
Penjelasan negara:
Inisialisasi:
Status ini dikunjungi sekali pada awal setiap proses, dimulai dengan init2
Instruksi membaca:
Status ini akan dikunjungi beberapa kali di seluruh program
readop: Bergerak terus ke kanan sampai membaca operator atau '.' Jika menyentuh operator, ubah ke status yang sesuai (+, -, x, /). Jika menyentuh '.', Ubah ke status 'sirip'.
return: Mengembalikan head ke ruang kosong antara total yang berjalan dan operator. Kemudian ubah ke 'readop'.
Operasi: Operasi
ini melakukan pekerjaan kotor yang sebenarnya
+: Pindah ke kiri sampai kepala membaca karakter non-spasi putih. Jika karakter ini adalah '-', pindah ke kiri dan ubah ke 'dec'. Jika tidak, ubah ke 'inc'.
-: Mirip dengan '+', kecuali ubah ke 'inc' jika ada '-' dan 'dec' sebaliknya.
inc: Jika digit di bawah kepala adalah 0 (atau spasi), ubah ke 1 dan ubah ke 'nol'. Jika digit adalah 1, ubah ke 0, lalu ulangi digit berikutnya.
dec: Mirip dengan inc, kecuali 1 menuju 0, 0 pergi ke 1, dan jika kepala membaca spasi, ubah ke 'neg'.
x, x0, x1: Bitshift nomor satu ke kiri. Ubah ke 'kembali'.
/, //, div, div0, div1: Pindahkan semua jalan ke kanan nomor, lalu bithift satu ke kanan. Jika ada '-', ubah ke 'inc'. Ini mensimulasikan pembulatan angka negatif. Kalau tidak, ubah ke 'nol'
neg: Tempatkan '-' setelah nomor kemudian ubah ke 'readop'
nol, nol1, nol2: Hapus nol di depan dan ubah ke 'readop'
Pembersihan: Membuat output rapi
sumber
Perl 6 ,
5352 bytePenjelasan:
Pemakaian:
sumber
C,
636257 byteWandbox
sumber
05AB1E , 20 byte
Terima kasih kepada Enigma untuk memperbaiki
-/
-bug!Untuk 16 byte jika bukan bilangan bulat divisi:
Î"+-*/""><·;"‡.V
.Penjelasan:
Menggunakan pengkodean CP-1252 . Cobalah online!
sumber
-/
harus mengembalikan -1 , bukan 0 .Î…+-*"><·"‡'/"2÷":.V
untuk jumlah byte yang sama.JavaScript ES6,
8068 byteMenyimpan 12 byte kekalahan berkat Neil!
sumber
"c"+
dan menulis"c+1 c-1 c*2 c/2|0".split
dll.o=>c=[c+1,c-1,c*2,c/2|0]["+-*/".indexOf(o)]
, atau saya pikir Anda kemudian dapat menyimpan byte lebih lanjut menggunakano=>c={"+":c+1,"-":c-1,"*":c*2,"/":c/2|0}[o]
.k=>[...k].reduce((c,o)=>+{"+":c+1,"-":c-1,"*":c*2,"/":c/2|0}[o],0)
mungkin berhasil bahkan lebih pendek lagi, tapi saya sudah kehilangan hitungan ...}
dan[o]
, jadi ini sebenarnya hanya sepanjang 66 byte. Juga, OP mengklarifikasi;-/
harus mengembalikan -1 , bukan 0 .Ruby,
484442 + 1 = 43 byte+1 byte untuk
-n
bendera. Mengambil input pada STDIN.Lihat di ideone (digunakan
$_
karena ideone tidak mengambil bendera baris perintah): http://ideone.com/3udQ3Hsumber
PHP 76 Bytes
sumber
Python 2,
5856 byte-2 byte terima kasih kepada @Lynn
Ordinals karakter
+-*/
yang43,45,42,47
modulo 11 ini10,1,9,3
modulo 3 yaitu1,1,0,0
, 2 kurang orang yang1,1,2,2
memberikan sebesar yang kita butuhkan untuk setiap operasi:r=r+1
,r=r-1
,r=r*2
, danr=r/2
Sebelumnya:
sumber
2-ord(c)%11%3
?Mathematica,
837370 byte10 byte disimpan karena @MartinEnder .
Fungsi anonim. Mengambil daftar karakter sebagai input dan mengembalikan nomor sebagai output. Saran bermain golf diterima.
sumber
SILOS ,
175164 byteCobalah online!
Metode input sehat. Divisi integer yang benar (bulat menuju -infinity).
sumber
C #,
8781 byteTidak Terkumpul:
Input dianggap valid. Pembagian dengan dua dilakukan dengan menggeser ke kanan sedikit, karena pembagian teratur selalu membulatkan ke arah nol, dan menggeser ke bawah selalu membulatkan ke bawah. Penambahan dan penurunan memanfaatkan dengan mudah jarak 1 antara kode ASCII untuk
+
dan-
.sumber
int f(string s)=>s.Aggregate(0,(i,c)=>c<43?i*2:c<46?i+44-c:i>>1);
(65 byte)Javascript (ES6), 57 byte (array) / 60 byte (integer)
Mengembalikan array dari semua hasil antara:
Misalnya, output untuk
"++**--/"
akan[1, 2, 4, 8, 7, 6, 3]
.Hanya mengembalikan hasil akhir:
Bagaimana itu bekerja
Kedua solusi didasarkan pada ide yang sama: menggunakan fungsi hash sempurna
eval(2+c+3)&3
untuk memetakan berbagai karakter operatorc
di[0, 3]
.sumber
JavaScript (ES6), 57
Catatan: nilai awal untuk akumulator adalah string program, menggunakan operasi bit (~, >>, <<, |) itu dikonversi ke 0 pada penggunaan pertama.
Sebagai catatan tambahan, jawaban cerdas @xnor akan mencetak 40 porting ke javascript:
(jika Anda suka ini, pilih dia)
Uji
sumber
Java, 77 byte
Menggunakan aliran java 8.
sumber
r >> 1
ker>>1
dan Hemat 2 byte?s->s.chars().reduce(0,(r,c)->c<43?r*2:c<46?r+44-c:r>>1);
yang akan memberi Anda 56 byteGNU sed,
655957 byteSunting: 2 byte lebih pendek berkat komentar Toby Speight
Menjalankan:
Keluaran:
The
sed
Script mempersiapkan masukan untukdc
panggilan shell di akhir, yang terakhir menerima masukan dalam notasi Reverse Polandia . Di divisi, jika nomornya negatif (d0>
),[1-]
perintah decrement yang disimpan dalam register@
dipanggil. Contoh konversi:+ - * /
->1+ 1- 2* d0>@2/
.sumber
[1-]
pola ...s
denganS
. Saya lupa bahwa itu tidak menggantikan tumpukan registri, itu mendorongnya, memiliki efek sebaliknya dari apa yang saya inginkan (karena saya menggunakannya untuk setiap/
). Kutipan masih diperlukan karena Anda memiliki/
simbol di dalamnya membuat string ditafsirkan sebagai path file :) Saya mencukur 1 byte lebih banyak dengan menghapus spasi setelah-e
.-e
sebagai nama file, jadi Anda tidak perlu tanda kutip untuk/
- coba! Saya pikir itu wajar untuk kode-golf mengharuskan direktori kerja saat ini tidak berisi file yang dimulai dengan01s@
atau0-s@
.-e
tentang/
, namun tanda kutip masih diperlukan karena saya hanya melihat sekarang. The>
ditafsirkan langsung oleh shell sebagai operator redirect saya pikir, karena saya punya kesalahan ini:cannot create @2/d0: Directory nonexistent
>
. Anda memang butuh penawaran. Permintaan maaf untuk (berusaha) menyesatkan! Dan, meskipun menambahkan garis miring terbalik seperti satu karakter, itu perlu digandakan sebagais///
pengganti, jadi tidak ada manfaatnya di sana ...PHP, 75 byte
Ini menggunakan versi modifikasi dari jawaban Jörg Hülsermann .
Ini sangat bergantung pada substitusi string, menggunakan ekspresi reguler sederhana (
~.~
).Variabel
$s
ditugaskan kembali dengan nilai baru untuk setiap karakter. Pada akhirnya, ini menghasilkan hasilnya.Catatan : Ini dimaksudkan untuk dieksekusi menggunakan
-r
bendera.Coba di sini:
Tampilkan cuplikan kode
Atau coba: http://sandbox.onlinephpfunctions.com/code/7d2adc2a500268c011222d8d953d9b837f2312aa
Perbedaan:
echo$s
, saya menggunakansprintf($s)
. Keduanya melakukan tindakan yang sama pada angka. Karena ini hanya untuk pengujian, tidak apa-apa.++*+
sebagai argumen pertama, yang akan ditampilkan5
.sumber
e
pengubah kembali! : De
, yang digantikan olehpreg_replace_callback
dan dapat disalahgunakan untuk ... tapi ini tidak cukup.Batch, 61 byte
Terjemahan dari jawaban xcellent Python @ xnor
sumber
Pyke,
2422 byteCoba di sini!
Atau 12 byte (tidak kompetitif)
Coba di sini!
Tambahkan
translate
simpul - pada dasarnya beberapa temukan dan ganti.sumber
PHP,
10410282 byteVersi pertama dengan eval:
Versi kedua dengan operator ternary:
Mengambil string input sebagai argumen pertama dari baris perintah.
Ini "hanya" bekerja untuk string input lebih pendek dari 10.000 karakter - yang seharusnya banyak. Diuji dengan semua kasus uji, sayangnya tidak dapat menghemat inisialisasi di awal.Versi kedua berfungsi dengan string dengan panjang berapa pun dan tanpa inisialisasi. :-)Elemen utama adalah fungsi eval yang memanipulasi
$i
berdasarkan peta operasi aritmatika, yang cukup mudah kecuali untuk divisi. PHP mengembalikan float saat menggunakan/
danintdiv
terlalu banyak byte, jadi kami melakukan pergeseran kanan .Pembaruan
$i=$i>>1
menjadi$i>>=1
untuk pembagian integer.sumber
Python 3,
986660 byteTerima kasih Tukkax!
Bukan sebagai golf seperti jawaban yang lain, tetapi saya tidak dapat bersaing dengan mereka tanpa plagiarisme.
Juga, saya punya solusi lambda rekursif juga
7367 byte (ditingkatkan!)sumber
i=0 for c in input():i+=[1,-i//2,-1,i][ord(c)%23%4] print(i)
. (tidak diformat dengan baik tentu saja). Juga saya pikir Anda harus menyebutkan bahwa Anda menggunakan Python3. Dalam Python2,input()
akan dievaluasi menjadiint(raw_input())
.+-
apakah 1)R, 201 byte
Golf
Berkomentar
Strategi adalah untuk memperbaiki
+, -, %
operator. Pisahkan string kemudian parsing string ke dalam daftar fungsi yang panjang, untuk dimasukkan ke dalamReduce()'s
akumulator.Tidak bisa bermain golf lagi. Jika seseorang dapat mulai
b=body<-
bekerja, mungkin ada beberapa byte penghematan (sempurnakan setiap fungsi denganb
setelah"-"="+"="/"="*"
). Awalnya mencoba untuk mengganti dan mengurai eval, tetapi urutan operasi dan tanda kurung sangat mengerikan.sumber
f, ...
dalam definisi dariReduce
fungsi dan menyingkirkanstdin()
discan
tapi aku hanya mencoba naif Pendekatan yang menjatuhkan dua byte lagi dengan mendefinisikan fungsi sedikit berbeda. tio.run/##XcvLCsMgEAXQrwnO6Gge29B/…Lex + C,
78,74, 73 byteKarakter pertama adalah spasi.
Membaca dari
stdin
, mengembalikan hasil.Kompilasi dengan
lex golfed.l && cc lex.yy.c main.c -lm -lfl
, main test:sumber
Javascript (ES5), 127 byte
Tidak Terkumpul:
sumber
Pyth, 23 byte
Program lengkap yang mengambil input sebagai string dan mencetak hasilnya.
Ini adalah port jawaban Python @ xnor .
Cobalah online
Bagaimana itu bekerja
sumber
u@[yGhG0tG0/G2)CHQ0
19 bytePHP, 79 byte
sumber
1
; Anda perlu membagi dan mengalikan dengan2