Jika Anda belum tahu, angka empat pada dasarnya adalah nomor 4 bagian. Untuk keperluan tantangan ini, ia memiliki komponen nyata dan tiga komponen imajiner . Komponen imajiner yang diwakili oleh akhiran i
, j
, k
. Sebagai contoh, 1-2i+3j-4k
adalah angka empat dengan 1
menjadi komponen nyata dan -2
, 3
, dan -4
menjadi komponen imajiner.
Dalam tantangan ini, Anda harus menguraikan bentuk string dari angka empat (mis. "1+2i-3j-4k"
) Ke daftar / array koefisien (mis. [1 2 -3 -4]
). Namun, string angka empat dapat diformat dalam berbagai cara ...
- Mungkin normal:
1+2i-3j-4k
- Ini mungkin memiliki istilah yang hilang:
1-3k
,2i-4k
(Jika Anda memiliki istilah hilang, keluaran0
untuk istilah tersebut) - Mungkin hilang koefisien:
i+j-k
(Dalam hal ini, ini setara dengan1i+1j-1k
kata lain, a.i
,j
, Atauk
tanpa nomor di depan diasumsikan memiliki1
di depan secara default) - Itu mungkin tidak dalam urutan yang benar:
2i-1+3k-4j
- Koefisien mungkin hanya bilangan bulat atau desimal:
7-2.4i+3.75j-4.0k
Ada beberapa hal yang perlu diperhatikan saat parsing:
- Akan selalu ada
+
atau-
antara istilah - Anda akan selalu melewati input yang valid dengan setidaknya 1 istilah, dan tanpa huruf yang diulang (tidak ada
j-j
) - Semua angka dapat dianggap valid
- Anda dapat mengubah nomor ke dalam bentuk lain setelah parsing jika Anda ingin (ex.
3.0 => 3
,0.4 => .4
,7 => 7.0
)
Parsing / angka empat builtinion dan lubang standar tidak diizinkan. Ini termasuk eval
kata kunci dan fungsi. Input akan berupa string tunggal dan output akan berupa daftar, array, nilai yang dipisahkan oleh spasi, dll.
Karena ini adalah kode-golf , kode terpendek dalam byte menang.
Banyak kasus uji
1+2i+3j+4k => [1 2 3 4]
-1+3i-3j+7k => [-1 3 -3 7]
-1-4i-9j-2k => [-1 -4 -9 -2]
17-16i-15j-14k => [17 -16 -15 -14]
7+2i => [7 2 0 0]
2i-6k => [0 2 0 -6]
1-5j+2k => [1 0 -5 2]
3+4i-9k => [3 4 0 -9]
42i+j-k => [0 42 1 -1]
6-2i+j-3k => [6 -2 1 -3]
1+i+j+k => [1 1 1 1]
-1-i-j-k => [-1 -1 -1 -1]
16k-20j+2i-7 => [-7 2 -20 16]
i+4k-3j+2 => [2 1 -3 4]
5k-2i+9+3j => [9 -2 3 5]
5k-2j+3 => [3 0 -2 5]
1.75-1.75i-1.75j-1.75k => [1.75 -1.75 -1.75 -1.75]
2.0j-3k+0.47i-13 => [-13 0.47 2.0 -3] or [-13 .47 2 -3]
5.6-3i => [5.6 -3 0 0]
k-7.6i => [0 -7.6 0 1]
0 => [0 0 0 0]
0j+0k => [0 0 0 0]
-0j => [0 0 0 0] or [0 0 -0 0]
1-0k => [1 0 0 0] or [1 0 0 -0]
sumber
+
tanda-tanda yang tidak perlu dalam input? Suka+1k
:?+
.-0
bagian dari hasil hukum untuk dua contoh terakhir?eval
batasan yang harus diambil dalam sebuah string, diartikan sebagai kode dan / atau input. Konversi apa pun tidak dihitung di bawah ini karena Anda tidak dapat meneruskan, misalnya, string"test"
ke fungsi konversi integer untuk menerima integer, tetapitest
akan ditafsirkan sebagai kode dalameval
fungsi normal . TLDR: eval: tidak, ketik konversi: ya.Jawaban:
Pyth, 48 byte
Paket Tes Demonstrasi
Format output dipisahkan oleh baris baru. Kode test suite menggunakan pemisahan ruang, untuk kemudahan membaca, tetapi sebaliknya sama.
Keluaran
-0
dalam 2 kasus terakhir, yang saya harap tidak apa-apa.Penjelasan untuk diikuti.
sumber
Retina, 115
Cobalah online!
1 byte disimpan berkat @Chris Jester-Young .
Bug diperbaiki dan 6 byte disimpan berkat @Martin Büttner
Menemukan beberapa bug yang melibatkan beberapa kasus tepi, menumbuhkan jumlah byte cukup sedikit.
Mengembalikan angka yang dipisahkan baris baru. Ngomong-ngomong, ini memiliki solusi yang sebagian besar anggun seperti rusak oleh kasus tepi tapi hei saya harus menggunakan mode pengurutan, itu berarti saya menggunakan alat yang tepat untuk pekerjaan itu, kan?
Penjelasan:
Tahap demi tahap, seperti biasa.
Satu-satunya karakter dalam input yang dapat membuat batas kata adalah
-+.
. Ini berarti bahwa jika kami menemukan batas diikuti oleh surat, kami memiliki implisit1
yang kami tambahkan dengan penggantian.$&
adalah sinonim untuk$0
.Terima kasih banyak untuk Martin untuk yang ini, yang ini menambahkan secara implisit
0
untuk bagian yang sebenarnya jika tidak ada dalam input. Kami memastikan bahwa kami tidak dapat menemukan angka yang diikuti oleh tanda plus atau minus, atau akhir dari string. Semua bilangan kompleks akan memiliki surat setelahnya.3 tahap selanjutnya semuanya hampir sama, kecuali huruf mana yang berdampak. Semuanya terlihat untuk melihat apakah kami tidak dapat mencocokkan surat itu, dan jika kami tidak bisa, kami menambahkan
0
istilah untuk itu. Satu-satunya alasani
memiliki tambahan+
sebelum itu adalah untuk mencegah nilai riil tidak dapat dibaca dengani
koefisien s, angka-angka lainnya semuanya dipisahkan oleh variabel kompleksnya.Ah, bagian yang menyenangkan. Ini menggunakan tahap sortir agak baru, dilambangkan dengan
O
sebelum backtick pemisah opsi. Kuncinya di sini adalah untuk mengambil seluruh angka diikuti secara opsional oleh karakter kata, yang dalam hal ini hanya akan cocok dengan salah satunyaijk
. Opsi lain yang digunakan adalah$
yang menyebabkan nilai yang digunakan untuk mengurutkan kecocokan ini menjadi penggantinya. Di sini kita hanya menggunakan huruf opsional yang tersisa sebagai nilai sortir kami. Karena Retina mengurutkan secara leksikografis secara default, nilai-nilai diurutkan seperti di kamus, artinya kami mendapatkan kecocokan secara"", "i", "j", "k"
berurutan.Tahap ini menempatkan
+
tanda di depan semua tanda minus, ini diperlukan jika kita memiliki nilai negatif untuki
di tahap pemisahan, nanti.Kami menghapus pimpinan
+
untuk memastikan kami tidak memiliki baris baru pemimpin tambahan.Pisahkan garis yang tersisa pada menjalankan variabel kompleks atau tanda plus Ini dengan baik memberi kita satu nilai per baris.
sumber
Perl 5, 125 byte
sumber
\a
cocok dengan "alarm", bukan alfabet. Ada\w
untuk karakter-kata (alfanumerik dan garis bawah), tetapi itu tidak akan berfungsi di sini; kita membutuhkannya agar tidak cocok dengan angka.Lua ,
185187195183166 byte ( coba online ) [digunakan regex]Terima kasih kepada @Chris Jester-Young untuk regex yang ditingkatkan.
Terimakasih untuk @Katenkyo karena membawanya ke 166 byte.
Golf:
Tidak Disatukan:
sumber
n
dalam kasus ini), jadi Anda harus menambahkan kode untuk membaca input.io.read()
, gunakan(...)
. Ini akan mengarah ke argumen command-line pertama dan akan memungkinkan Anda untuk menyimpan 4 byte lagi :)r={0,0,0,0}for u in(...):gsub("([+-])(%a)","%11%2"):gmatch("-?[%d.]+%a?")do n,i=u:match("(.+)(%a)")r[i and(" ijk"):find(i)or 1]=(n or u)end print(table.concat(r," "))
C, 236 byte
(Untuk nilai-nilai seperti -0 atau -0.0, tanda minus juga dicetak dalam output,
tetapi karena tantangan menyatakan bahwa "Anda dapat mengubah angka menjadi bentuk lain setelah parsing jika Anda mau", dan jika -0 muncul di input, karena itu juga dapat diterima di output.@GamrCorps sekarang telah mengklarifikasi bahwa ini ok.)sumber
JavaScript (ES6),
103100 byteSunting: Disimpan 3 byte dengan beralih dari
parseInt
kecharCodeAt
, yang nyaman hanya perlu&3
membuat saya indeks array yang benar.sumber
JavaScript (ES6) 106
Uji
sumber
PowerShell, 178 byte
Tidak Digabungkan dengan Penjelasan
Tidak super terkesan tapi tetap saja hasilnya.
sumber
PHP, 179 byte
Coba test suite .
sumber
Python 3.5 - 496 byte [menggunakan Ekspresi Reguler]:
Ini mungkin lama, tetapi dalam pembelaan saya, ia bekerja dengan sempurna dalam melakukan apa yang diinginkan OP, karena semua kasus uji yang diberikan berhasil menggunakan kode saya.
Versi tidak dikoleksi dengan penjelasan termasuk:
Jika hal di atas agak terlalu sulit untuk dibaca, pada dasarnya yang terjadi adalah:
Jika ada, semua tanda + atau - yang TIDAK diikuti oleh angka diganti dengan "+1" / "- 1", secara berurutan.
Suatu
lambda
fungsi didefinisikan, yang bila digunakan dalam asorted
fungsi sebagai kunci, mengurutkan daftar sesuai dengan menempatkan seluruh angka terlebih dahulu, dan kemudian memerintahkan sisanya dalam meningkatkan nilai huruf ("i", lalu "j", lalu "k" dalam hal ini).Quaternion, sekarang semua tanda +/- diganti dengan 1 jika perlu, dicari, menggunakan Ekspresi Reguler, untuk SEMUA huruf TIDAK didahului dengan setidaknya satu nomor, dan huruf-huruf yang cocok diganti dengan "+1" diikuti oleh surat itu.
Pernyataan "jika" kemudian menggantikan tanda SEMUA +/- dengan spasi, dan kemudian Quaternion yang dimodifikasi sekarang "terpecah" di spasi tersebut, dan dikembalikan dalam daftar. Kemudian, daftar diurutkan sesuai dengan fungsi lambda yang dijelaskan sebelumnya. Akhirnya, item pertama dalam daftar itu dicentang untuk memastikan itu nomor, karena memang seharusnya begitu, dan jika tidak, maka "+0" ditambahkan ke Quaternion.
Lingkaran "untuk" yang kedua menemukan SEMUA huruf BUKAN dalam Quaternion dengan menemukan perbedaan simetris antara seperangkat huruf-huruf yang ditemukan dalam ekspresi, dan kemudian satu set termasuk semua huruf yang diperlukan. Jika ada yang ditemukan, maka "+0" diikuti dengan huruf yang hilang dan spasi ditambahkan ke Quaternion.
Akhirnya, pada langkah terakhir ini, "," ditambahkan di antara masing - masing karakter diikuti oleh simbol +/-, dan kemudian Quaternion dibagi di ruang-ruang tersebut, kemudian daftar yang dikembalikan diurutkan, untuk yang terakhir kalinya, sesuai dengan fungsi lambda didefinisikan sebagai "q" sebelumnya. Koma dalam ekspresi memisahkan setiap bagian dari angka empat (jika tidak, Anda akan mendapatkan sesuatu
14i+5j+6k
dari4i+5j+6k+1
). Terakhir, daftar yang sekarang disortir ini digabungkan menjadi satu string, dan hanya angka dari jenis apa pun (milik Ekspresi Reguler) yang diekstraksi, dan akhirnya dikembalikan dalam daftar, dalam urutan yang benar, setiap saat.sumber