Pazartesi Mini Golf # 6: Meeesessesse upp teeexexextext


48

Pazartesi Mini Golf: Her Pazartesi yayınlanan (umarım!) Bir dizi kısa mücadelesi.

Gerçek hikaye 1 : Geçen gün, bilgisayarımda JavaScript'i test etmek için normalde kullandığım sayfayı ziyaret etme fikrim varken tabletimde oyun oynuyordum . Sayfa yüklendikten sonra bu basit programa girdim:

alert("Hello!")

Daha sonra Çalıştır düğmesine basmaya başladım ve girdiğim kodun geçersiz olduğunu söylediğimde şaşırdım. Metin kutusuna bir kez daha baktım ve şunu gördüm:

alllelelerlerlertlert("Heeelelellellelloello!")

Wha ??? Girdiğim şey bu değildi! Peki burada ne oldu? Bunu anlamak için iki basit satır girdim:

abcdefg
0123456

Bu çıktı:

abbbcbcbcdbcdbcdebcdebcdefbcdefbcdefgbcdefg
0112123123412345123456

Şimdiye dek harflere ne olduğu hakkında hiçbir fikrim yoktu, ancak rakamlar daha basit görünüyordu, bu yüzden daha yakından baktım. Görünen o ki, web sayfası basitçe ilk karaktere giriyordu, daha sonra her yeni karaktere basıldığında dizedeki tüm kalanları tekrar ediyordu:

0112123123412345123456
0
 1
  12
    123
       1234
           12345
                123456

Peki ya harflerin bölümleri? Bir dakikalığına düşündükten sonra, bunun aynı olduğunu fark ettim, ancak her alt bölümü bir kez tekrarlamak yerine, iki kez tekrar ediyor :

abbbcbcbcdbcdbcdebcdebcdefbcdefbcdefgbcdefg
a
 bb
   bcbc
       bcdbcd
             bcdebcde
                     bcdefbcdef
                               bcdefgbcdefg

İki eserin bir kombinasyonu ile bu tekniklerin bir kombinasyonu:

abc123z
abbbcbcbc1bc12bc123bc123zbc123z
a
 bb
   bcbc
       bc1
          bc12
              bc123
                   bc123zbc123z

Ne olursa olsun aksaklık yüzden, bu noktalama ve boşluk sıfırlanır görünüyor neden abc defolur abbbcbc deeefef.

Bu noktadan sonra, onu bulmakta ve ilginç bir soruna dönüştürmekte çok zorlandım, ilk başta neden orada bulunduğumu unuttum. (Normal olarak nasıl yazılacağını çözdüm, ancak: her karakterden sonra boşluk bırakma tuşuna basmak. Oldukça sıkıcı, ama yapman gerekeni yapmalısın.)

Meydan okuma

İşin amacı, işlenecek metinde yer alan bir program veya işlev yazmak, yukarıda listelenen değişiklikleri yapar ve sonucu verir / verir.

ayrıntılar

  • Giriş yalnızca yazdırılabilir ASCII içerecek ve sekme veya yeni satır içermeyecek.

Test-vakalar

Girişler: (her satırda bir tane)

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!

Çıktılar:

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!

puanlama

Bu , bayt cinsinden geçerli en kısa koddur. Tiebreaker ilk önce son bayt sayısına ulaşan gönderime gidiyor. Kazanan gelecek pazartesi, 2 Kasım'da seçilecek. İyi şanslar!

Düzenleme: Ve kazanan ... MartinBüttner @ kullanarak Retina inanılmaz için 43 bayt çözümü!

1 Evet, bu hikaye tamamen doğru ve daha fazla açıklamaya ihtiyacınız varsa, dipnot 1'e bakınız.


1
Bu noktalama kuralı ...' '.join(x[0]+''.join(2*x[1:i]for i in range(1,len(x)+1)) for x in raw_input().split())
Doktor,

Öksürük Chrome kullanın DevTools öksürük
kirbyfan64sos

@TheDoctor Telesekreterimin düzenleme geçmişine bakın: P
Beta Decay

1
@BetaDecay harika beyinler aynı düşünüyorum;)
TheDoctor

inb4 birisi aslında böyle yazmanız gereken bir dil yapar.
DJgamer98

Yanıtlar:


13

Retina , 43 bayt

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

Kodu tek bir dosyadan -sbayrakla çalıştırın. Bu sadece tek bir regex ikamesi olduğundan, burada test edebilirsiniz (sonuçları görmek için Bağlam sekmesini tıklayın).

açıklama

Bu, koşuda ilk olmayan rakam ve harflerle eşleşir. İken .olmayan herhangi satır besleme karakteri eşleşebilir, geriye ilerleme diğer koşulları sağlamak:

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

