Monday Mini-Golf: Serangkaian tantangan kode-golf pendek , diposting (mudah-mudahan!) Setiap hari Senin.
Kisah nyata 1 : Suatu hari, saya bermain-main di tablet ketika saya memiliki ide untuk mengunjungi halaman yang biasanya saya gunakan di PC untuk menguji JavaScript. Setelah halaman dimuat, saya memasuki program sederhana ini:
alert("Hello!")
Saya kemudian melanjutkan untuk menekan tombol Execute, dan terkejut ketika diberitahu bahwa kode yang saya masukkan tidak valid. Saya melihat kotak teks dan melihat ini:
alllelelerlerlertlert("Heeelelellellelloello!")
Apa ??? Bukan itu yang saya masukkan! Jadi apa yang terjadi di sini? Untuk mengetahuinya, saya memasukkan dua baris sederhana:
abcdefg
0123456
Ini ternyata sebagai:
abbbcbcbcdbcdbcdebcdebcdefbcdefbcdefgbcdefg
0112123123412345123456
Sampai sekarang, saya masih belum tahu tentang apa yang terjadi pada surat-surat, tetapi angkanya tampak lebih sederhana, jadi saya melihat lebih dekat. Ternyata, halaman web hanya memasukkan karakter pertama, kemudian mengulangi semua yang lain dalam string setiap kali yang baru ditekan:
0112123123412345123456
0
1
12
123
1234
12345
123456
Tetapi bagaimana dengan bagian surat? Setelah merenung sebentar, saya menyadari bahwa itu sama saja, tetapi alih-alih mengulangi setiap subbagian sekali, ia mengulanginya dua kali :
abbbcbcbcdbcdbcdebcdebcdefbcdefbcdefgbcdefg
a
bb
bcbc
bcdbcd
bcdebcde
bcdefbcdef
bcdefgbcdefg
Kombinasi keduanya bekerja dengan kombinasi teknik-teknik ini:
abc123z
abbbcbcbc1bc12bc123bc123zbc123z
a
bb
bcbc
bc1
bc12
bc123
bc123zbc123z
Kesalahan apa pun yang menyebabkan ini tampaknya diatur ulang pada tanda baca dan spasi, demikian abc def
jadinya abbbcbc deeefef
.
Pada titik ini, saya begitu asyik mencari tahu dan mengubahnya menjadi tantangan yang menarik sehingga saya lupa mengapa saya berada di sana sejak awal. (Namun saya tahu bagaimana cara mengetik secara normal: menekan spasi-backspace setelah setiap karakter. Cukup membosankan, tetapi Anda harus melakukan apa yang harus Anda lakukan.)
Tantangan
Tujuan dari tantangan ini adalah untuk menulis program atau fungsi yang membutuhkan teks yang akan diproses, membuat perubahan yang tercantum di atas, dan mengeluarkan / mengembalikan hasilnya.
Detail
- Input hanya akan berisi ASCII yang dapat dicetak, dan tidak ada tab atau baris baru.
Kasus uji
Input: (satu per baris)
Mess up text
This is some longer text.
CAPS LOCK && "Punc-tua"+'tion'
under_score_style
CaPs wItHIn loWERs
1337 numb3r5
abcdefghij 0123456789
Code-golf is the best!
Output:
Meeesesessess upp teeexexextext
Thhhihihishis iss sooomomomeome looononongongongeongeongeronger teeexexextext.
CAAAPAPAPSAPS LOOOCOCOCKOCK && "Puuunununcunc-tuuuaua"+'tiiioioionion'
unnndndndendendernder_scccococorcorcorecore_stttytytyltyltyletyle
CaaaPaPaPsaPs wIIItItItHItHItHIItHIItHInItHIn loooWoWoWEoWEoWERoWERoWERsoWERs
1333337 nuuumumumbumbumb3umb3rumb3rumb3r5
abbbcbcbcdbcdbcdebcdebcdefbcdefbcdefgbcdefgbcdefghbcdefghbcdefghibcdefghibcdefghijbcdefghij 0112123123412345123456123456712345678123456789
Cooodododeode-gooolololfolf iss thhhehe beeesesestest!
Mencetak gol
Ini adalah kode-golf , jadi kode terpendek yang valid dalam byte menang. Tiebreaker pergi ke pengiriman yang mencapai jumlah byte terakhirnya terlebih dahulu. Pemenang akan dipilih Senin depan, 2 November. Semoga beruntung!
Edit: Dan pemenangnya adalah ... @ MartinBüttner menggunakan Retina untuk luar biasa 43-byte solusi!
1 Ya, cerita ini sepenuhnya benar, dan jika Anda membutuhkan klarifikasi lebih lanjut, lihat catatan kaki 1.
' '.join(x[0]+''.join(2*x[1:i]for i in range(1,len(x)+1)) for x in raw_input().split())
Jawaban:
Retina , 43 byte
Jalankan kode dari satu file dengan
-s
bendera. Karena ini hanya penggantian satu regex, Anda dapat mengujinya di sini (klik tab Konteks untuk melihat hasilnya).Penjelasan
Ini cocok dengan angka dan huruf apa pun yang bukan yang pertama kali dijalankan. Meskipun
.
dapat cocok dengan karakter non-linefeed, tampilan ini memastikan kondisi lain:Ini cocok mundur dari posisi setelah
.
. Pertama itu cocok satu atau lebih karakter alfanumerik dan menangkap mereka ke dalam kelompok1
dengan([^_\W]+)
. Ini segera memastikan bahwa.
sesuai dengan karakter alfanumerik itu sendiri. Kemudian tambahan[^_\W]
memastikan bahwa ada satu lagi karakter alfanumerik dalam menjalankan saat ini, yang kami tidak sertakan pertandingan. Sekarang grup1
adalah apa yang ingin kita ganti dengan korek api jika itu digit - jika itu adalah huruf yang ingin kita ganti korek dengan dua kali string ini. Di situlah tampilan kedua muncul:Yang ini opsional, jadi jika gagal itu tidak akan mempengaruhi pertandingan sama sekali. Pertama-tama memastikan bahwa
.
itu bukan angka melalui(?<=\D)
- jadi tampilan ini hanya relevan ketika kita mencocokkan huruf. Dalam hal ini, kami mencocokkan grup\1
sekali lagi (ini selalu cocok, karena kami telah menangkap grup dari posisi yang sama), tetapi menangkapnya ke dalam grup2
.Karenanya, kami cukup mengganti regex dengan konten dari kedua grup (
$1$2
). Jika kecocokannya digit,$2
masih akan kosong dan kami hanya menulis awalan satu kali. Jika itu surat,$2
sama dengan$1
dan kami menulis kembali dua kali.sumber
JavaScript (ES6) 82
Menggunakan optimasi regexp yang disarankan oleh Mwr247
Tes menjalankan cuplikan di bawah ini di peramban terbaru apa pun
sumber
JavaScript (ES6),
928887Saya tidak tahu bagaimana cara bermain golf ini ...
Terima kasih Mwir247 untuk golf turun regex dan ETHproduk untuk golf satu byte dalam fungsi pengurangan .
sumber
/[^_\W]+/g
(menyimpan 3 karakter).reduce
fungsi:(a,e)=>a+=(y+=e,++e?y:y+y)
(1 byte lebih pendek)Haskell,
215200 byteIni berantakan.
Bersenang-senang membaca semua keanehan aneh, saya tidak pernah berpikir saya akan menggunakan
id
ini banyak.Sayang sekali hal-hal yang sudah melakukan setengah pekerjaan di sini perlu diimpor (
isDigit
,isAlpha
,inits
).sumber
lang-hs
tidaklang-haskell
. Dengan menentukanlang-haskell
itu mungkin berakhir menggunakan stabilo default.Gema, 57 karakter
Contoh dijalankan:
sumber
Haskell,
183181 bytePemakaian:
Tidak tahu apakah itu pada dasarnya berbeda dengan jawaban Leif Willerts. Tapi ini algoritma.
Saya entah bagaimana menyimpan kurung redudant.
sumber
T-SQL, 357 byte
mis:
exec x(@s='1337 numb3r5')
pengembalian1333337 nuuumumumbumbumb3umb3rumb3rumb3r5
sumber
Python 2, 131 Bytes
Putar melalui karakter, dan simpan / ulangi jika diperlukan.
sumber
Pip, 41 byte
Mengambil teks sebagai argumen baris perintah. Kami menggunakan penggantian regex untuk mengganti semua alfanumerik berjalan (
[^_\W]+
) dengan fungsi panggilan balik. Fungsi ini memetakan fungsi lain untuk setiap karakter kata, menghasilkan karakter berjalan semakin besar (dengan variabel globaly
melacak indeks) dan mengulanginya X2 jika karakter bukan angka. (Logika yang digunakan+
untuk mengonversi angka dan kemudianQ
untuk memeriksa apakah ini string-sama dengan karakter asli.) Namun, proses ini menghilangkan karakter pertama, jadi kita harus menambahkannya sesudahnya (a@0.
).sumber
Python 3 , 86 byte
Cobalah online!
sumber