Terinspirasi oleh ini
Dalam tantangan yang ditautkan, kami diminta untuk menerapkan tambahan pada elemen asli dan kebalikan dari array input. Dalam tantangan ini, kita akan membuatnya sedikit lebih sulit, dengan memperkenalkan operasi matematika dasar lainnya.
Diberikan array bilangan bulat, siklus melalui +, *, -, //, %, ^
, di mana //
divisi bilangan bulat dan ^
eksponen, sambil menerapkannya ke kebalikan dari array. Atau, dengan kata lain, terapkan salah satu fungsi di atas untuk setiap elemen array, dengan argumen kedua adalah kebalikan dari array, dengan fungsi yang diterapkan bersepeda melalui daftar di atas. Ini mungkin masih membingungkan, jadi mari kita bekerja melalui contoh.
Input: [1, 2, 3, 4, 5, 6, 7, 8, 9]
Reverse: [9, 8, 7, 6, 5, 4, 3, 2, 1]
[ 1, 2, 3, 4, 5, 6, 7, 8, 9]
Operand: + * - / % ^ + * -
[ 9, 8, 7, 6, 5, 4, 3, 2, 1]
Result: [10, 16, -4, 0, 0, 1296, 10, 16, 8]
jadi output untuk [1, 2, 3, 4, 5, 6, 7, 8, 9]
menjadi[10, 16, -4, 0, 0, 1296, 10, 16, 8]
Untuk menutup kasus sudut, input tidak akan pernah berisi 0, tetapi dapat berisi bilangan bulat lain dalam kisaran dari infinity negatif hingga infinity positif. Anda dapat mengambil input sebagai daftar string yang mewakili digit jika Anda mau.
Uji kasus
input => output
[1, 2, 3, 4, 5, 6, 7, 8, 9] => [10, 16, -4, 0, 0, 1296, 10, 16, 8]
[5, 3, 6, 1, 1] => [6, 3, 0, 0, 1]
[2, 1, 8] => [10, 1, 6]
[11, 4, -17, 15, 2, 361, 5, 28] => [39, 20, -378, 7, 2, 3.32948887119979e-44, 9, 308]
Ini adalah kode-golf sehingga kode terpendek (dalam byte) menang!
sumber
Jawaban:
Jelly, 10 byte ( garpu )
Saya baru saja mengerjakan implementasi quick untuk ini beberapa hari yang lalu, jadi cukup mengejutkan melihat penggunaannya begitu cepat. Itu masih hanya ada sebagai garpu, jadi Anda tidak dapat mencobanya online.
Output sampel
Penjelasan
sumber
ƭ
untuk mendukung nilad (ganti nilai) dan monad (berlaku pada argumen kiri) juga2 1”q3ƭ€
pada[7,4,9,0]
pengembalian[2, 1, 'q', 2]
Sekam , 16 byte
Tantangan ini mendukung bahasa yang dapat membuat daftar fungsi yang tak terbatas.Mungkin tidak,eval
FTWCobalah online!
Bagaimana?
Alternatif solusi 17 byte:
sumber
ë+*-÷%^
? Mengapae
perlu?ë
membutuhkan 4 argumen,e
mengambil 2. Tidak ada satu untuk 605AB1E , 18 byte
Cobalah online!
Penjelasan
sumber
Ig∍
jika Anda ingin menggunakan perintah "agak baru" (belum banyak melihat di∍
sini).Utilitas Bash + GNU, 53
Script ini menggunakan nama file sebagai parameter baris perintah.
Cobalah online .
Yang menyenangkan di sini adalah
paste -d
memungkinkan daftar pemisah untuk diberikan, yang digunakan secara siklis. Sisanya hanya mendapatkan input ke format yang tepat untuk melakukan ini.sumber
Jelly , 15 byte
Cobalah online! atau lihat test-suite .
Bagaimana?
sumber
ż“+×_:%*”;"ṚV
ż“+×_:%*”ṁ$;"ṚV
yang juga 15 byte.Python 2 , 67 byte
-3 bytes terima kasih kepada ovs.
Cobalah online!
Python 2 , 95 byte
Cobalah online!
eval
itu jahat ... tapi mungkin lebih golf. : Psumber
JavaScript (ES7),
6867 byteTampilkan cuplikan kode
sumber
o
di dalam tanda kurung.pop()
untuk menghemat beberapa byte.o
juga digunakan sebagai kondisi operator ternary. Itu akan merusak skema itu.Perl 6 ,
6766 byteDisimpan 1 byte berkat @nwellnhof.
Cobalah online!
Solusi yang sangat tidak imajinatif (dan mungkin buruk). Ritsleting argumen dengan dirinya sendiri terbalik. Daftar yang dihasilkan kemudian dipetakan dengan blok yang
EVAL
merupakan stringa (operator) b
. Operator dipilih dari daftar string<+ * - div % **>
menggunakan variabel bebasstate
(pikirkanstatic
dalam C - nilainya tetap di seluruh panggilan blok)$
. Ini dibuat untuk setiap blok secara terpisah dan diatur ke 0. Anda dapat melakukan apa pun yang Anda suka dengannya, tetapi Anda dapat$
merujuknya hanya sekali (masing-masing kejadian merujuk ke variabel lain, sebenarnya). Jadi$++%6
sebenarnya 0 selama panggilan pertama, 1 selama yang kedua, ... 5 selama 6, 0 selama 7 dan seterusnya.Saya awalnya mencoba melakukannya tanpa
EVAL
. Para operator sebenarnya hanya subs (= fungsi), tetapi nama mereka sangat ungolfy (&infix:<+>
dan sebagainya) sehingga saya harus melupakan pendekatan itu.sumber
map {EVAL ".[0] ... .[1]"},zip $_,.reverse
lebih pendek 1 byte.Haskell ,
74117105 byteCobalah online!
Disimpan 12 byte berkat @nimi
Tentunya ada cara yang lebih baik untuk mencapai ini.
EDIT 1. Eksponen tetap untuk bilangan bulat; 2. Pasti ada cara yang lebih baik, lihat komentar di bawah:
9591 byteCobalah online!
sumber
zipWith3($)(cycle[(+),(*),(-),div,mod,(^)])<*>reverse
Adalah versi Anda yang lebih pendek dan sekarang dihapus.h
di panggilo
:o a b
dan tanpa itu Anda bisa inlineh
( TIO ).Python 2 , 71 byte
Cobalah online!
Disimpan 2 byte berkat ovs!
sumber
J,
4442 byteDicoret 44, yada yada ...
-2 byte terima kasih kepada @ ConorO'Brien
Cobalah online!
Begitu banyak paren dan sisipan ... Tentunya ada cara yang lebih baik untuk melakukan ini (mungkin menggunakan insert daripada infix?)
Penjelasan
Beberapa catatan:
J tidak memiliki divisi integer, jadi kami menulis
%
-divisi dengan>.
-floor. Mod J (|
) melakukan urutan terbalik dari apa yang kita harapkan, jadi kita harus membalikkan urutannya menggunakan~
-reflexive.Meskipun kita bergerak dengan interval 2, kita harus menggunakan
/
-insert untuk memasukkan kata kerja agar bisa digunakan secara dua arah karena itulah cara\
-infiks bekerja.sumber
()
dan mengulangi/
- saya tidak bisa mengetahuinya ..../
pada array terbalik (karena beroperasi mundur ...) dengan kata kerja seperti(,+)`(,*)
tetapi itu tidak banyak membantu ... (juga tidak bekerja)+/`(*/)`...
Ruby ,
6357 byteTidak ada yang mewah, sungguh. Lakukan iterate pada array, gunakan indeks sebagai reverse iterator, gabung ke string menggunakan operator yang tepat, evaluasi, bilas dan ulangi.
Cobalah online!
sumber
k , 40 byte
Cobalah online!
sumber
MATL ,
2723 byte-4 byte terima kasih kepada @LuisMendo
Cobalah online!
Penjelasan:
sumber
Perl 5 , 68 + 1 (-p) = 69 byte
Cobalah online!
Mengambil input sebagai daftar angka yang dipisahkan ruang.
sumber
R , 74 byte
Cobalah online!
Ini adalah jawaban terakhir yang saya temukan. Ini mengembalikan daftar panjang
length(l)
mana setiap elemen adalah daftar yang mengandung elemen yang sesuai. Agak jelek tapi mereka semua ada di sana. Jika itu tidak dapat diterima, salah satu dari ituMap
dapat diganti denganmapply
sebesar +3 byte.Karena operator R adalah semua fungsi (notasi infiks hanya menjadi gula sintaksis), saya mencoba untuk memilih satu dari daftar; misalnya, solusi 94 byte di bawah ini.
Untuk mencoba dan menghilangkan loop, saya mencoba
sapply
, tetapi itu hanya berfungsi dengan satu fungsi dan daftar input. Lalu saya ingat bentuk multivariatmapply
,, yangn-ary
berfungsiFUN
dann
argumen yang berhasil, berlakuFUN
untuk elemen pertama, kedua, ..., dari setiap argumen, daur ulang jika perlu . Ada juga fungsi pembungkus untukmapply
,Map
yang "tidak berusaha menyederhanakan hasil" . Karena pendeknya tiga byte, ini adalah peluang golf yang bagus.Jadi saya mendefinisikan fungsi trinary (seperti pada solusi 80 byte di bawah) yang mengambil fungsi sebagai argumen pertama, dan menerapkannya pada yang kedua dan ketiga. Namun, saya menyadarinya
Map
adalah fungsi yang mengambil fungsi sebagai argumen pertama dan menerapkannya pada yang berurutan. Rapi!Akhirnya, kami bagian di akhir untuk memastikan kami hanya mengembalikan yang pertama
length(l)
.R , 80 byte
Cobalah online!
Yang ini tidak berfungsi, karena akan mengembalikan 6 nilai untuk daftar dengan kurang dari 6 elemen.
R , 94 byte
Cobalah online!
Penjelasan (agak tidak diserap):
Karena masing-masing fungsi adalah vektor, kita dapat mengindeks di akhir (
res[i]
). Ini lebih baik daripadaeval
pendekatan di bawah ini.R , 100 byte
Cobalah online!
Ini adalah
eval
pendekatan terpendek yang bisa saya temukan; karena kita harus mengumpulkan hasil menjadi satu vektor, kita perlupaste
sebuahc( )
sekitar semua ekspresi, yang menambahkan satu ton byte yang tidak perlusumber
Casio-Basic, 108 byte
Itu menyakitkan. Terutama karena
mod(x,y)
kembalix
ketika sebenarnya tidak seharusnya, yang berarti saya harus membuat fungsi mod saya sendiri : karenanyax-int(x/y)y
.Loop
i
dari 0 hinggalength(l)-1
, mengambil elemen berurutan dalamo
daftar dan melamarl[i]
untukx
danl[-i]
untuky
. (Indeks negatif tidak berfungsi, jadi saya kurangii
dari panjang daftar dan mengambil indeks itu.)107 byte untuk fungsi, +1 byte untuk ditambahkan
l
di kotak parameter.sumber
Java 8, 336 byte
Coba di sini.
Huh ..
Masukan sebagai
int[]
, output asjava.math.BigInteger[]
.Tanpa aturan " Untuk menutupi kasus sudut, input tidak akan berisi 0, tetapi mungkin mengandung bilangan bulat lainnya dalam kisaran dari infinity negatif ke positif tak terhingga. ", Menggunakan bilangan bulat dalam kisaran
-2147483648
untuk2147483647
, itu akan menjadi 186 byte (input sebagaiint[]
, dan tidak ada output karena ia memodifikasi input-array ini untuk menghemat byte):Coba di sini.
Penjelasan:
sumber