Terakhir kali ketika saya mencoba untuk membuat sesuatu yang mudah yang bukan duplikat, akhirnya menjadi terlalu sulit .. Jadi mudah-mudahan kali ini memang sesuatu yang bisa dicoba juga oleh pendatang baru.
Memasukkan:
Array / daftar dengan bilangan bulat / desimal. (Atau string yang mewakili array dengan bilangan bulat / desimal.)
Keluaran:
Lingkari angka-angka dan terapkan lima operan matematika berikut dalam urutan ini:
- Tambahan (
+
); - Pengurangan (
−
); - Perkalian (
*
atau×
atau·
); - Divisi Nyata / Kalkulator (
/
atau÷
); - Eksponensial (
^
atau**
).
(CATATAN: Simbol antara tanda kurung hanya ditambahkan sebagai klarifikasi. Jika bahasa pemrograman Anda menggunakan simbol yang sama sekali berbeda untuk operasi matematika dari contoh, maka tentu saja itu benar-benar dapat diterima.)
Teruskan sampai Anda mencapai akhir daftar, dan kemudian berikan hasil penjumlahan tersebut.
Aturan tantangan:
- Eksponensial dengan 0 (
n ^ 0
) harus menghasilkan 1 (ini juga berlaku untuk0 ^ 0 = 1
). - Tidak ada test case untuk pembagian dengan 0 (
n / 0
), jadi Anda tidak perlu khawatir tentang case-edge. - Jika array hanya berisi satu nomor, kami mengembalikannya sebagai hasilnya.
Aturan umum:
- Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang.
Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa saja'. - Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat, program lengkap. Panggilanmu.
- Celah default tidak diperbolehkan.
- Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
Kasus uji:
[1,2,3,4,5] -> 0
-> 1 + 2 = 3
-> 3 - 3 = 0
-> 0 * 4 = 0
-> 0 / 5 = 0
[5,12,23,2,4,4,2,6,7] -> 539
-> 5 + 12 = 17
-> 17 - 23 = -6
-> -6 * 2 = -12
-> -12 / 4 = -3
-> -3 ^ 4 = 81
-> 81 + 2 = 83
-> 83 - 6 = 77
-> 77 * 7 -> 539
[-8,50,3,3,-123,4,17,99,13] -> -1055.356...
-> -8 + 50 = 42
-> 42 - 3 = 39
-> 39 * 3 = 117
-> 117 / -123 = -0.9512...
-> -0.9512... ^ 4 = 0.818...
-> 0.818... + 17 = 17.818...
-> 17.818... - 99 -> -81.181...
-> -81.181... * 13 = -1055.356...
[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] -> 256
-> 2 + 2 = 4
-> 4 - 2 = 2
-> 2 * 2 = 4
-> 4 / 2 = 2
-> 2 ^ 2 = 4
-> 4 + 2 = 6
-> 6 - 2 = 4
-> 4 * 2 = 8
-> 8 / 2 = 4
-> 4 ^ 2 = 16
-> 16 + 2 = 18
-> 18 - 2 = 16
-> 16 * 2 = 32
-> 32 / 2 = 16
-> 16 ^ 2 = 256
[1,0,1,0,1,0] -> 1
-> 1 + 0 = 1
-> 1 - 1 = 0
-> 0 * 0 = 0
-> 0 / 1 = 0
-> 0 ^ 0 = 1
[-9,-8,-1] -> -16
-> -9 + -8 = -17
-> -17 - -1 = -16
[0,-3] -> -3
-> 0 + -3 = -3
[-99] -> -99
sumber
n ^ 0 = 1
tapi0 ^ n = 0
. Konflik diselesaikan dengan menetapkann != 0
kedua aturan, tetapi kemudian tidak0 ^ 0
terdefinisi. Namun, ada banyak hal yang cocok dengan matematika jika0 ^ 0
didefinisikan1
. Lihat Wikipedia untuk beberapa detail.Jawaban:
Jelly , 13 byte
Cobalah online! atau verifikasi semua kasus uji .
Bagaimana itu bekerja
sumber
Javascript ES7 49 byte
Disimpan 9 byte berkat Dom Hastings, disimpan 6 berkat Leaky Nun
Menggunakan operator eksponensial baru.
sumber
Infinity
, bukan kesalahan?Haskell,
76656462 byteTerima kasih kepada @Damien karena menghapus dua byte =)
Ini menggunakan
>>
yang di sini hanya menambahkan daftar[(+),...]
kelength v
waktu itu sendiri . Selebihnya masih berfungsi masih sama dengan versi lama.Versi lama:
Solusi ini menggunakan daftar yang tidak terbatas, karena
cycle[...]
hanya mengulangi daftar yang diberikan tanpa batas. Maka pada dasarnya akanzip
diedit dengan daftar angka, dan kami hanyafold
( mengurangi dalam bahasa lain) daftar zip melalui lambda, yang menerapkan operator ke elemen daftar akumulator / saat ini.sumber
foldl(&)u$zipWith(&)v(flip<$>v>>[…])
,?import
untuk&
, jadi itu akan lebih lama lagi, tapi terima kasih lagi!uncurry
. Tidak berhasil, tetapi saya perhatikan Anda harus dapat menyimpan byte lain dengan menggunakan$
bukan tanda kurung.Pyke,
2221 byteCoba di sini!
sumber
Haskell, 61 Bytes
Membuat serangkaian transformasi dalam daftar, seperti pada [tambah 1, tambah 2, kurangi 3, ...], dimulai dengan 2 tambahan karena kita mulai dengan 0 di flip. Selanjutnya, kita melakukan apa yang saya sebut Daftar Aplikasi Lipat, atau foldl (flip id), yang menerapkan daftar homomorfisme secara seri. Ini dimulai dengan nol, menambahkan nilai awal, kemudian melakukan semua transformasi yang dihitung di atas untuk mendapatkan hasil akhir.
Perhatikan bahwa (flip id) sama dengan (\ x y-> yx), hanya lebih pendek.
Penggunaan sampel:
sumber
flip id
, Anda bisa menggunakannya&
. Atauflip($)
. Wow, saya tidak pernah menyadari($) = id
&
didefinisikan dalamData.Function
, jadi Anda perluimport
juga. Mungkin beberapa penerjemah online mengimpornya secara default, tetapi kemudian Anda harus menentukan yang mana yang Anda gunakan.TSQL
11611588 byteBerkat saran Ross Presser, saya dapat melakukan golf hingga 88 karakter
Cobalah online
sumber
Pyth,
272625 byteSuite uji.
Pyth menggunakan notasi awalan:
1+2
ditulis sebagai+1 2
(ruang yang diperlukan untuk memisahkan angka).Oleh karena itu, untuk testcase pertama, ungkapannya adalah
(((1+2)-3)*4)/5
, yang dalam notasi awalan, akan ditulis sebagai/*-+ 1 2 3 4 5
.Dalam Pyth, pembagian float
c
bukan/
, jadi itu menjadic*-+ 1 2 3 4 5
.Juga, dalam Pyth,
-100
ditulis sebagai_100
gantinya.Oleh karena itu, untuk kasus tes ketiga, yang
((((((((-8+50)-3)*3)/-123)^4)+17)-99)*13)
, menjadi:*-+^c*-+ _8 50 3 3 _123 4 17 99 13
.Sejarah
v:P+*lQ\(ssV+R\)Q*"+-*/p"lQ\p"**"
.vs+_XUtQUQ"+-*c^"m:+;d\-\_
.vs+_XUtQUQ"+-*c^":jdQ\-\_
sumber
Sebenarnya, 23 byte
Cobalah online!
Sebenarnya menggunakan notasi postfix untuk matematika, dan operator yang hanya pernah mengambil dua argumen (seperti operator untuk penambahan, pengurangan, perkalian, pembagian, dan eksponensial) tidak melakukan apa-apa ketika hanya ada satu elemen di stack. Dengan demikian, mengubah input menjadi kode Sebenarnya adalah semudah membalikkan input, memformatnya sebagai angka, dan menambahkan operasi. Kemudian, kode yang dihasilkan dapat dieksekusi, memberikan output yang diinginkan.
Penjelasan:
Contoh kode yang diterjemahkan untuk input
1,2,3,4,5
:sumber
s/Actually uses postfix notation/Actually actually uses postfix notation/
Julia,
5350 byteCobalah online!
sumber
J, 40 byte
Menemukan jumlah nilai yang diperlukan untuk menggunakan kelipatan 5 operator, daripada pembalut dengan nilai identitas operator tersebut. Secara berurutan,
+
adalah 0,-
adalah 0,*
adalah 1,%
adalah 1, dan^
adalah 1, yang dapat berupa nilai bit00111
, atau 7 pada basis 10. Kemudian beroperasi pada daftar tersebut saat bersepeda melalui operator.Pemakaian
Penjelasan
sumber
Python 2,
816764 byteInput adalah array float. Uji di Ideone .
Bagaimana itu bekerja
'*+-*/*'[i::5]
memilih setiap karakter kelima string, dimulai dengan satu di indeks i , jadi ini menghasilkan**
jika i = 0 ,+
jika i = 1 ,-
jika i = 2 ,*
jika i = 3 dan/
jika i = 4 . Karena string memiliki panjang 6 , ekspresi akan menghasilkan string kosong jika i> 5 .Kami menginisialisasi variabel i hingga 10 . Untuk setiap angka n dalam array input, kami membangun string
r<op>=n
, yangexec
dijalankan.Awalnya, i = 10 , begitu
<op>
juga string kosong, dan itu menginisialisasi r denganr+=n
. Setelah setiap langkah, kami menambah i modulo 5 dengani=-~i%5
, sehingga langkah selanjutnya akan mengambil operator yang tepat.Ketika semua nomor input telah diproses, dan kami mencetak r , yang menampung output yang diinginkan.
sumber
Matlab -
95 9185 byte / Oktaf - 81 byteInput dalam bentuk seperti
a = ['1' '2' '3' '4' '5'];
ini:, saya harap ini ditutupi oleh "string yang mewakili array dengan bilangan bulat / desimal", kalau tidak ada 2 num2str yang diperlukan juga.Setiap hasil antara dicetak untuk menghibur karena itu menyelamatkan saya beberapa titik koma.
a(1)
dieksekusi sehingga nilainya kemudian disimpan keans
. Juga tentu saja menggunakanans
kode adalah praktik yang buruk.Di Octave,
'+-*/^'(mod(i+2,5)+1)
juga berfungsi, yang menyimpan 4 byte lagi, terima kasih Adám dan Luis Mendo:Changelog:
sumber
b = '+-*/^'
bisa bermain golf keb='+-*/^'
danfor i = 2:length(a)
kefor i=2:length(a)
(menghilangkan spasi)? Juga, mungkin Tips untuk bermain golf di MATLAB mungkin menarik untuk Anda. :)'+-*/^'(mod(i+2,5)+1)
validMathematica,
676665 byteSederhana
Fold
dengan variabel yangi
memegang indeks.sumber
+##
alih-alih#+#2
CJam, 18 byte
Input adalah array float. Cobalah online!
Bagaimana itu bekerja
sumber
R ,
87 7870 byteCobalah online!
sumber
do.call
... Saya mungkin tidak seharusnya menganggap diri saya seorang programmer R sampai saya melakukannya!Advanced R
oleh Hadley Wickam adalah pantai yang bagus dibaca :)do.call
- membuat saya sadar bahwa saya sedang mencariget
.Haskell - 74
Kasus uji:
Mungkin bisa lebih pendek; Dukungan Haskell untuk daftar yang tak terbatas dan fungsi urutan yang lebih tinggi membuat solusi langsung cukup menyenangkan. Sebuah versi
^ :: Double -> Double -> Double
akan lebih bagus untuk bermain golf, tetapi saya tidak dapat menemukannya. Untungnya, saya tidak perlu lambda penuh, jadi gaya tak berguna mencukur beberapa byte.sumber
(+)
ke daftar operator dan memulaifoldl
dengan0
untuk pergi sepenuhnya pointfree dan menyimpan nama fungsi dan parameter:foldl(\x(o,y)->o x y)0.zip((+):cycle[(+),(-),(*),(/),(**)])
.PowerShell v2 +, 124 byte
Lama karena PowerShell tidak memiliki operator
^
atau**
, jadi kami harus menjelaskan kasus terpisah dan menggunakan panggilan NET.Mengambil input
$n
sebagai array, menetapkan output kami$o
menjadi digit pertama. Kami kemudian memeriksa.count
array, dan selama itu lebih besar dari yang kita masukkanif
. Kalau tidak, kita lewatiif
.Di dalam
if
kita loop melalui array1..$y|%{...}
dan setiap iterasi kita atur ulang$o
ke nilai baru, hasil dariif/else
pernyataan lain . Selama penghitung kita$i++
tidak modulo-5 sama dengan 4 (yaitu, kita tidak di^
operator), kita cukup mengambil$o
dan menggabungkannya dengan simbol yang sesuai'+-*/'[$x]
dan angka berikutnya dalam array input$n[$_]
. Kami menyalurkannya keiex
(alias untukInvoke-Expression
dan mirip denganeval
), dan itu akan disimpan kembali ke$o
. Jika kita berada di^
operator, kita berada dielse
, jadi kami melaksanakan[math]::Pow()
panggilan, dan bahwa hasil mendapat re-disimpan kembali ke dalam$o
.Dalam kedua kasus tersebut, kami cukup output
$o
ke pipa dan keluar, dengan output implisit.sumber
Rust,
123, 117 byteJawaban asli:
nama metode panjang yang bodoh ^^ ahh jauh lebih baik
ungolfed
sumber
Perl 6 ,
70 68 6562 bytePenjelasan:
Secara teknis
* + *
adalah lambda Apapun, tetapi secara efektif sama dengan&[+]
yang merupakan kependekan&infix:<+>
dari subrutin yang menangani penambahan angka infiks.Saya tidak menggunakannya untuk perkalian atau eksponensial sebagai cara untuk menulis mereka seperti itu setidaknya selama apa yang saya miliki (
*×*
atau* * *
dan* ** *
)Uji:
Mengujinya di ideone.com
(setelah mereka meningkatkan ke versi Rakudo yang tidak dari satu setengah tahun sebelum rilis resmi dari tontonan Perl 6 )
sumber
Python 3,
8893 byteAwalnya jauh lebih pendek tapi kemudian operator diutamakan mengalahkan saya dan saya harus memasukkan banyak tanda kurung ...
sumber
Oracle PL / SQL,
275254 BytesData harus dimasukkan dalam tabel yang disebut
T
dengan kolomN
tipeNUMBER
Pemakaian:
Keluaran:
275 Bytes versi:
sumber
Java 8,
173172167138137118113 bytePenjelasan:
Coba di sini.
sumber
double r=a[0];
kedouble r=a[0],b;
untuk menyimpan beberapa byte.float
, tapi tidak adaMath.pow
untuk mengapung, maka dari itudouble
. Terima kasih untuk,b
. Dan dengani++<a.length
saya mendapatkan ArrayOutOfBoundsException dib=a[i];
(kecuali saya melakukannyai++<a.length-1
, yang satu byte lebih lama, bukan lebih pendek).== 4
ke> 3
dan== 0
ke< 1
. Saya tidak yakin tapi saya pikir Anda bisa menghemat sedikit dengan membuat variabel untuki % 5
.<x
trik ini, mengecilkan seluruh fungsi menjadi 137 karakter.Beberapa trik dapat mengurangi pendekatan @ Willmore sebesar 23 hingga 174 byte (membutuhkan php 5.6 atau lebih baru). Bagian yang paling hemat adalah menghapus tanda kurung yang tidak perlu (-10 byte).
Tetapi menggunakan
**
operator bukannyapow()
juga memungkinkan untuk digunakaneval
dengan array untuk operasi; dan dengan beberapa trik lagi ...PHP> = 5,6, 82 byte
mengambil daftar dari parameter baris perintah. Jalankan dengan
php -nr '<code>'
atau coba online .versi lama,
161 157 151 145 144 140 137117 byteGolf paling efektif berasal dari penulisan hasil antara langsung ke elemen pertama - setelah menggeser hasil sebelumnya dari array.
kerusakan
test suite
sumber
If the array contains just a single number, we return that as the result.
cukup jelas. Tapi terima kasih telah mengizinkan saya mengunjungi kembali ini.PHP ,
135130 byteTerima kasih @titus, -5 byte, ditambah perbaikan 0 case!
Cobalah online!
Lebih sedikit golf:
Benar-benar rooting untuk array_reduce () berfungsi untuk ini, tetapi membutuhkan terlalu banyak karakter untuk mengalahkan skor PHP terendah saat ini.
Tetap mempostingnya kalau-kalau ada yang punya saran!
sumber
$c
hits0
. Simpan dua byte dengan fungsi anonim, bukanw
.eval('$c'.['/','**','+','-','*'][$i++?$i%5:5].'=$x');return$c;
lebih pendek enam byte dan harus menyelesaikan masalah nol.Brachylog , 68 byte
Itu panjang ... tetapi tidak menggunakan predikat evaluasi.
Penjelasan
Predikat utama
Predikat 1
sumber
IBM PC 8087 FPU,
6682 byteHanya menggunakan koprosesor matematika Intel 8087 IBM PC untuk perhitungan.
Cobalah offline! (dalam DOSBox atau apa pun). Berikan sesuatu pada chip 8087 bosan pada PC lama Anda, selain semua spreadsheet Lotus 1-2-3 yang biasa Anda lakukan di tahun 80-an.
Tidak disatukan (tidak dirangkai):
Keluaran:
Input adalah melalui PROC (x86 paling setara dengan fungsi), dengan BX menjadi pointer ke array WORD dalam memori, dan CX menjadi jumlah item di dalamnya dan mengembalikan hasilnya dalam ST.
* Catatan: Kode aktual untuk fungsi ini adalah
6682 byte Tentu saja, kode hanya untuk menulis angka floating point ke konsol (kode buku resep) adalah 83 byte. Program dan data pengujian adalah183215 byte, membuat .COM dapat dieksekusi305Total 380 byte.sumber
APL (Dyalog Unicode) ,
2927 byte SBCSFungsi awalan diam-diam anomim. Perhatikan bahwa
*
ini adalah eksponensial dalam APL.Cobalah online!
Karena APL mengeksekusi dari kanan ke kiri, kita bisa membalik urutan argumen dari operasi yang dimasukkan dan membalikkan seluruh ekspresi. Postfix
⍨
membalikkan argumen. Setelah melakukan pengocokan angka dan operasi secara sempurna, kita hanya perlu membalikkan, meratakan, dan mengevaluasi:≢{
...}⊢
panggil fungsi berikut dengan hitungan dan angka aktual sebagai⍺
dan⍵
:'⍨'
karakter ini'+-×÷*',¨
gantilah setiap karakter ini dengan itu;["+⍨","-⍨","×⍨","÷⍨","*⍨"]
⍺⍴
menggunakan argumen kiri (menghitung angka) untuk siklis r eshape yang⌽
membalikkan⍕
memformat sebagai string datar3↓
jatuhkan terdepan 3 karakter (spasi dan simbol dan⍨
)⍎
dieksekusi sebagai kode APLsumber
Japt , 16 byte
Cobalah online!
Penjelasan:
sumber
c #,
238, 202 byteSaya tidak melihat solusi c # jadi saya akan memberikan satu. Ini codegolf pertamaku. Saya mulai menulis di c # "dua bulan lalu" (meskipun saya tahu Jawa sampai batas tertentu).
Ini menggunakan Stack
Kasus yang tidak disatukan dan diuji
Keluaran:
sumber
a, Double.Parse
->a,Double.Parse
;while (s.Count
->while(s.Count
;Pow(l, r)
->Pow(l,r)
). Anda juga dapat menghapusint
di depanj=
dan meletakkannya di belakangint i=0,j;
. Jawaban pertama yang bagus, dan sekali lagi selamat datang. :)PHP,
206,198, 197 byteTidak disatukan
Di PHP, logika mirip dengan jawaban c # saya ( 202 byte ) :).
sumber