Menafsirkan rentang longgar
ListSharp adalah bahasa pemrograman yang ditafsirkan yang memiliki banyak fitur, salah satu fitur tersebut adalah pencipta rentang berbasis 1 indeks yang berfungsi seperti ini:
Anda mendefinisikan rentang sebagai (INT) TO (INT)
atau hanya di (INT)
mana keduanya atau int tunggal dapat pergi dari nilai min ke max int32
Lalu Anda bisa menggunakan rentang itu untuk mengekstrak elemen array tanpa takut melampaui batasnya
karena itu:
1 TO 5
menghasilkan: {1,2,3,4,5}
3
menghasilkan: {3}
Kisaran dapat ditambahkan menggunakan AND
operator
1 TO 5 AND 3 TO 6
menghasilkan: {1,2,3,4,5,3,4,5,6}
ingat ini bekerja dengan angka negatif juga
3 TO -3
menghasilkan: {3,2,1,0,-1,-2,-3}
Tantangannya adalah sebagai berikut:
Memasukkan
Array karakter dan klausa rentang yang didefinisikan sebelumnya sebagai string
Keluaran
Elemen-elemen di lokasi berbasis indeks 1 rentang (indeks tidak ada / negatif menerjemahkan ke karakter kosong)
Bagaimana cara menang
Sebagai tantangan kode-golf, Anda seharusnya membuat program dengan jumlah byte terpendek untuk menang
Telah ditunjukkan bahwa karakter kosong tidak ada, oleh karena itu Anda harus mengabaikannya (saya hanya menunjukkannya di sini untuk membuatnya lebih mudah dipahami namun membingungkan orang)
Kasus uji:
input array is:
{'H','e','l','l','o',' ','W','o','r','l','d'}
range clause:
"1 TO 3" => "Hel"
"5" => "o"
"-10 TO 10" => "Hello Worl"
"0 AND 2 AND 4" => "el"
"8 TO 3" => "oW oll"
"-300 AND 300" => ""
"1 TO 3 AND 3 TO 1" => "HelleH"
"-20 TO 0 AND 1 AND 4" => "Hl"
sumber
"0 TO 2"
=>{'H', 'e', 'l'}
?3 TO 3
akan menjadi input dan apa output yang diharapkan?AND
memasukkan rentang kelipatan. Selain itu, Anda tidak menjawab jika kami dapat menggunakan pengindeksan berbasis nol, yang merupakan standar di sebagian besar bahasa.Jawaban:
Python 2 -
239211210 byteTerima kasih kepada @ mbomb007 dan @Cyoce untuk lebih lanjut golf solusi ini!
Pendekatan lurus ke depan. Mencoba generator dan versi rekursif, tetapi mereka tidak bisa mengalahkan yang sederhana untuk setiap loop. Saya seorang pemula golf, jadi ini kemungkinan besar dapat ditingkatkan sedikit. Juga, kelemahan utama dari cuplikan ini adalah bahwa rentang sebagai objek daftar dihitung lagi setiap kali elemen diambil dari array karakter (lihat baris terakhir, pemahaman daftar). Ini berarti waktu
r(s)
dieksekusilen(r(s)) + 1
.Kode tidak dikunci:
Kasus uji:
Keluaran:
sumber
if
garis yang sama dan memisahkannya dengan titik koma. Dan hapus ruang di[x] for
. Juga,1if b else-1
bisa diganti dengan salah satub and 1or-1
atau2*bool(b)-1
untuk menyimpan byte.lambda
, karena itu tidak rekursif.t+=[int(x)]
canbecomet+=int(x),
Groovy (
9997 Bytes)Cobalah di sini: https://groovyconsole.appspot.com/edit/5155820207603712
Penjelasan:
.replaceAll(" TO ","..")
- Ganti to dengan rentang tradisional..replaceAll(" AND ", ",")
- Ganti semua ands dengan koma."[${...}]"
- Kelilingi dengan notasi "daftar" di Groovy.Eval.me(...)
- Mengevaluasi string sebagai kode Groovy..flatten()
- Ratakan campuran array 2D dan array 1D menjadi array 1D..collect{v[it]}
- Kumpulkan indeks dari array ke dalam satu struktur.Berikut ini adalah solusi
115113 byte yang menghilangkan null dari output: https://groovyconsole.appspot.com/edit/5185924841340928Inilah solusi 117 byte jika Anda mengatakannya HARUS diindeks pada 1 bukannya 0: https://groovyconsole.appspot.com/edit/5205468955803648
Jika Anda ingin saya menukar yang asli dengan byte 113/117, beri tahu saya.
sumber
Eval.me(...)
sampai sekarang; diberi menggunakannya dalam praktek akan sangat tidak aman, masih merupakan hal yang keren untuk diketahui.C #, 342 byte
Metode yang tidak digabungkan:
Program lengkap dengan uji kasus:
Solusi naif, menggunakan daftar char, yang digunakan
' '
sebagai karakter kosong dan menyelesaikan pekerjaan. Berharap untuk segera membaik.sumber
Scala, 165 byte
Penjelasan:
sumber
Python 2,
156155 byteJawaban saya memiliki beberapa ide yang mirip dengan jawaban 1Darco1 , tetapi dengan menggunakan pendekatan yang berbeda dari awal (string mengiris daripada daftar), itu berakhir sedikit lebih pendek. Akan lebih pendek empat byte jika pengindeksan 0 diizinkan.
Cobalah online
Untungnya, saya dapat mengurai string yang berisi spasi menjadi bilangan bulat. Pengindeksan negatif dalam indeks Python dari akhir string, jadi saya gunakan
i[-1]
untuk menjadi sama dengani[0]
atau nilai kedua, jika ada. Maka saya harus menyesuaikan nilai rentang negatif menjadi lebih negatif, sehingga tidak akan mengacaukan pengirisan. Mengalikan nilai negatif dengan11**9
(2357947691
) akan menjelaskan rentang menggunakan nilai min integer. Kemudian, cukup iris string, menggunakan irisan terbalik jika rentangnya terbalik.Dengan pengindeksan nol (151 byte):
sumber
range
Pendekatan saya pada dasarnya hanya bentuk super verbose dari itu. Dan Anda bahkan menyingkirkan seluruhif"T"in x: else:
bagian. +1R, 142 byte
Dengan asumsi saya memahami tantangan dengan benar, di sini saya berasumsi itu
r
adalah klausa rentang yang ditentukan sebelumnya dalam format string, dan bahwa array input ("Halo dunia", dalam contoh) dibaca dari stdin.Beberapa test case:
Tidak diikat / dijelaskan
Baris 1
R memiliki operator infiks yang bagus
:
yang menghasilkan urutan.1:5
memberi[1, 2, 3, 4, 5]
, dan0:-2
memberi[0, -1, -2]
. Jadi, kami menggantiTO
klausa rentang longgar dengan:
.Menafsirkan
AND
hanyalah penggabungan. Kita dapat menggunakan fungsic
untuk itu, yang dengan mudah dapat mengambil sejumlah argumen, dipisahkan oleh koma. Jadi kami gantiAND
dengan,
dan kemudian membungkus semuanya dalam
c(
,)
.Ini menghasilkan string karakter yang bisa terlihat seperti
c( 1 : 5 , 7 )
. Kami memanggilparse
untuk mengonversi untuk mengetik "ekspresi" dan kemudianeval
untuk mengevaluasi ekspresi. Urutan angka yang dihasilkan kemudian ditugaskan kembali ke variabelr
.Baris 2
Sekarang untuk bagian yang jelek - berurusan dengan string dalam R, yang menjadi berantakan dengan cepat. Pertama kita mendefinisikan
e
menjadi string kosong (kita akan membutuhkan ini nanti).Kami membaca dari stdin dan mengonversi string karakter menjadi array karakter individual dengan membelah string kosong. (Misalnya kita beralih dari "Hai" ke ["H", "i"].) Ini mengembalikan daftar panjang 1, jadi kita harus meminta elemen pertama
[[1]]
untuk mendapatkan array yang dapat kita kerjakan. Ugh, aku memperingatkanmu ini berantakan.Indeks R mulai dari 1, dan memiliki fitur yang bagus dengan angka negatif. Misalkan
x
adalah['a', 'b', 'c']
. Panggilanx[1]
kembali tidak mengejutkan'a'
. Memanggilx[-1]
mengembalikan semuax
kecuali indeks1
, yaitu['b', 'c']
. Ini adalah fitur keren, tetapi berarti kita harus berhati-hati dengan indeks negatif kita untuk masalah ini. Jadi untuk saat ini, kami hanya mengembalikan elemen array input dengan indeks>0
, dan menetapkan hasilnyao
.Baris 3
Namun, ada masalah! Untuk indeks yang lebih besar dari panjang array, R hanya mengembalikan
NA
nilai. Kami membutuhkannya untuk mengembalikan string kosong. Jadi kita mendefinisikan unsur-unsuro
yangis.na(o)
merupakanTRUE
menjadi string kosong.Baris 4
Akhirnya, bagaimana kita berurusan dengan indeks negatif (dan nol)? Mereka semua harus mengembalikan string kosong, jadi kami mengulangi string kosong N kali, di mana N adalah jumlah indeks yang ada
<1
.Akhirnya, kami menggabungkan daftar yang sebelumnya ditentukan
o
ke daftar ini (berpotensi kosong).sumber
JavaScript (ES6), 141
Fungsi tanpa nama dengan 2 parameter, yang pertama adalah array karakter (bisa berupa string juga), yang kedua adalah string yang berisi definisi rentang.
Nilai kembali adalah array di mana setiap elemen dapat berupa karakter tunggal atau nilai js
undefined
. Ketika dirumuskan, ini menghasilkan urutan karakter yang dipisahkan koma, yang tidak ditentukan ditampilkan sebagai karakter "kosong" - sebagai kasus uji dalam versi pertama pertanyaan.Menggunakan
.join
Anda bisa mendapatkan hasil string yang mirip dengan output kasus uji dalam versi pertanyaan saat ini.Kurang golf
Uji
sumber
Perl - 110 byte
Memanggil script di baris perintah dengan string sebagai argumen pertama, dan jangkauan sebagai yang kedua.
De-dikaburkan:
sumber
Python 2, 146 byte
Semua tes ada di ideone
Pisahkan klausa,
s
pada "AND", pisahkan setiap sub-klausa yang dihasilkan pada "TO", mengubah string yang dihasilkan menjadiint
menggunakanmap
. Hasilnya masing-masing akan memiliki 1 atau 2 item (1 jika tidak ada "TO" ada di sub-klausa).Buat rentang berbasis 0 untuk masing-masing menggunakan parameter langkah rentang sebagai 1 atau -1 dengan memeriksa nilai pada indeks 0 dan -1 (daftar dengan satu entri memiliki entri tersebut di kedua indeks).
Jalankan melalui rentang ini dan membuat daftar output, jika indeks yang disediakan dalam kisaran (
if 0<=i<len(a)
).sumber
Jelly ,
28 2725 byteTryItOnline (juga akan bekerja dengan string alih-alih array char)
Bagaimana?
sumber
Clojure
232230229 byteOh, sungguh monster yang telah kubuat ... Tapi sebenarnya ini baru 260 ketika aku akan mengirimkannya.
Edit: menghapus spasi dari
#(get r %_"")
,(if_(< f t)
dan(take-nth 2_%)
(ditunjukkan sebagai_
).Kurang golf:
Menggunakan
clojure.string/split
untuk membagi dengan "DAN" dan "",take-nth
menjatuhkan "TO" antara integer, pencocokan argumen fungsi menangani kasus 1 atau 2 argumen dan hanya itu saja.Konvensi panggilan:
(f "Hello World" "1 TO 3 AND 2 AND 8 TO 2")
sumber
#
karakter.#
? Saya mencobanya tanpa hasil, itu "digabungkan" dengan token sebelumnya. Oh, satu ruang lagi untuk dihapus sebelum di%
sana.