UPDATE : Pengajuan Pyth isaacg adalah pemenang!
Banyak dari Anda pasti pernah mendengar bahwa ada versi yang lebih dingin dari JavaScript di kota (baca ES6) yang memiliki metode String.prototype.repeat
sehingga Anda dapat melakukan
"Hello, World!".repeat(3)
dan dapatkan
"Hello, World!Hello, World!Hello, World!"
sebagai output.
Tugas Anda adalah menulis suatu fungsi atau program dalam bahasa pilihan Anda yang mendeteksi jika suatu string telah mengalami transformasi semacam itu.
yaitu string input dapat direpresentasikan sebagai n
pengulangan kali yang tepat dari string yang lebih kecil. Output (sebagai pernyataan pengembalian fungsi atau STDOUT) harus benar jika string dapat atau palsu jika string tidak dapat direpresentasikan sebagai pengulangan string yang lebih kecil.
Beberapa input sampel:
"asdfasdfasdf" // true
"asdfasdfa" // false
"ĴĴĴĴĴĴĴĴĴ" // true
"ĴĴĴ123ĴĴĴ123" // true
"abcdefgh" // false
Perhatikan bahwa input terakhir salah, sehingga n
harus lebih besar dari1
Aturan lengkap
- Tulis fungsi / program dalam bahasa apa saja untuk memasukkan (melalui argumen fungsi / argumen baris perintah / STDIN) sebuah string
- Kembali / Cetak nilai kebenaran jika string yang diberikan dibentuk melalui pengulangan yang tepat dari string yang lebih kecil, ulangi setidaknya dua kali.
- Ukuran maksimum dari string input idealnya adalah Infinity
- String dapat memiliki semua karakter ASCII yang mungkin
- Ini adalah kode-golf sehingga kode terkecil dalam karakter menang.
Jawaban:
Pyth , 9
Atau
Ini adalah terjemahan dekat dari jawaban python @ xnor, kecuali bahwa mereka mengambil input dari STDIN dan mencetaknya. Yang pertama setara dengan:
0 untuk False, 1 untuk True.
Baris kedua setara dengan:
Salah untuk Salah, Benar untuk Benar.
Kompiler resmi Pyth memiliki bug yang terkait dengan yang kedua, yang baru saja saya tambal, jadi yang pertama adalah pengiriman resmi saya.
sumber
x
terlalu lama ...Python (24)
Memeriksa apakah string adalah substring dari dirinya sendiri digabung dua kali, menghilangkan karakter pertama dan terakhir untuk menghindari kecocokan sepele. Jika ya, itu harus permutasi siklik nontrivial itu sendiri, dan dengan demikian jumlah segmen berulang.
sumber
..+);(;\?)
abcabc
.s+s
mengubahnya menjadiabcabcabcabc
. yang[1:-1]
daging dari kedua ujung untuk menghasilkanbcabcabcabcab
. dan kemudians in ...
mencoba mencariabcabc
sebagai substring dari itu. Substring ini tidak dapat ditemukan di salah satu dari setengah yang asli, karena keduanya telah dipersingkat, sehingga harus merentang kedua bagian. Secara khusus, ia harus memiliki ujungnya sendiri sebelum mulai, yang menyiratkan bahwa ia harus terdiri dari substring identik (berulang).ab
menjadiabab
menjadiba
, sehingga mengembalikan false, sementaraaa
menjadiaaaa
menjadiaa
, yang mengembalikan benar.qweqweqwe
inweqweqweqweqweqw
isTrue
.Regex (aroma ECMAScript), 11 byte
Kedengarannya seperti pekerjaan untuk regex!
Uji di sini.
Saya telah memilih ECMAScript, karena itu satu-satunya rasa (saya tahu) yang
[^]
cocok dengan karakter apa pun. Di semua yang lain, saya perlu bendera untuk mengubah perilaku.
atau menggunakan[\s\S]
yang tiga karakter lebih lama.Tergantung pada bagaimana kita menghitung bendera, yang bisa saja menjadi byte lebih pendek. Misalnya jika kita menghitung pola + flag (mis. Mengabaikan pembatas), PCRE / Perl yang setara akan menjadi
Yaitu 10 byte, mengabaikan pembatas.
Uji di sini.
Ini hanya cocok dengan string yang terdiri dari setidaknya dua pengulangan beberapa substring.
Berikut ini adalah fungsi ES6 26-byte penuh, tetapi saya berpendapat bahwa pengiriman ekspresi reguler umumnya valid:
sumber
^(.+)\1+$
bekerja untuk saya, yaitu 9 byte. Itu tidak bekerja untukmu?asd\nasd\nasd\n
. Ini berfungsi\
ketika saya menulis\n
secara manualCJam, 9
Mirip dengan ide xnor.
sumber
)
? Saya pikir masuk akal untuk memiliki -1 mean FALSE dan> = 0 mean TRUEg
dan?
.#
operator find? Tentunya hasil dari itu juga "benar" dari perspektif keberhasilan vs kegagalan?APL, 11
Penjelasan
⍞
mengambil input string dari layar yangx←
ditugaskan ke variabelx
,⍨
menggabungkan string denganx⍷
pencarian sendirix
dalam string yang dihasilkan. Mengembalikan array yang terdiri dari 1 di posisi awal pertandingan dan 0 di tempat lain.+/
menjumlahkan array2<
memeriksa apakah jumlahnya lebih besar dari 2 (karena akan ada 2 kecocokan sepele)sumber
CJam, 10 byte
Saya menangkap bug CJam. Jawaban pertama saya, jadi mungkin bisa bermain golf lagi:
Output -1 untuk FALSE dan angka> = 0 untuk TRUE
sumber
GolfScript, 10 byte
Namun implementasi lain dari ide pintar xnor.
sumber
)
; ketika tidak ada yang cocok, itu akan dicetak-1
. Jika Anda akan memposting itu sebagai jawaban, saya dengan senang hati akan menghapus milik saya.)
tepat sebelum Anda memposting jawaban Anda (saya mengedit komentar)q__+)@+#)
. Tidak berfungsi di GolfScript.Python -
5957sumber
Bash murni, 30 byte
Port sederhana dari jawaban pintar xnor :
Kode keluar adalah 0 untuk BENAR dan 1 untuk SALAH:
Catatan
=~
dalam[[ ... ]]
adalah operator regex di bash . Namun "Bagian mana pun dari pola dapat dikutip untuk memaksa agar dicocokkan sebagai string" . Jadi seperti yang sering terjadi dengan bash, mendapatkan kutipan yang tepat sangat penting - di sini kami hanya ingin memeriksa pengiriman string dan bukan pertandingan regex.sumber
TI-BASIC - 32
Saya pikir saya akan mencoba bahasa tokenized. Jalankan dengan string di Ans, mengembalikan 0 jika false dan panjang string yang diulang jika benar.
Luar biasa bagaimana ini hanya satu-liner.
sumber
ECMAScript 6 (189)
Tentunya ini satu-satunya solusi yang valid? Misalnya, kata (string)
nana
tidak harus dibuat dari"na".repeat(2)
sumber
"nana"
tidak, tetapi pertanyaannya bukan pengujian apakah.repeat
digunakan atau tidak. Alih-alih, apakah string itu berulang atau tidakECMAScript 6 (34
36)Jawaban ES6 lain, tetapi tanpa menggunakan
repeat
dan menggunakan trik xnor :Harus dijalankan di konsol peramban berkemampuan ES6 seperti Firefox.
sumber
C 85
Ternyata cukup lama tetapi fungsi eksternal selalu seperti itu. Terlintas dalam pikiran saya bahwa saya dapat menulis ulang setiap fungsi string yang menggantinya dengan loop atau yang berulang. Tetapi dalam pengalaman saya itu akan berubah lebih lama dan terus terang saya tidak ingin mencobanya.
Setelah beberapa penelitian saya melihat solusi pada kinerja tinggi tetapi tidak sepintar (dan pendek) sebagai salah satu xnor. hanya untuk menjadi asli ... saya menulis ulang ide yang sama di c.
penjelasan:
sumber
ECMAScript 6 (59
626773)Bukan pemenang, tetapi sepertinya setidaknya harus ada satu jawaban di ES6 untuk pertanyaan ini yang benar-benar menggunakan
repeat
fungsi:Harus dijalankan di konsol peramban berkemampuan ES6 seperti Firefox.
Memang banyak iterasi yang tidak perlu, tapi mengapa membuatnya lebih lama hanya untuk menghindari itu, kan?
sumber
[...i]
bukannyai.split('')
0..N
. Terima kasih!.slice(0,j)
adalah satu karakter lebih pendek dari.substr(0,j)
. Lebih lanjut, konversi ke bilangan bulat tampaknya tidak perlu|0
dapat dihapus (menggunakan|0
sebenarnya mengurangi kegunaan metode karena akan gagal untuk pengulangan yang melebihi 2 ^ 31).Jelly , 3 byte
Cobalah online!
Sama seperti jawaban ini (mungkin tantangan selanjutnya adalah generalisasi dari yang ini?).
sumber
Java 8, 28 byte
Cobalah online.
Penjelasan:
Cek apakah input-String cocok dengan regex, di mana
String#matches
secara implisit ditambahkan^...$
agar cocok dengan seluruh String.Penjelasan dari regex itu sendiri:
Jadi pada dasarnya memeriksa apakah substring diulang dua atau lebih kali (mendukung baris baru).
sumber