Kadang-kadang terjadi bahwa ketika mengetik kalimat, saya terganggu dan saya akhirnya mengetik pasangan kata yang sama dua kali pasangan kata dua kali berturut-turut.
Untuk memastikan make yakin orang lain tidak terganggu oleh ini, tugas Anda adalah untuk menulis sebuah program yang menyelesaikan masalah ini!
Tugas
Diberikan string input (jika itu penting untuk bahasa Anda, Anda dapat mengasumsikan input ASCII saja yang tidak mengandung linefeeds.) str
, Yang mengandung suatu substring di suatu tempat di tengahnya yang terjadi dua kali berturut-turut segera, kembalikan string dengan satu contoh dari ini substring dihapus.
Dalam hal beberapa kemungkinan, kembalikan jawaban sesingkat mungkin (yaitu, pilih substring berulang berurutan dan hapus yang itu).
Dalam hal beberapa substring berulang yang sama-sama panjang, hapus substring pertama (yaitu, yang pertama ditemukan saat membaca string dari depan ke belakang).
Anda dapat mengasumsikan bahwa inputnya benar (yaitu selalu berisi substring berulang berurutan), yang dapat membantu menurunkannya.
Contohnya
- Input:
hello hello world
-> Output:hello world
. - Input:
foofoo
-> Output:foo
. (Jadi: Ya, string hanya terdiri dari bagian berulang dua kali). - Input:
aaaaa
-> Output:,aaa
karena substring berulang berulang terpanjang ada di siniaa
. - Input:
Slartibartfast
-> Ini bukan input yang valid, karena tidak mengandung substring berulang berturut-turut, sehingga Anda tidak perlu menangani kasus ini. - Input:
the few the bar
-> Ini adalah input lain yang tidak valid, karena bagian berulang harus segera mengikuti bagian asli. Dalam hal ini,the
danthe
dipisahkan oleh sesuatu yang lain di antara keduanya, maka input ini tidak valid. - Input:
ababcbc
-> Output:abcbc
. Dua substring berulang berulang terpanjang yang mungkin adalahab
danbc
. Sepertiab
yang ditemukan sebelumnya dalam string, ini adalah jawaban yang benar. - Input:
Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo
. Output:Buffalo buffalo buffalo buffalo Buffalo buffalo
. (Penggantian yang dilakukan harus peka terhadap huruf besar-kecil). - Input:
Sometimes it happens that while typing a sentence, I am distracted and I end up typing the same couple of words twice couple of words twice in succession.
-> Output:Sometimes it happens that while typing a sentence, I am distracted and I end up typing the same couple of words twice in succession.
. Hanya substring berulang berulang terpanjang yang dihapus.
Kode Anda harus sesingkat mungkin, karena ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang. Semoga berhasil!
Sometimes it happens that while typing a sentence, I am distracted and I end up typing the same couple of words twice couple of words twice in succession.
sebagai input, hasilnya harusSometimes it happens that while typing a sentence, I am distracted and I end up typing the same couple of words twice in succession.
. Hanya duplikasi yang paling lama ditemukan yang dihapus.p
dihappens
Jawaban:
Perl 6 , 40 byte
Cobalah
sumber
Retina ,
3533 byteHitungan byte mengasumsikan penyandian ISO 8859-1.
Cobalah online!
Penjelasan
Karena mesin regex mencari kecocokan dari kiri ke kanan, bukan hal yang sepele untuk menemukan kecocokan terpanjang terlepas dari posisi. Itu bisa dilakukan dengan grup penyeimbang .NET, tetapi hasilnya agak lama tidak menyenangkan:
Jadi saya pikir saya akan mencoba menghindarinya dengan memanfaatkan beberapa fitur Retina lainnya.
Kami mulai dengan menerapkan dasarnya semua kemungkinan penggantian, satu pada setiap baris. Untuk melakukan ini, kami mencocokkan posisi di depan pertandingan (bukan pertandingan itu sendiri), untuk memungkinkan pertandingan yang tumpang tindih. Ini dilakukan dengan menempatkan regex yang sebenarnya ke dalam lookahead. Penampilan itu kemudian menangkap sisanya kecuali duplikat yang ingin kami hapus di grup 2. Kami menulis kembali grup 2 (menghapus duplikat), sebuah linefeed, dan kemudian seluruh input hingga pertandingan, yang pada dasarnya memberi kami garis baru untuk diganti
Pada akhirnya kami akan memiliki satu baris untuk setiap pertandingan, dengan duplikat yang sesuai dihapus. Pada akhirnya juga akan ada input penuh lagi tanpa ada penggantian.
Sekarang kami memiliki semua pergantian yang mungkin, kami menginginkan hasil terpendek (yang sesuai dengan pengulangan yang paling lama dihapus).
Jadi kita pertama-tama mengurutkan garis berdasarkan panjangnya.
Dan kemudian kita hanya menjaga baris pertama.
sumber
Jelly ,
2219 byte-2 byte terima kasih kepada Dennis (hindari pembalikan argumen, hapus kenaikan berlebihan yang sedikit)
Cobalah online!
Program lengkap (bug telah ditemukan bersama
ÐṀ
tidak bertindak dengan arity yang benar di atas angka dua, yang akan segera diperbaiki; meskipun saya tidak yakin itu bisa membuat kode lebih pendek di sini).Bagaimana?
Temukan irisan terpanjang pertama dari input sedemikian sehingga pengulangan ada di input dan menghapusnya dari input.
sumber
JavaScript (ES6),
8174 byteSunting: Disimpan 7 byte dengan mencuri
m[r.length]
trik @ Arnauld .sumber
PowerShell , 87 byte
Cobalah online!(semua kasus uji)
Penjelasan
Mulai dari dalam pada dasarnya, kita jalankan
Matches
dengan(.+)\1
regex, untuk mengembalikan semua objek yang cocok untuk string yang ditentukan. Regex cocok dengan urutan karakter apa pun yang diikuti dengan sendirinya.Kemudian objek pertandingan yang dihasilkan disalurkan ke
sort
untuk diurutkan berdasarkanLength
propertinya (disingkat menjadi wildcard). Ini menghasilkan array pertandingan yang diurutkan berdasarkan panjang, naik, jadi indeks dengan[-1]
untuk mendapatkan elemen terakhir (terpanjang). Nilai kecocokan itu adalah kecocokan, bukan grup, jadi itu termasuk pengulangan, jadi kami mengambil objek Grup (|% Gr*
) dan kemudian nilai itu (|% V*
) untuk mendapatkan string berulang yang terbesar. Masalahnya adalah objek grup sebenarnya array karena grup 0 selalu cocok, tetapi saya ingin grup yang sebenarnya (1), jadi nilai yang dihasilkan adalah nilai s , maka pengindeksan untuk mendapatkan elemen kedua[1]
. Nilai ini dicor ke objek regex itu sendiri dan kemudianReplace
Metode dipanggil terhadap string asli, diganti dengan tidak ada, dan hanya pertandingan pertama yang diganti (|% Re* $s '' 1
).sumber
Haskell , 101 byte
Fungsi utamanya adalah
f
, dibutuhkan dan mengembalikan aString
.Cobalah online!
Ketika saya mulai ini, saya diimpor
Data.List
dan digunakanmaximum
,tails
,inits
danisPrefixOf
. Entah bagaimana itu berubah menjadi ini. Tapi saya hanya berhasil memotong 11 byte ...Catatan
splitAt
/a
membagi string pada indeks yang diberikan.s
adalah string input.i
adalah daftar angka[0 .. length s - 1]
,-1
adalah untuk bekerja di sekitar yangsplitAt
terbagi pada akhirnya jika diberi indeks terlalu besar.n
adalahlength s
minus tujuan panjang saat ini untuk bagian diulang, itu memilih jalan itu sehingga kita tidak perlu menggunakan dua daftar jumlah dan / atau verbose menurun daftar sintaks.p
,,r
dant
merupakan pemecahan tiga jalurs
, denganr
bagian yang diulang yang dimaksud. Difmap
sana menggunakan(,) String
Functor
untuk menghindari variabel untuk pemisahan menengah.!!0
memilih elemen pertama dari daftar kecocokan.sumber
Jelly ,
2321 byteTerima kasih kepada @JonathanAllan untuk
Ṭœp
idenya yang menyelamatkan 2 byte.Cobalah online!
sumber
Mathematica,
636059 byte4 byte disimpan karena Martin Ender .
Fungsi anonim. Mengambil string sebagai input dan mengembalikan string sebagai output.
sumber
~SortBy~StringLength
mengurutkan string secara alfabetis jika panjangnya sama ...SortBy
dan membungkusStringLength
daftar untuk mendapatkan jenis yang stabil.JavaScript (ES6), 70 byte
Uji kasus
Tampilkan cuplikan kode
sumber
aaaabaaab
, tetapi penggunaan yang bagusreduce
.Ini harus menjadi komentar, tetapi saya tidak memiliki reputasi yang cukup untuk berkomentar. Saya hanya ingin memberi tahu @Neil bahwa kodenya dapat dikurangi menjadi 77 byte. Anda tidak perlu menggunakan pernyataan maju di regex. Berikut ini versi yang direduksi:
sumber
aabab
adalah contoh terpendek di mana saran Anda gagal.C #, 169 byte
Penjelasan
Ini adalah pendekatan brute-force: coba setiap substring yang mungkin sampai kami menemukan substring berulang yang terpanjang. Tidak diragukan lagi Regex lebih efisien, tetapi berurusan dengan Regex di C # cenderung sangat bertele-tele.
sumber
PHP,
8482 byteCatatan: menggunakan pengkodean IBM-850.
Jalankan seperti ini:
Penjelasan
Tweaks
sumber