Sasaran Anda adalah menerima masukan seperti
Pie is good. I just ate a bunch of pies early this morning. Actually, it was closer to the afternoon. Mornings are good.
dan buat larik indeks dari string tempat huruf-huruf yang membentuk kata "Llama" muncul (masing-masing berurutan). Sebagai contoh, izinkan saya menunjukkan surat-surat yang ditunjukkan dengan tanda sisipan untuk menunjukkan indeks:
Pie is good. I just ate a bunch of pies early this morning. Actually, it was closer to the afternoon. Mornings are good.
^ ^ ^ ^ ^
Jadi array akan terlihat seperti:
[44, 67, 76, 105, 114]
(Jika aplikasi Anda menggunakan pengindeksan yang tidak berbasis 0, angkanya akan terlihat berbeda. Tidak masalah.)
Jika teks tidak memiliki llama, maka array harus kosong, nihil, nol, atau tidak terdefinisi.
Bahasa kode apa pun diterima. Ini adalah kontes kode-golf , jadi karakter paling tidak menang!
Jawaban:
CJam - 33
Ia mendapat indeks berbasis 1 (2 byte lebih banyak untuk berbasis 0)
Penjelasan:
l
membaca baris dari input (ganti denganq
untuk seluruh input)el
dikonversi ke huruf kecil"llama"{...}/
mengeksekusi blok untuk setiap huruf "llama"1$
menyalin string saat ini#
menemukan indeks)_
kenaikan huruf dan duplikatT+:T
menambahkan T (awalnya 0), memperbarui T dan membiarkannya pada tumpukan\@
bertukar item di sekitar, sekarang kita memiliki arus-T, indeks, string yang>
mengiris string mulai dari indeks;
muncul string yang tersisa]
mengumpulkan indeks dalam arrayPada titik ini kita memiliki semua indeks berbasis 1; Jika huruf apa pun tidak ditemukan, array akan memiliki duplikat.
___
membuat 3 salinan array|
(dengan 2 salinan array) menghapus duplikat=
membandingkan, menghasilkan 0 jika ada duplikat atau 1 jika tidak*
mengalikan array 0 atau 1 kali sesuaisumber
Perl, 52 byte
Solusinya disediakan sebagai fungsi yang mengambil string sebagai argumen dan mengembalikan daftar posisi.
Posisi berbasis satu, pencarian case-sensitive, tanpa baris baru: 52 byte
Pencarian case-sensitive mengembalikan array kosong dalam contoh pertanyaan, karena setelah mencocokkan tiga huruf pertama huruf kecil
m
hilang dalam teks input.Dukungan baris baru: + 1 byte = 53 byte
Teks sekarang dapat menjangkau beberapa baris.
Pencarian case-insensitive: + 1 byte = 54 byte
Sekarang contoh dalam pertanyaan melaporkan daftar posisi indeks, itu adalah angka berbasis satu:
Posisi berbasis nol: + 9 byte = 63 byte
Hasil untuk contoh dalam pertanyaan:
Tidak Disatukan:
Varian yang terakhir mencakup kurang lebih varian lainnya.
sumber
[]
dan yang ketiga mencetak[ ]
untuk saya (yang lebih lama berfungsi dengan benar). Saya menjalankan "perl, v5.8.8 dibangun untuk msys-64int". Apakah Anda memiliki bug, atau apakah itu bekerja pada versi perl yang berbeda?[]
benar untuk solusi pertama,M
tidak cocok dengan pencarian case-sensitive. Pertanyaannya cukup tidak jelas mengenai sensitivitas kasus.[]
diterima untuk dua yang pertama. Tetapi tiga solusi pertama masih belum berfungsi dengan baik untuk saya: jika Anda memberikan input yang seharusnya mengembalikan indeks, ia akan kembali[ ]
sed, 299 +1
Ya, sed dapat menemukan llama. Tidak, saya tidak bisa menghitung. Ini adalah jawaban terpanjang sejauh ini, pada 299 +1 karakter, karena saya harus mengajar sed untuk menghitung.
Jawaban ini membutuhkan sed dengan ekspresi reguler yang diperluas (
sed -E
ataused -r
). Saya menggunakan OpenBSD sed (1) . Input adalah satu string per baris. (Oleh karena itu, string mungkin tidak mengandung baris baru.) Output adalah garis angka, atau tidak sama sekali.Penggunaan (karakter +1 untuk
-r
):Kode sumber (299 karakter):
Program pertama menggantikan llama dengan lima
%
. (Semua%
dalam program ini literal.) Perintah pertamas/%/z/g
mengubah apa saja%
kez
dalam baris input. Lima perintah berikutnya menemukan llama, sehingga semua lengan di atas bahu mungkin sakit. menjadi A %% lengan di atas bahu% ll% ay% che. Karena masing.*
- masing serakah, saya selalu menemukan llama di sebelah kanan: llama llama akan menjadi llama %%%%% . Jika saya tidak bisa mendapatkan lima%
, maka/(.*%){5}/!d
hapus baris input dan lewati perintah berikutnya.s/[^%]/z/g
berubah setiap karakter tapi%
untukz
. Lalu saya memasukkan satu lingkaran.s/(z*)%/\10 z\1/
mengubah yang pertama%
menjadi0
, menyalin nol atau lebihz
dari kiri ke kanan, dan menambahkan satu lagiz
ke kanan. Ini agar jumlahz
kehendak sama dengan indeks. Misalnya,zz%zzz%...
menjadizz0 zzzzzzzz%...
karena yang pertama%
berada di indeks 2, dan yang berikutnya%
adalah di indeks 8.s/z*$//
menghapus tambahanz
dari ujung string.Sebelas perintah berikutnya dihitung
z
dengan menghapus masingz
- masing dan menghitung dari0
. Ini penting sepertizzz0
,zz1
,z2
,3
. Juga,1zzzz9
menjadiz1zzz0
(lambat23
), atauzzzz9
menjadi1zzz0
(lambat13
). Loop ini berlanjut hingga tidak ada lagi%
atauz
.sumber
Fortran -
154148Fortran mengisap golf, tetapi hanya untuk membuktikan bahwa string parsing dapat dilakukan dalam bahasa berbasis matematika, saya melakukannya:
Saya menyimpan beberapa karakter dengan menghilangkan yang tidak diperlukan
f
pada akhirendfunction
dan digunakanif(any(r==0))
sebagai gantinyaif(.not.all(r>0))
.Ini membutuhkan:
s
menjadi string dengan teksa
menjadi tes huruf kecil (yaitu,llama
)b
menjadi tes huruf besar (yaitu,LLAMA
)Program penuh, tidak golf adalah
sumber
C # - 119
Membawa string, output array. Tidak ada jika tidak ada string dalamama.
sumber
x=>x>=0
i
ke -1 dan meletakkan .ToArray () pada pernyataan. Pilih, seperti begituint[]a(string s){var i=-1;var o="llama".Select(x=>i=s.IndexOf(x,i+1)).ToArray();return o.All(x=>x>=0)?o:null;}
Ruby,
566563Edit : +9 karakter sehingga tidak peka huruf besar-kecil.
Menentukan fungsi (lambda, secara teknis)
f
.Kembali
nil
jika tidak ada llama. Jika harus[]
(array kosong), maka tambahkan saja||[]
sebelum yang terakhir}
untuk total 4 karakter tambahan .Versi yang dapat dibaca:
sumber
index(/#{c}/i
alih - alihupcase
.C - 53
Kompilasi dengan:
Saya menguji perintah kompilasi ini dengan gcc cygwin. Lingkungan lain mungkin menangani ruang, dan karakter khusus lainnya berbeda.
Hasil berbasis 0 disimpan ke dalam array
r
. Isinya tidak terdefinisi jika tidak ada llama di string.Peka huruf besar-kecil (53)
i,m,r[5];main(){for(;W[i];i++)W[i]==L[m]?r[m++]=i:i;}
Case-insensitive (58)
i,m,r[5];main(){for(;W[i];i++)(W[i]|96)==L[m]?r[m++]=i:i;}
sumber
JavaScript (ECMAScript 6) - 68 Karakter
Asumsikan bahwa string yang akan diuji ada dalam variabel
s
. Jika Anda ingin mengubahnya menjadi fungsi, tambahkan duluf=s=>
(untuk 5 karakter tambahan).Output:
Peka huruf besar kecil - 69 Karakter
Output:
Tidak Peka Huruf Besar & Pertama - 74 Karakter
Output:
sumber
Python, 100
Saya adalah pegolf terburuk yang pernah ada. : P
Terima kasih kepada @xnor untuk mencukur 6 byte.
o
berisi array setelahnya.EDIT : Diperbaiki.
EDIT 2 :
len(g)
untukg
,o==5
untuko>4
per saran @ xnor ini.EDIT 3 : @ Wolfram memperbaikinya.
sumber
o*=(len(o)==5)
sangat bagus . Mengerikan, tapi aku menyukainya!s
adalah string input, bukan? Tidak kemudian haruss.lower
menjadii.lower
? Namun, doe ituPython 71
Mengasumsikan masukan dalam
s
. Output dalamo
.Sunting: Diubah dari daftar menjadi tupel untuk menghemat 2 byte.
sumber
o
perlu memulai nonempty untuk mengambilo[-1]
. Mungkin itu lebih pendek meskipun hanya memulaio
sebagai[-1]
dan kemudian lakukano=o[1:]
? Mengganggu,-1
perjalanan awal memeriksa apakaho
berisi-1
.-1
-Idea dapat dibuat bekerja. Setidaknya, saya tidak berhasil :-( Namun, saya mengubah daftar menjadi tupel untuk menghemat 2 byte. :-)Python 100
Mencicipi:
sumber
Haskell, 111
Tidak Disatukan:
Contoh:
sumber
Matlab, 61
96Mencari string dan mengganti semuanya hingga setiap kecocokan dengan omong kosong sebelum mencari karakter berikutnya. Akan
s
dibiarkan tidak terdefinisi jika sebuah kata tidak muncul.Perhatikan bahwa charcount dapat dikurangi jika sensitivitas case dibolehkan.
Versi sebelumnya
Mencari string dan mengganti semuanya hingga setiap kecocokan dengan omong kosong sebelum mencari karakter berikutnya. Penanganan kesalahan (coba-tangkap-akhir) mungkin dapat dibatalkan, maka program akan macet (tetapi s tidak dapat ditentukan seperti yang diperlukan) jika llama tidak ditemukan.
Pelaksanaan:
Tanpa penanganan kesalahan:
sumber
Bahasa Jawa
sumber
Python (70)
Kami mencari setiap karakter secara
'llama'
bergantian, dimulai setelah lokasi karakter yang ditemukan sebelumnya. Jika tidak ada karakter yang ditemukan,c
menjadi nilai default-1
, dalam hal ini baris terakhir berubahr
menjadi daftar kosong.Sunting: Ditemukan yang
str.find(s,...)
dapat dipanggil sebagais.find(...)
, menyimpan 4 karakter.sumber
OpenEuphoria,
147128Saya punya dua contoh. Pertama, yang terpendek:
Saya bisa menurunkannya menjadi 126 karakter jika saya menggunakan "atau" bukannya "dan" seperti versi C di atas. Namun, ini juga cocok dengan string
''!-!
sebagaillama
. Jarang, tetapi masih ada kemungkinan kesalahan.Dan kemudian versi menggunakan ekspresi reguler:
Keduanya mengambil input dari STDIN dan memposting ke STDOUT.
EDIT: Contoh regex yang lebih pendek:
sumber
split
/join
atauexplode
/implode
, atau apakah OpenEuphoria tidak memiliki versi pendek dari itu?Powershell -
12185Saya masih berlatih dengan Powershell, berharap ini bisa diperbaiki
$ s berisi string, hasilnya dalam array $ a
Versi asli
Tidak disatukan
Versi baru, dengan terima kasih banyak kepada @goric
sumber
$a=@();$w="llama";$n=$c=0;foreach($i in $s.tochararray()){if($i-eq$w[$n]){$a+=$c;$n+=1}$c+=1};$a*=$a.length-gt4
foreach($i in $s.tochararray())
dengan[char[]]$s|%
, selama Anda mengubah berikutnya$i
ke a$_
. Yang mencukurnya menjadi 93:$a=@();$w="llama";$n=$c=0;[char[]]$s|%{if($_-eq$w[$n]){$a+=$c;$n+=1}$c+=1};$a*=$a.length-gt4
$w
variabel sama sekali, karena hanya digunakan satu kali. Cukupif($i-eq"llama"[$n])
+=1
s Anda dengan++
sPHP
belum ada jawaban PHP? Saya pikir bahasa yang sangat berorientasi string dapat mengalahkan setidaknya yang berbasis matematika
152 melawan fortran 154, pekerjaan dilakukan: P
ungolfed
jika penelepon selalu melewati string huruf kecil, maka penurunnya menjadi 137
sumber
<?
di awal kode Anda untuk membuatnya valid. Maaf ...JavaScript,
122115Menentukan fungsi yang menggunakan string sebagai satu-satunya argumen (argumen kedua adalah yang murah
var
) dan mengembalikan array kosong atau array 5-elemen.Turun menjadi 108 jika saya mengambil input pada variabel char tunggal (
s
) dan meninggalkan output di yang lain (b
):Sunting: Mengganti peta untuk for loop.
sumber
b=(z=[].map.call("llama",a=>b=s.toLowerCase().indexOf(a,++b))).indexOf(-1)<0?z:[]
Rebol, 97
Contoh penggunaan di konsol Rebol:
Rebol menggunakan pengindeksan berbasis 1. Mengembalikan daftar kosong
[]
jika tidak ada urutan llama yang ditemukan (case-sensitive).Tidak Disatukan:
sumber
APL, 47
Bukan kode terpendek, tetapi cukup bengkok, dengan cara APL.
Penjelasan
'amall',⊂⍬⍞
Buatlah array dengan 6 elemen: huruf 'amall' dan subarray dari 2 elemen, dengan sendirinya subarrays: array kosong dan sederet karakter yang dibaca dari input.{...}/...
Kurangi (kanan-lipat) array 6-elemen menggunakan fungsi yang disediakan.a s←⍵
Menguraikan argumen yang tepat ke dalam array indeks dan substring yang tersisa (awalnya array kosong dan string penuh.)~⍺∊s:⍬⍬
Jika substring tidak mengandung huruf berikutnya⍺
hentikan perhitungan dan kembalikan array kosong.a,←n←s⍳⍺
Kalau tidak, temukan posisinya, panggil saja n, dan tambahkan ke array indeks.a(n↓s)
Buat dan kembalikan array yang terdiri dari 2 elemen: array indeks yang diperluas dan substring yang tersisa.+\↑⊃...
Buka kemasan keluaran lipat, ambil elemen pertama (array indeks) dan pindai dengan tambahan, untuk mengubah offset relatif menjadi yang absolut.Contohnya
sumber
Julia, 76
Contoh regex lain menggunakan bahasa Julia.
sumber