Dalam tantangan ini, Anda menerima string sebagai input yang berisi string X, Y, dan Z misalnya. "XYZZ". X, Y dan Z mewakili karakter tertentu. Pola ini kemudian dibandingkan dengan input string kedua. Jika pola ada sebagai substring pada input kedua, kembali True
, jika tidak, kembali False
. Setelah pola ditemukan dalam kata, program berhenti mencari dan kembali True
.
Contohnya
Pola: "XXYY"
succeed ---> True (pattern found: ccee)
success ---> False (pattern not matched)
balloon ---> True (pattern found: lloo)
Pola: "XYXYZ"
bananas ---> True (pattern found: nanas)
banana ---> False (pattern not found)
- Catatan: Ini bukan input yang sebenarnya. Ini adalah contoh bagaimana program seharusnya bekerja. Program Anda harus menampilkan
True
atauFalse
, atau nilai-nilai Kebenaran / Kepalsuan lainnya.
Informasi penting / bermanfaat lainnya
- Polanya tidak perlu mengandung X, Y dan Z, itu bisa berisi X dan Y atau bahkan (walaupun agak tidak ada gunanya) hanya X.
- Polanya tidak boleh kosong, tetapi ini tidak akan digunakan sebagai kasus uji.
- String pencarian tidak akan kosong, dan akan menjadi huruf kecil.
- Urutan alfabet X, Y dan Z dalam pola tidak masalah.
- X, Y dan Z harus berupa karakter unik.
- Anda dapat menggunakan perpustakaan apa pun yang Anda inginkan.
- Skor ditentukan oleh ukuran kode , dalam byte. Skor terendah menang.
Semoga berhasil!
Jawaban:
Perl 5 , 85 byte
Disimpan 40 byte berkat saran Peter Taylor! (lihat versi lama saya di bawah untuk melihat perbedaannya)
83 byte kode +
-pl
bendera.Cobalah online!
XYXYZ ditransformasikan menjadi
((?!\1).)((?!\1)(?!\2).)\1\2((?!\1)(?!\2)(?!\3).)
(yup, beberapa tes tidak mungkin benar, tetapi lebih pendek seperti itu), dan input kedua kemudian diperiksa terhadap regex itu. (lihat penjelasan versi lama saya untuk mendapatkan lebih banyak intuisi tentang cara kerjanya)Versi saya yang lebih lama:
Terima kasih kepada Arnauld karena menunjukkan kesalahan yang saya buat di versi pertama saya.
113 byte kode +
-pl
bendera, dan-Mre=eval
.Cobalah online!
Pada contoh XYXYZ: regex pertama akan mengubah pola menjadi (.) (.) \ 1 \ 2 (.), Dan menambahkan pada akhir tes untuk memeriksa apakah
$1
,$2
dan$3
berbeda: jika demikian,$\
disetel ke satu. Kemudian, input kedua adalah testis terhadap regex ini, dan$\
dicetak secara implisit di akhir.Regex yang dihasilkan untuk XYXYZ adalah
(.)(.)\1\2(.)(?{++$c;$\=1if!grep{$v{$c}{${$_}}++}1..3})^
.(Saya akan menambahkan sedikit detail pada penjelasan ketika saya punya waktu sebentar)
sumber
(.)((?!\1).)\1\2((?!\1)(?!\2).)
?Jelly , 9 byte
Mengembalikan berapa kali polanya ditemukan, bukan nol menjadi benar dan nol menjadi palsu.
Cobalah online!
Bagaimana itu bekerja
sumber
JavaScript (ES6), 94 byte
Bekerja dengan mengubah pola menjadi regexp, misalnya untuk
XYXYZ
menghasilkan/(.)(?!\1)(.)\1\2(?!\2)(?!\1)(.)/
.Saya melihat perbedaan yang menarik antara PCRE dan JavaScript regexp: di PCRE,
\<n>
gagal (dan karenanya(?!\<n>)
berhasil) sebelum grup tangkap didefinisikan, sementara JavaScript berhasil mencocokkan string kosong (dan karenanya(?!\<n>)
gagal).sumber
Python 2 , 70 byte
Cobalah online!
Periksa apakah string cocok dengan pola menggunakan metode dalam jawaban ini . Menggunakan awalan string pencarian yang panjangnya sama dengan pola. Memotong karakter pertama dari string string hingga kecocokan ditemukan, atau
False
jika menjadi kosong73 byte:
Cobalah online
Periksa apakah string cocok dengan pola menggunakan metode dalam jawaban ini . Secara rekursif memeriksa semua substring dengan bercabang untuk menghapus karakter pertama atau terakhir hingga string kosong.
sumber
Python 3 , 100 byte
Cobalah online!
sumber
05AB1E ,
1916 byteCobalah online!
Akan mengembalikan 1 jika benar, nol jika tidak benar.
Ini bisa 14 byte jika mengembalikan nilai XYZ yang dimungkinkan diizinkan:
05AB1E , 14 byte
Cobalah online 2!
sumber
1
danTrue
(yang biasanya merupakan kelemahan untuk tantangan semacam ini), tetapi jika spec tantangan dapat diartikan sebagai memungkinkan kita untuk mendefinisikan kebenaran / kepalsuan untuk tantangan tersebut versi kedua berfungsi seperti yang Anda katakan.Java 7,
177176173 bytePenjelasan:
Kode uji:
Coba di sini.
Keluaran:
sumber
PHP, 89 Bytes
Hadiah dari @Christoph dan @Titus
PHP, 105 Bytes
Hadiah dari @Christoph
PHP, 167 Bytes
sumber
++$p
alih-alih($p+1)
, meskipun saya belum benar-benar mengujinya.[,$a,$b]=$argv;foreach(str_split($a)as$k=>$v)$r.=$k==($p=strpos($a,$v))?"(.)":"\\".++$p;echo preg_match("#$r#",$b);
.[,$a,$b]=$argv;foreach(str_split($a)as$v)$r.=$x[$v]?"\\$x[$v]":'(.)'.!$x[$v]=++$y;echo preg_match("#$r#",$b);
(Perhatikan bahwa Anda harus menyimpan skor lama Anda menggunakan<strike>
)!
. Lebih bernilai daripada poin yang bisa saya raih dengan solusi bagus Anda.$argv
ke$a
dan$b
; -6 byte denganfor(;a&$v=$argv[1][$i++];)
; -1 byte dengan nama variabel lagi ( memang! : Gunakan$vv
bukan$v
,$ii
bukan$i
,$rr
bukan$r
,$yy
bukan$y
dan Anda dapat menggunakan$$vv
bukannya$x[$v]
)C #,
184165155 byteterima kasih aloisdg!
solusi mundur, sebagai bonus itu bekerja dengan pola dengan karakter apa pun!
sumber
var s=l==n.Length;
? Anda hanya menggunakannya direturn s?!s:
( di mana!s
selalufalse
), sehingga dapat diubah menjadireturn l==n.Length?0>1:
. Juga, apa ini:(n[i]!=n[j]||n[i]!=n[j])
. Anda memeriksan[i]!=n[j]
dua kali .. Ini akan selalu menjaditrue or true
/false or false
..: Sint l = p.Length,i = 0, j;
i++
danj--
bagian dalam Anda untuk loop. misalnya:for(j=i;j>=0;)if(p[i]==p[j]==(n[i]!=n[j--]))
Ruby,
6361 byteAlih-alih mencari pola regex, coba ganti 'X', 'Y' dan 'Z' dengan semua cara yang mungkin, dan temukan kecocokan literal.
(Sebenarnya konsep yang sama dengan jawaban 05AB1E carusocomputing)
sumber
JavaScript (ES6),
92898786 byteMembawa input
p
(pola) dans
(string) dalam sintaks currying(p)(s)
. Pengembalian0
/1
.Diformat dan dikomentari
Uji kasus
sumber
Mathematica 18 karakter (tidak termasuk string & pola)
Contoh:
True
True
sumber