Setelah menghabiskan waktu di situs ini saya datang untuk menikmati hal-hal sesingkat mungkin. Itu mungkin alasan mengapa saya baru-baru ini agak tersinggung oleh string yang berisi karakter yang sama lebih dari sekali. Tugas Anda adalah menulis fungsi atau program yang mengembunkan string yang diberikan sesuai dengan aturan berikut:
Mulailah dengan 0-kondensasi , yaitu mencari pasangan pertama (paling kiri) dari karakter yang sama dengan 0 karakter lain di antara mereka. Jika pasangan seperti itu ditemukan, hapus salah satu dari dua karakter dan nyalakan kembali algoritma dengan melakukan kondensasi 0 lainnya . Jika tidak ada pasangan yang ditemukan, lanjutkan ke langkah berikutnya. Contoh:
programming
-C0->programing
aabbcc
-C0->abbcc
test
-C0->test
Kemudian lakukan kondensasi 1 , yaitu mencari pasangan pertama dari karakter yang sama dengan 1 karakter lainnya di antara mereka. Jika pasangan semacam itu ditemukan, hapus salah satu dari mereka dan semua karakter di antara mereka dan mulai kembali dengan 0-kondensasi . Jika tidak ada pasangan yang ditemukan, lanjutkan ke langkah berikutnya. Contoh:
abacac
-C1->acac
java
-C1->ja
Lanjutkan dengan 2-kondensasi dan seterusnya hingga n-kondensasi dengan n menjadi panjang string asli, setiap kali restart setelah kondensasi menghapus beberapa huruf. Contoh:
programing
-C2->praming
abcdafg
-C3->afg
String yang dihasilkan disebut kental dan berisi setiap karakter paling banyak satu kali.
Memasukkan:
String huruf kecil dari ascii-karakter yang dapat dicetak.
Keluaran:
The kental tali sesuai dengan aturan di atas.
Contoh:
examples -> es
programming -> praming
puzzles -> puzles
codegolf -> colf
andromeda -> a
abcbaccbabcb -> acb
if(x==1):x++ -> if(x+
fnabnfun -> fun
abcdefae -> abcde
Contoh terperinci untuk memperjelas cara kerja algoritma:
fnabnfun -C0-> fnabnfun -C1-> fnabnfun -C2-> fnfun -C0-> fnfun -C1-> fun -C0-> fun
-C1-> fun -C2-> ... -C8-> fun
abcbaccbabcb -C0-> abcbacbabcb -C0-> abcbacbabcb -C1-> abacbabcb -C0-> abacbabcb
-C1-> acbabcb -C0-> acbabcb -C1-> acbcb -C0-> acbcb -C1-> acb -C0-> acb
-C1-> ... -C12-> acb
Pendekatan Anda tidak harus mengimplementasikan algoritma dari atas selama solusi Anda dan algoritma mengembalikan output yang sama untuk semua input yang diizinkan. Ini adalah tantangan kode-golf .
Terima kasih kepada @Linus untuk komentar kotak pasir yang bermanfaat!
Jawaban:
JavaScript (ES6), 74 byte
sumber
Perl,
38313029 byteIni harus meninggalkan bahasa non-golf jauh di belakang ...
-1 untuk
$-[0]
terima kasih kepada Riley-1 untuk
@{-}
terima kasih kepada DadaTermasuk +1 untuk
-p
Berikan masukan pada STDIN
condense.pl
:Versi 27 byte ini seharusnya berfungsi tetapi tidak karena perl tidak melakukan interpolasi
@-
dalam regex (lihat /programming/39521060/why-are-etc-not-interpolated-in-strings )sumber
@{\@-}
kerjanya? Saya pikir@-
memegang indeks setiap pertandingan, jadi bagaimana cara "menghitung" pada setiap iterasi. Juga, jika Anda mencetak@{\@-}
sebelum dan setelah setiap penggantian hanya mencetak 1 atau 2././g
Progres dengan 1 dalam string setiap kali, kecuali ketika string berubah, maka itu reset ke 0. Jika Anda mencetak@-
setelah/./g
tetapi sebelums///
Anda akan melihatnya naik (gunakan tes di mana string yang tersisa cukup besar)$-[0]
memberi angka yang saya harapkan. Apakah@{\@-}
bertindak seperti$-[0]
karena konteks regex tetapi tidak saat mencetak karena alasan tertentu?$-[0]
byte lebih pendek daripada@{\@-}
jika mereka sama."@{\@-}"
tidak sama dengan@{\@-}
(tanpa"
)."@{\@-}"
sama dengan"@-"
. Dan ini juga harus benar untuk penggantian regex tetapi tidak. Secara simultan$-[0]
harus bekerja tetapi tidak. PS: Anda mungkin entah bagaimana memiliki konteks skalar yang diterapkan@-
ketika Anda mencetak, jadi Anda selalu mendapat 1 atau 2CJam , 35 byte
Cobalah online!
Anda dapat melihat masing-masing kondensasi dengan memasukkan
ed
sumber
Python 2,
117104101 byteSecara rekursif melakukan penggantian yang diperlukan. Saya membangun regex secara dinamis.
Cobalah online
sumber
return i>len(t) and t or s!=t and f(t) or f(t,i+1)
jaring -4 bytereturn t if i>len(t)else s!=t and f(t)or f(t,i+1))
e=s==t;return i>len(t)and t or f(t,i*e+e)
dan kemudian Anda dapat menghapusi=0
definisi fungsi, tetapi Anda harus memanggil dengan 0 mulai.Perl
5352Termasuk +1 untuk -p
Cobalah di ideone .
sumber
Mathematica, 101 byte
Harus ada cara untuk membuat ini lebih pendek ...
sumber
PHP, 90 Bytes
atau 92 Bytes
sumber
+$i
bukannya$i+=0
(-2). 2)for
lingkaran bukannyawhile
dapat menyimpan dua byte dan memungkinkan untuk menghapus keriting (-4). 3)$i=++$i*!$c
bukannya$i=$c?0:$i+1
(-1). 4)\\2
tidak diperlukan, hapus tanda kurung (-2). 5) Anda dapat membiarkan batas9
alih-alih1
untuk kecepatan (+0)+$i
tidak berfungsi dalam setiap kasus. Cobahammer
. PHP tidak mengeluh tentang kawat gigi kosong di regex; tapi itu tidak sesuai dengan yang diinginkan. Ngomong-ngomong: Saya menghitung 91, bukan 90. Tapi coba yang baru 1)for($s=$argv[$c=1];$s[$i=++$i*!$c];)
$i+=0
dan akan mencoba proposal Anda nanti. Apa yang dimaksud dengan palu?puzzle
atau sesuatu yang lain seperti(.)//1
tapi tidak apa-apa dengan proposal Anda atau$i´=0
Ruby,
756457 byte(56 byte
p
opsi kode + baris perintah.)Menggunakan interpolasi string di dalam regex untuk mengontrol panjang kecocokan yang diganti.
Uji:
sumber
Haskell ,
9788 bytesCobalah online!
Bersion lama 97 byte:
Cobalah di ideone .
Penjelasan:
The
(!)
melakukan fungsi satu n-kondensasi ketika diberi string sekali utuh dan sekali dengan n karakter pertama dihapus, misalnyaabcdbe
, dancdbe
untuk 2-kondensasi, oleh rekursif membandingkan dua karakter utama.sumber