Monday Mini-Golf # 6: Meeesesessess upp teeexexextext


48

Monday Mini-Golf: Serangkaian tantangan 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 defjadinya 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 , 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.


1
Aturan tanda baca itu ...' '.join(x[0]+''.join(2*x[1:i]for i in range(1,len(x)+1)) for x in raw_input().split())
TheDoctor

batuk Gunakan Chrome DevTools batuk
kirbyfan64sos

@TheDoctor Lihat riwayat edit jawaban saya: P
Beta Decay

1
@BetaDecay, para pemikir hebat berpikir sama;)
TheDoctor

inb4 seseorang membuat bahasa di mana Anda harus mengetik seperti ini.
DJgamer98

Jawaban:


13

Retina , 43 byte

.(?<=[^_\W]([^_\W]+))(?<=(\1)(?<=\D))?
$1$2

Jalankan kode dari satu file dengan -sbendera. 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:

(?<=[^_\W]([^_\W]+))

Ini cocok mundur dari posisi setelah .. Pertama itu cocok satu atau lebih karakter alfanumerik dan menangkap mereka ke dalam kelompok 1dengan ([^_\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 grup 1adalah 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:

(?<=(\1)(?<=\D))?

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 \1sekali lagi (ini selalu cocok, karena kami telah menangkap grup dari posisi yang sama), tetapi menangkapnya ke dalam grup 2.

Karenanya, kami cukup mengganti regex dengan konten dari kedua grup ( $1$2). Jika kecocokannya digit, $2masih akan kosong dan kami hanya menulis awalan satu kali. Jika itu surat, $2sama dengan $1dan kami menulis kembali dua kali.


8

JavaScript (ES6) 82

Menggunakan optimasi regexp yang disarankan oleh Mwr247

s=>s.replace(/([\W_])|./g,(x,y)=>y?(f=0,x):f?(p+=x,p+(-x-1?z:p)):(p=z,f=x),f=z='')

Tes menjalankan cuplikan di bawah ini di peramban terbaru apa pun

F=s=>s.replace(/([\W_])|./g,(x,y)=>y?(f=0,x):f?(p+=x,p+(-x-1?z:p)):(p=z,f=x),f=z='')

// document.write(F(prompt('Insert string')))

// TEST
console.log=x=>O.innerHTML+=x+'\n'

function test()
{
  O.innerHTML=F(I.value)
}

;[
 ['Mess up text','Meeesesessess upp teeexexextext']
,['This is some longer text.',
  'Thhhihihishis iss sooomomomeome looononongongongeongeongeronger teeexexextext.']
,['CAPS LOCK && "Punc-tua"+\'tion\'',
  'CAAAPAPAPSAPS LOOOCOCOCKOCK && "Puuunununcunc-tuuuaua"+\'tiiioioionion\'']
,['CaPs wItHIn loWERs'
  ,'CaaaPaPaPsaPs wIIItItItHItHItHIItHIItHInItHIn loooWoWoWEoWEoWERoWERoWERsoWERs']
,['1337 numb3r5','1333337 nuuumumumbumbumb3umb3rumb3rumb3r5']
,['abcdefghij 0123456789'
 ,'abbbcbcbcdbcdbcdebcdebcdefbcdefbcdefgbcdefgbcdefghbcdefghbcdefghibcdefghibcdefghijbcdefghij 0112123123412345123456123456712345678123456789']
,['Code-golf is the best!'
  ,'Cooodododeode-gooolololfolf iss thhhehe beeesesestest!']
].forEach(t => (
  i=t[0],x=t[1],r=F(i),
  console.log('Test ' + (r==x?'OK':'Fail')+'\nInput:  '+i+'\nResult: '+r+'\nCheck:  '+x+'\n')
))
#I { width: 50% }
Your test<input id=I><button onclick="test()">-></button>
<pre id=O></pre>


Astaga! Itu jauh berbeda (dan lebih baik) daripada yang saya lakukan (mirip dengan pendekatan n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳). +1
ETHproduksi

7

JavaScript (ES6), 92 88 87

f=>f.replace(/[^_\W]+/g,m=>m[0]+[...m].slice(1).reduce((a,e)=>a+=(y+=e,++e?y:y+y),y=''))

Saya tidak tahu bagaimana cara bermain golf ini ...

Terima kasih Mwir247 untuk golf turun regex dan ETHproduk untuk golf satu byte dalam fungsi pengurangan .


Gunakan ini untuk regex Anda: /[^_\W]+/g(menyimpan 3 karakter)
Mwr247

Saya percaya ini akan berfungsi untuk .reducefungsi: (a,e)=>a+=(y+=e,++e?y:y+y)(1 byte lebih pendek)
ETHproduksi

5

Haskell, 215 200 byte

import Data.List
import Data.Char
c=concatMap
p c=[isDigit c,isAlpha c]
r(Just n)=c id.replicate(n+1)
r _=id
f(h:t)=h:(c(\s->r(findIndex id.p$last s)s).tail.inits)t
m=c f.groupBy(\a b->or$p a==or$p b)

Ini berantakan.

Bersenang-senang membaca semua keanehan aneh, saya tidak pernah berpikir saya akan menggunakan idini banyak.

Sayang sekali hal-hal yang sudah melakukan setengah pekerjaan di sini perlu diimpor ( isDigit, isAlpha, inits).


2
Ini lang-hstidak lang-haskell. Dengan menentukan lang-haskellitu mungkin berakhir menggunakan stabilo default.
Bakuriu

3

Gema, 57 karakter

\X?=?@set{s;}
<D1>=@append{s;$0}$s
<L1>=@append{s;$0}$s$s

Contoh dijalankan:

bash-4.3$ gema '\X?=?@set{s;};<D1>=@append{s;$0}$s;<L1>=@append{s;$0}$s$s' <<< '1337 numb3r5'
1333337 nuuumumumbumbumb3umb3rumb3rumb3r5

3

Haskell, 183 181 byte

import Data.Char
b(x:y)|h x=x:c[]y|2>1=x:b y
b[]=[]
h y=isDigit y||isAlpha y
c x l@(y:z)|h y=c(y:x)z|2>1=c x[]++b l
c x[]=reverse$g$x
g[]=[]
g a@(x:y)|isDigit x=a++g y|2>1=a++a++g y

Pemakaian:

b"Hello, world!"
>"Heeelelellellelloello, wooorororlorlorldorld!"

Tidak tahu apakah itu pada dasarnya berbeda dengan jawaban Leif Willerts. Tapi ini algoritma.

  1. Cari huruf yang valid (Letter atau Num)
  2. Jika surat, mulai mengumpulkan surat. Namun, disimpan secara terbalik, membuat string terbalik. Dan item pertama dihilangkan.
  3. Saat mengenai huruf yang tidak valid, lakukan transformasi pertanyaan dengan input terbalik. Transformasi pertanyaannya adalah reverse.g.reverse, tetapi karena sudah terbalik, maka kita hanya melakukan reverse.g

Saya entah bagaimana menyimpan kurung redudant.


0

T-SQL, 357 byte

create proc x(@s varchar(99),@z int=0,@i int=0,@y varchar(99)='',@x varchar(99)='',@w varchar(99)='') as

while LEN(@s)>0
begin
    select @z=patindex('%[^0-z]%',@s+' '),@i=1,@w+=LEFT(@s,1)
    while @i<@z-1
    begin
        select @y=SUBSTRING(@s,2,@i)
        ,@x+=@y            
        ,@i+=1
        if @y like'%[a-z]'set @x+=@y
    end
select @w+=@x+SUBSTRING(@s,@z,1)
        ,@x=''
        ,@s=REPLACE(@s,left(@s,@z),'')
end

select @w

mis: exec x(@s='1337 numb3r5') pengembalian1333337 nuuumumumbumbumb3umb3rumb3rumb3r5


0

Python 2, 131 Bytes

i=raw_input();s=r='';g=1
for c in i:
 s+=c
 if g:r+=c;g=0;s=''
 elif c.isalpha():r+=s*2
 elif '/'<c<':':r+=s
 else:g=1;r+=c
print r

Putar melalui karakter, dan simpan / ulangi jika diperlukan.


0

Pip, 41 byte

aR`[^_\W]+`{Y0a@0.Ya@{1,++y}X2-(_Q+_)MJa}

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 global ymelacak indeks) dan mengulanginya X2 jika karakter bukan angka. (Logika yang digunakan +untuk mengonversi angka dan kemudian Quntuk memeriksa apakah ini string-sama dengan karakter asli.) Namun, proses ini menghilangkan karakter pertama, jadi kita harus menambahkannya sesudahnya ( a@0.).


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.