Bu , sonraki konumdan geriye doğru eşleşir .. İlk önce bir veya daha fazla alfasayısal karakter ile eşleşir ve bunları grup 1halinde toplar ([^_\W]+). Bu hemen .bir alfanümerik karakterin kendisine karşılık gelmesini sağlar . Ardından ek [^_\W], geçerli çalıştırmada eşleşmeyi dahil etmediğimiz bir tane daha alfanümerik karakter olduğundan emin olur . Şimdi grup 1, eşleşmeyi bir rakamsa değiştirmeyi istediğimiz şeydir - eğer bir harfse onu iki kez bu dizgeyle değiştirmek isteriz. İkinci bakış açısının devreye girdiği yer:

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

Bu isteğe bağlıdır, bu yüzden başarısız olursa eşleşmeyi etkilemez. İlk sağlamaktadır .oldu değil aracılığıyla bir rakam (?<=\D)- Bu olan ileriye dönük sadece ilgili olduğu yani biz de eşleştirme harfler. Bu durumda, grubu bir \1kez daha eşleştiririz (bu her zaman eşleşir, çünkü grubu aynı konumdan yakaladık), ancak gruba dahil ettik 2.

Bu nedenle, regex'i her iki grubun içeriği ile değiştiririz ( $1$2). Eğer maç bir rakamsa, $2hala boş olacak ve ön eki sadece bir kez geri yazacağız. Eğer bir mektup olsaydı $2, aynıydı $1ve tekrar iki kere yazıyoruz.


8

JavaScript (ES6) 82

Mwr247 tarafından önerilen regexp optimizasyonunu kullanma

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='')

Herhangi bir yeni tarayıcıda aşağıdaki snippet'in çalıştığını test edin

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>


Kutsal inek! Bu benim yaptığımdan çok daha farklı (ve daha iyi) (n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳'nın yaklaşımına benzer). +1
ETH Sunumları

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=''))

Nasıl golf oynayacağımı bilemiyorum ...

Aşağı indirgenmiş regex için Mwir247 ve bir byte golf için ETH sunumları işlevini azaltın .


Bunu /[^_\W]+/g
regex'iniz

Bunun .reducefonksiyon için işe yarayacağına inanıyorum : (a,e)=>a+=(y+=e,++e?y:y+y)(1 byte daha kısa)
ETHproductions

5

Haskell, 215 200 bayt

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)

Bu bir karmaşa.

Garip tuhaflıkları okurken iyi eğlenceler, idbu kadar çok kullanacağımı hiç düşünmemiştim .

Zaten burada yarım çalışır Çok kötü şeyler aktarılması gerektiğini ( isDigit, isAlpha, inits).


2
O var lang-hsdeğil lang-haskell. Bunu belirterek lang-haskellmuhtemelen varsayılan bir vurgulayıcı kullanarak sona erer.
Bakuriu,

3

Gema, 57 karakter

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

Örnek çalışma:

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 bayt

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

Kullanımı:

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

Leif Willerts'in cevabında esasen farklı mı bilmiyorum. Ama işte algoritma.

  1. Geçerli harfi ara (Harf veya Num)
  2. Eğer mektubu, mektubu toplamaya başlayın. Ancak, ters olarak saklanır, dizgiyi tersine çevirir. Ve ilk madde atlandı.
  3. Geçersiz harfe çarptığında, sorgunun ters girişi ile dönüşümünü yapın. Sorunun dönüşümü tersine döndü. Ters, ancak tersine çevrildi, o zaman sadece tersine çevirdik

Her nasılsa redudant parantez tutuyorum.


0

T-SQL, 357 bayt

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

örn .: exec x(@s='1337 numb3r5') döner1333337 nuuumumumbumbumb3umb3rumb3rumb3r5


0

Python 2, 131 Bayt

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

Karakterler arasında dolaşır ve gerekirse kaydeder / tekrarlar.


0

Pip, 41 bayt

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

Metni bir komut satırı argümanı olarak alır. Tüm alfanümerik işlemleri ( [^_\W]+) bir geri çağırma işleviyle değiştirmek için bir regex değişimi kullanıyoruz . Bu fonksiyon kelimenin her karakterine başka bir fonksiyon eşler, giderek daha büyük karakter dizileri oluşturur (global değişkenin ydizini takip etmesiyle) ve karakter bir sayı değilse onları X2 tekrar eder. ( +Bir sayıya dönüştürmek ve daha sonra Qbunun orijinal karaktere eşit olup olmadığını kontrol etmek için kullanılan mantık .) Bu işlem ilk karakterden çıkar, ancak daha sonra eklememiz gerekir ( a@0.).


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.