Monday Mini-Golf # 6: Meeesesessess upp teeexextextext

48

Monday Mini-Golf: Seria krótkich wyzwań, opublikowanych (miejmy nadzieję!) W każdy poniedziałek.

Prawdziwa historia 1 : Pewnego dnia bawiłem się na tablecie, gdy wpadłem na pomysł, aby odwiedzić stronę, której zwykle używam na komputerze do testowania JavaScript. Po załadowaniu strony wszedłem do tego prostego programu:

alert("Hello!")

Następnie nacisnąłem przycisk Wykonaj i byłem zaskoczony, gdy powiedział mi, że wprowadzony kod jest nieprawidłowy. Spojrzałem na pole tekstowe i zobaczyłem to:

alllelelerlerlertlert("Heeelelellellelloello!")

Co ??? Nie do tego wszedłem! Co się tu stało? Aby to rozgryźć, wprowadziłem dwie proste linie:

abcdefg
0123456

Okazało się to:

abbbcbcbcdbcdbcdebcdebcdefbcdefbcdefgbcdefg
0112123123412345123456

Do tej pory nadal nie miałem pojęcia, co się stało z literami, ale liczby wydawały się prostsze, więc przyjrzałem się bliżej. Jak się okazało, strona po prostu wpisywała pierwszy znak, a następnie powtarzała całą resztę w ciągu za każdym razem, gdy naciskany był nowy:

0112123123412345123456
0
 1
  12
    123
       1234
           12345
                123456

Ale co z sekcjami liter? Po chwili zastanowienia zdałem sobie sprawę, że jest tak samo, ale zamiast powtarzać każdą podsekcję raz, powtarza ją dwa razy :

abbbcbcbcdbcdbcdebcdebcdefbcdefbcdefgbcdefg
a
 bb
   bcbc
       bcdbcd
             bcdebcde
                     bcdefbcdef
                               bcdefgbcdefg

Połączenie dwóch działa z kombinacją tych technik:

abc123z
abbbcbcbc1bc12bc123bc123zbc123z
a
 bb
   bcbc
       bc1
          bc12
              bc123
                   bc123zbc123z

Cokolwiek powoduje usterka, wydaje się, że resetuje się przy interpunkcji i spacjach, więc tak się abc defdzieje abbbcbc deeefef.

W tym momencie byłem tak pochłonięty rozpracowaniem go i przekształceniem go w ciekawe wyzwanie, że zapomniałem, dlaczego tam byłem. (Jednak wymyśliłem, jak pisać normalnie: naciskanie spacji po każdym znaku. Dość nudne, ale musisz robić to, co musisz.)

Wyzwanie

Celem wyzwania jest napisanie programu lub funkcji, która pobiera tekst do przetworzenia, wprowadza zmiany wymienione powyżej i wyświetla / zwraca wynik.

Detale

  • Dane wejściowe będą zawierały tylko ASCII do wydruku i nie będą zawierać zakładek ani znaków nowej linii.

Przypadki testowe

Wejścia: (jeden na linię)

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!

Wyjścia:

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!

Punktacja

To jest , więc wygrywa najkrótszy prawidłowy kod w bajtach. Tiebreaker przechodzi do przesyłania, które jako pierwsze osiągnęło końcową liczbę bajtów. Zwycięzca zostanie wybrany w poniedziałek, 2 listopada. Powodzenia!

Edit: A zwycięzcą jest ... @ MartinBüttner użyciu Retina dla niesamowitej 43-bajtowy rozwiązanie!

1 Tak, ta historia jest całkowicie prawdziwa, a jeśli potrzebujesz więcej wyjaśnień, patrz przypis 1.

ETHprodukcje
źródło
1
Ta zasada interpunkcji ...' '.join(x[0]+''.join(2*x[1:i]for i in range(1,len(x)+1)) for x in raw_input().split())
TheDoctor
kaszel Użyj Chrome DevTools kaszel
kirbyfan64sos
@TheDoctor Sprawdź historię edycji mojej odpowiedzi: P
Beta Decay
1
@BetaDecay wielkie umysły myślą podobnie;)
TheDoctor
inb4 ktoś tworzy język, w którym tak naprawdę musisz tak pisać.
DJgamer98,

Odpowiedzi:

13

Siatkówka , 43 bajty

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

Uruchom kod z jednego pliku z -sflagą. Ponieważ jest to tylko jedno podstawienie wyrażenia regularnego, możesz go przetestować tutaj (kliknij kartę Kontekst, aby zobaczyć wyniki).

Wyjaśnienie

Odpowiada każdej cyfrze i literze, która nie jest pierwszą w serii. Chociaż .może pasować do dowolnego znaku nieciągłego, to lookbehinds zapewniają pozostałe warunki:

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

To pasuje do tyłu od pozycji po .. Najpierw dopasowuje jeden lub więcej znaków alfanumerycznych i przechwytuje je do grupy za 1pomocą ([^_\W]+). To natychmiast zapewnia, że .odpowiada samemu znakowi alfanumerycznemu. Następnie dodatkowe [^_\W]upewnia się, że w bieżącym przebiegu jest jeszcze jeden znak alfanumeryczny, którego nie uwzględniamy. Teraz grupą 1jest to, co chcemy zastąpić dopasowaniem, jeśli jest to cyfra - jeśli jest to litera, chcemy zastąpić ją dwukrotnością tego ciągu. Właśnie tutaj pojawia się drugi wygląd:

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

