Diberikan string X dan Y, tentukan apakah X adalah urutan dari Y. String kosong dianggap sebagai urutan dari setiap string. (Misalnya, ''
dan 'anna'
merupakan lanjutan dari 'banana'
.)
Memasukkan
- X, string alfanumerik sensitif-huruf yang mungkin kosong
- Y, string alfanumerik sensitif-huruf yang mungkin kosong
Keluaran
- Benar atau Salah (atau yang setara), dengan benar menunjukkan apakah X adalah kelanjutan dari Y.
Contoh I / O
X Y output
'' 'z00' True
'z00' 'z00' True
'z00' '00z0' False
'aa' 'anna' True
'anna' 'banana' True
'Anna' 'banana' False
Kriteria
- Program terpendek menang, sebagaimana ditentukan oleh jumlah byte kode sumber.
Contoh program
- Beberapa program yang bisa diadaptasi ada dalam posting terkait ini .
anna
adalah subsequence (tapi tidak substring) daribanana
. String X adalah urutan dari string Y hanya jika X dapat diperoleh dari Y dengan menghapus nol atau lebih elemen Y; misalnya, menghapusb
dan yang keduaa
daribanana
memberianna
.Jawaban:
Perl 5 , 17 byte (+1?), Program lengkap
Cobalah online!
Panggil dengan
p
bendera ke penerjemah perl, seperti padaperl -pe 's//.*/g;$_=<>=~$_'
. Sesuai aturan penilaian yang ditetapkan saat tantangan ini awalnya diposting , flag ini dikenai biaya satu byte tambahan. Di bawah aturan yang lebih baru , AFAICT, mungkin gratis.Either way, string input harus dipasok pada baris-baris terpisah baru pada stdin. Output (ke stdout) akan menjadi
1
jika string input pertama adalah substring dari yang kedua, atau tidak sama sekali jika tidak.Perhatikan bahwa kedua jalur input harus memiliki baris baru di akhir, atau program tidak akan berfungsi dengan benar. Atau, Anda dapat menambahkan
l
bendera baris perintah ke doa untuk membuat perl strip baris baru; tergantung pada aturan penilaian yang berlaku, ini mungkin atau mungkin tidak dikenakan biaya satu byte tambahan. Perhatikan bahwa menggunakan flag ini juga akan menambahkan baris baru ke output.Versi asli (snippet, 18 byte / karakter)
Input diberikan dalam variabel
$x
dan$y
, hasilnya adalah nilai ekspresi (dalam konteks skalar). Catatan yang$x
dimodifikasi dalam proses. (Ya, saya tahu menggunakan$_
bukannya$x
akan membiarkan saya menghemat empat karakter, tetapi melakukannya dalam potongan yang terasa agak terlalu murahan bagi saya.)Bagaimana cara kerjanya?
Bagian pertama
$x=~s//.*/g
,, menyisipkan string.*
antara setiap karakter dalam$x
. Bagian kedua$y=~$x
,, memperlakukan$x
sebagai regexp dan cocok$y
dengan itu. Di Perl regexps,.*
cocok dengan nol atau lebih karakter arbitrer, sementara semua karakter alfanumerik cocok dengan diri mereka sendiri.sumber
Ruby, 32 karakter
Solusi ini kembali
nil
jikax
bukany
merupakan urutan dari dan nomor sebaliknya (yaitu setara ruby denganfalse
dantrue
). Contoh:sumber
y=~/#{[*x.chars]*".*"}/
(23 karakter). tepuk tangan!y=~/#{x.split("")*".*"}/
(21 karakter) :)y=~
sementara mengotak-atik ini di irb ...Haskell,
5137Terima kasih kepada Hammar untuk peningkatan yang substansial. Sekarang fungsi infiks, tetapi sepertinya tidak ada alasan mengapa tidak.
Demonstrasi:
sumber
s x y=x<=y
. Selain itu, Anda dapat menyimpan lebih banyak dengan menjadikannya operator dan menggunakan@
-pattern sebagai ganti(f:l)
. Ini memotongnya menjadi 37 karakter:h@(f:l)%(g:m)=f==g&&l%m||h%m;x%y=x<=y
Python (48 karakter)
Pendekatan yang sama seperti jawaban Ruby Howard. Sayang sekali tentang kebutuhan Python untuk mengimpor paket regex dan "verbose" -nya
lambda
. :-)sumber
Python, 59 karakter
Saya pikir jawaban saya akan lebih baik diungkapkan dengan Python.
Edit: Menambahkan saran res.
sumber
x="a"
dany="ab"
Anda akan keluar dari lingkaran dengany=="b"
dan kembalifalse
?x
dany
up. Dalam fungsi sayay
harus menjadi lanjutan darix
. Saya pikir saya lebih baik mengubahnya untuk menghindari kebingungan.def s(x,y): for c in y: if x:x=x[c==x[0]:] return x==""
. Itu tidak ditampilkan dengan benar dalam komentar, tetapi saya pikir Anda dapat melihat apa yang saya maksud. (Juga, satu ruang tambahan cukup untuk meningkatkan level indent.)''
dan menyimpan beberapa karakter dengan menulisx=x[c==x[0:1]:]
GolfScript (22 karakter)
Mengasumsikan input diambil sebagai dua variabel yang telah ditentukan
X
danY
, meskipun itu agak tidak biasa di GolfScript. Meninggalkan1
benar atau0
salah pada tumpukan.sumber
C (52 karakter)
Uji kasus
sumber
s(char*x,char*y){x=!*x||*y&&s(x+(*x==*y),y+1);}
Burlesque (6 karakter)
6 karakter dalam Burlesque:
R@\/~[
(dengan asumsi x dan y ada di stack. Lihat di sini dalam aksi.)sumber
C, 23:
menghasilkan * x
http://ideone.com/BpITZ
sumber
PHP, 90 karakter
sumber
if
pernyataan dan menyederhanakan ke$x=substr($x,$y[$a++]==$x[0])
: ideone.com/Ch9vKScala 106:
sumber
CoffeeScript
1121009589Upaya pertama saya di golf kode ... harap saya tidak mempermalukan keluarga saya!
Edit : ternyata Coffeescript lebih memaafkan daripada yang saya kira dengan spasi putih.
Terima kasih kepada res dan Peter Taylor untuk beberapa tips untuk membuatnya lebih ramping
sumber
z=(x,y)-> a=x.length return 1if a==0 b=y.indexOf x[0] return 0if b<0 z x[1..a],y[b+1..y.length]
. (Di beberapa browser, misalnya Chrome, Anda dapat melihat kode komentar yang ditampilkan dengan benar dengan mengklik kanan, lalu Inspect Element.)a.length
tidak pernah akan menjadi negatif, sehingga Anda dapat menyimpan satu karakter lebih dengan menggantiif a==0
denganif a<1
. Saya tidak tahu bagaimana cara kerja CoffeeScript, tetapi jika itu lexif0
sebagai dua token Anda bisa menyimpan dua lagi dengan membalik kedua kondisi (yaituif1>a
).if1>a
tidak valid, tetapiif!a
karakternya lebih pendek! Saya juga menyadari bahwa saya dapat mencukur karakter tambahanb+1
untuk dikonversib
dan ditambahkan pada baris sebelumnya, juga membuatif
trik yang sama mungkin karena berhadapan dengan situasi 0 / non-0.C #,
7011310790 karaktersumber
static bool S(string x,string y){if(x!=""&&y=="")return false;return x==""||S(y[0]==x[0]?x.Remove(0,1):x,y.Remove(0,1));}
x==""||y!=""&&S(...)
, tetapi masih lebih lama dari versi Linq yang diperbarui. Penggunaan yang bagusAny
!Mathematica
19 1727LongestCommonSequence
mengembalikan urutan terpanjang non-berdekatan dari dua string. (Jangan dikelirukan denganLongestCommonSubsequence
, yang mengembalikan urutan berdekatan paling lama.Berikut ini memeriksa apakah urutan berdekatan terpanjang adalah yang pertama dari dua string. (Jadi, Anda harus memasukkan string yang lebih pendek diikuti oleh string yang lebih besar.)
Contohnya
Benar Benar Benar Salah
Tes kritis adalah yang ketiga, karena "anna" terkandung secara tidak berdampingan dalam "pisang".
sumber
Python 3.8 (pra-rilis) , 42 byte
Cobalah online!
Python 3.8 (pra-rilis) , 48 byte
Cobalah online!
Python 2 , 48 byte
Cobalah online!
Disalin dari jawaban Lynn ini . The
>0
dapat dihilangkan jika hanya truthy / falsey output OK.Python 2 , 50 byte
Cobalah online!
Python 2 , 50 byte
Cobalah online!
sumber
C -
74 7164Ini tidak mengalahkan solusi Peter Taylor, tapi saya pikir ini cukup menyenangkan
(plus, ini adalah program kerja yang lengkap, bukan hanya fungsi)Dan ungolfed:
Untuk mengujinya, Anda dapat melakukan sesuatu seperti:
sumber
!=0
dalam suatu kondisi agak verbose ... Program vs fungsi adalah sesuatu yang pertanyaan perlu tentukan dengan jelas, dan di sini tidak, jadi jawabannya mengambil opsi yang berbeda.!='\0'
kebiasaan buruk (baik?) Dari menulis kode non-golf, saya sudah membiarkan itu masuk dalam dua putaran golf terakhir saya, saya harus lebih berhati-hati di masa depan. Mengenai fungsi program vs., ya, Anda memang benar.Python,
66625958 karakterSemacam solusi yang menyenangkan, pasti masalah yang rapi.
sumber
Ruby
323028Ini akan mengembalikan
MatchData
instance jikaa
merupakan hasil darib
ataunil
sebaliknya.Versi lama yang menemukan substring alih-alih berikutnya
Ruby 15
Menggunakan
String#[](str)
metode yang mengembalikanstr
jikastr
merupakan substring dariself
dan!!
mengembalikanBoolean
jika nilai yang dikembalikan dapat digunakan sebagai boolean (dan tidak perlu menjaditrue
ataufalse
) maka itu bisa hanya 13 karakter:Ini akan kembali
nil
jikaa
bukan substring darib
.sumber
SWI-Prolog, SICStus
Sublist predikat bawaan / 2 dari SICStus memeriksa apakah semua item dalam daftar pertama juga muncul di daftar kedua. Predikat ini juga tersedia di SWI-Prolog melalui pustaka kompatibilitas, yang dapat dimuat oleh kueri
[library(dialect/sicstus/lists)].
.Contoh dijalankan:
Hitungan byte secara teknis bisa 0, karena semua yang kita lakukan di sini adalah query, seperti bagaimana kita menjalankan sebuah program dan menyediakan input ke dalamnya.
sumber
PHP, 41 Bytes
mencetak 1 untuk true dan nothing for false
Jika hanya penyisipan dari kata 1 ke kata 2 dilakukan penghitungan adalah nol untuk kasus nyata
levenshtein
Cobalah online!
PHP, 57 Bytes
mencetak 1 untuk true dan 0 untuk false
Membuat Regex
Cobalah online!
sumber
.*
tidak perlu. -2 bytes: jangan assign$argv
ke$a
. +24 byte: kebutuhanarray_map(preg_quote())
untuk karakter khusus (gunakan tanda kurung sebagai pembatas untuk menghindaripreg_quote
parameter kedua .)preg_match
tidak akan mengeluh tentang regex kosong selama pemisah ada. Itu hanya akan cocok dengan apa pun. Tapi preg_quote hanya 22 byte, bukan 24:array_map(preg_quote,str_split(...))
..*
.Brachylog , 2 byte
Cobalah online!
Seperti dengan jawaban ini,
⊆
adalah predikat bawaan yang menyatakan hubungan antara variabel input dan output, danᵈ
merupakan predikat meta yang memodifikasinya untuk menyatakan bahwa hubungan yang sama antara elemen pertama dan kedua dari variabel input sebagai gantinya (dan menyatukan variabel output dengan elemen kedua tetapi karena ini adalah masalah keputusan yang tidak berakhir berarti di sini).X⊆Y
adalah pernyataan bahwa X adalah kelanjutan dari Y, oleh karena itu begitu juga[X,Y]⊆ᵈ
.Predikat ini (yang tentu saja menghasilkan melalui keberhasilan atau kegagalan yang mencetak
true.
ataufalse.
ketika dijalankan sebagai suatu program) mengambil input sebagai daftar dari dua string. Jika input sedikit lebih fleksibel ...Brachylog , 1 byte
Cobalah online!
Mengambil string X sebagai variabel input dan string Y sebagai variabel output. Keluaran melalui keberhasilan atau kegagalan, seperti sebelumnya. Jika dijalankan sebagai program lengkap, X diberikan sebagai input dan Y disediakan sebagai argumen baris perintah pertama.
sumber
CoffeeScript 73
Inilah jawaban alternatif CoffeeScript, menggunakan regex bukannya rekursi:
Jika tumpukan jerami cocok dengan regex yang sangat rakus dibangun dari jarum, itu akan diganti dengan string kosong. Jika tumpukan jerami lebih pendek daripada yang dimulai, jarum adalah urutan.
Mengembalikan nilai false saat
x
dany
keduanya merupakan string kosong. Pikirkan kita perlu filsuf untuk memberi tahu kita jika string kosong adalah hasil dari dirinya sendiri!(Diposting sebagai jawaban yang terpisah dari jawaban saya sebelumnya karena rasanya cukup berbeda untuk membenarkannya).
sumber
PowerShell, 38
Tentu saja, solusi berbasis pencocokan regex atau pencocokan pola seperti itu memiliki masalah kinerja yang parah dengan string yang lebih panjang. Tapi karena sesak adalah kriteria ...
sumber
Semacam anti-solusi yang menghasilkan semua selanjutnya dari Y:
Python 93
sumber
APL (31)
Penanganan string agak kurang dalam APL.
pemakaian:
sumber
Python 132
Mirip dengan Daniero. Bukan solusi termudah, tapi itu menyenangkan untuk dicoba. Saya baru mengenal Python, jadi saya yakin saya bisa membuatnya lebih pendek jika saya tahu sedikit lebih banyak.
sumber
Python - 72
sumber
Python (
7552)Solusi rekursif sederhana. Pertama kali bermain golf, jadi setiap tips untuk mengurangi ini sangat dihargai :)
Diuji dengan yang berikut:
Terima kasih kepada @ lirtosiast untuk beberapa trik boolean yang pintar.
sumber
s=lambda a,b:a==''or b>''and s(a[a[0]==b[0]:],b[1:])
PHP,
756564 bytemengambil input dari argumen baris perintah; mencetak
1
untuk string benar, kosong untuk false. Jalankan dengan-r
.penjelasan:
strpos
kembalifalse
jika jarum$c
tidak ada di tumpukan jerami$argv[2]
(setelah posisi$p
),menyebabkan loop putus.
strpos
juga kembalifalse
untuk jarum kosong, memutus loop pada akhir$argv[1]
.$argv[1]
merupakan kelanjutan dari$argv[2]
,$c
akan kosong ketika loop putus.strpos
perlu@
menekanEmpty needle
peringatan.sumber
+$p
bukannya$p+1
setelah itu tidak perlu untuk garis bawah+1
diperlukan untuk maju dalam string tumpukan jerami; dan garis bawah menghindari$p=-1
inisialisasi. Tapi ... aku bisa menghindarinyafalse!==
.Swift, 27
sumber