Ten jest opcjonalny, więc jeśli zawiedzie, nie wpłynie w ogóle na dopasowanie. Najpierw upewnia się, że nie. była to cyfra przez - więc ten wygląd ma znaczenie tylko wtedy, gdy dopasowujemy litery. W takim przypadku ponownie dopasowujemy grupę (to zawsze pasuje, ponieważ złapaliśmy grupę z tej samej pozycji), ale przechwytujemy ją do grupy .(?<=\D)\12

Dlatego po prostu zastępujemy wyrażenie regularne zawartością obu grup ( $1$2). Jeśli dopasowanie było cyfrą, $2nadal będzie puste, a prefiks wypisujemy tylko raz. Jeśli to był list, $2jest taki sam jak $1i odpisujemy go dwa razy.

Martin Ender
źródło
8

JavaScript (ES6) 82

Korzystanie z optymalizacji wyrażeń regularnych sugerowanej przez 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='')

Przetestuj poniższy fragment kodu w dowolnej najnowszej przeglądarce

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>

edc65
źródło
Święta krowa! To jest zupełnie inne (i lepsze) niż bym to zrobił (podobnie do podejścia n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨d̷̰̀ĥ̷̳). +1
ETHprodukcje
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=''))

Nie mam pojęcia, jak zagrać w golfa ...

Dzięki Mwir247 za wyrażenie regularne w golfa i produkcje ETH dla jednego bajtu golfa w funkcji zmniejszania .

n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨d̷̰̀ĥ̷̳
źródło
Użyj tego do wyrażenia regularnego: /[^_\W]+/g(zapisuje 3 znaki)
Mwr247
Myślę, że to zadziałałoby dla .reducefunkcji: (a,e)=>a+=(y+=e,++e?y:y+y)(1 bajt krótszy)
ETHprodukcje
5

Haskell, 215 200 bajtów

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)

To bałagan.

Miłej zabawy, czytając wszystkie te dziwactwa, nigdy nie myślałem, że idtyle skorzystam.

Szkoda tylko, że rzeczy, które już robi pół pracę tutaj musi być importowane ( isDigit, isAlpha, inits).

Leif Willerts
źródło
2
To lang-hsnie lang-haskell. Podanie lang-haskellgo prawdopodobnie spowoduje użycie domyślnego zakreślacza.
Bakuriu
3

Gema, 57 znaków

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

Przykładowy przebieg:

bash-4.3$ gema '\X?=?@set{s;};<D1>=@append{s;$0}$s;<L1>=@append{s;$0}$s$s' <<< '1337 numb3r5'
1333337 nuuumumumbumbumb3umb3rumb3rumb3r5
człowiek w pracy
źródło
3

Haskell, 183 181 bajtów

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

Stosowanie:

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

Nie wiem, czy zasadniczo różni się odpowiedź Leifa Willertsa. Ale oto algorytm.

  1. Wyszukaj prawidłową literę (litera lub cyfra)
  2. Jeśli to list, zacznij zbierać list. Jest on jednak zapisywany odwrotnie, należy zmienić ciąg znaków. I pierwszy element jest pomijany.
  3. Gdy trafi niepoprawna litera, wykonaj transformację pytania z odwrotnym wejściem. Transformacja pytania jest odwrotna. G. Odwrotna, ale ponieważ jest już odwrócona, po prostu robimy odwrotną. G

Jakoś trzymam nawiasy klamrowe.

Akangka
źródło
0

T-SQL, 357 bajtów

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

np .: exec x(@s='1337 numb3r5') zwraca1333337 nuuumumumbumbumb3umb3rumb3rumb3r5

Sam cd
źródło
0

Python 2, 131 bajtów

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

Pętle przechodzą przez znaki i zapisują / powtarzają się w razie potrzeby.

TFeld
źródło
0

Pip, 41 bajtów

aR`[^_\W]+`{[email protected]@{1,++y}X2-(_Q+_)MJa}

Traktuje tekst jako argument wiersza polecenia. Używamy wyrażenia regularnego, aby zastąpić wszystkie biegi alfanumeryczne ( [^_\W]+) funkcją wywołania zwrotnego. Ta funkcja odwzorowuje inną funkcję na każdy znak słowa, generując stopniowo większe ciągi znaków (ze zmienną globalną yśledzącą indeks) i powtarzając je X2, jeśli znak nie jest liczbą. (Logika, za pomocą której następuje +konwersja na liczbę, a następnie Qsprawdzenie, czy jest ona równa ciągowi znaków z oryginalnym znakiem.) Ten proces pomija jednak pierwszy znak, więc musimy go później dodać ( a@0.).

DLosc
źródło
0

Python 3 , 86 bajtów

f=0
m=''
for i in input():g=i.isalnum();m=m*g*f+i*f;print(end=m*-~i.isalpha()or i);f=g

Wypróbuj online!

Erik the Outgolfer
źródło