Napraw tekst Meeesesessessesseesseesesedered upp teeexextext

38

Inspiracją jest poniedziałkowy mini-golf # 6: Meeesesessess upp teeexextext

tło

Produkty ETH mają trudności z wprowadzaniem tekstu na swojej zwykłej stronie internetowej. Ilekroć użyje cyfr lub liter, tekst zostanie wyświetlony w porządku. Twoim zadaniem jest pomóc mu pisać, aby osiągnąć normalne zachowanie.

Transformacja

Transformacja wpływa na przebiegi [0-9A-Za-z]znaków alfanumerycznych ( ) ograniczonych dowolnymi znakami niealfanumerycznymi . W poniższym przykładzie pierwsza linia zostanie przekształcona w drugą (inne linie pokazują rozkład transformacji)

An12num:
Annn1n12n12nn12nn12nun12nun12numn12num
A
 nn
   n1
     n12
        n12nn12n
                n12nun12nu
                          n12numn12num

W szczególności jakikolwiek znak alfanumeryczny po pierwszym w przebiegu zostanie jak dotąd przekształcony w cały przebieg, z wyjątkiem pierwszego znaku . Ponadto, jeśli znak jest literą (w przeciwieństwie do cyfry), znak zostanie zamieniony dwukrotnie .

Na szczęście cofnięcie usunie ostatni znak, a także zresetuje początek uruchomienia.

Zadanie

Tym razem Twoim zadaniem nie jest przeprowadzenie transformacji. Zamiast tego, biorąc pod uwagę ciąg wejściowy, musisz zwrócić zakodowany tekst, który po przekształceniu spowoduje wejście. Wynik musi być jak najkrótszy, \<char>liczony jako pojedynczy znak.

Tekst jest kodowany w następujący sposób:

\                   -> \\
backspace character -> \b
linefeed            -> \n

Możesz napisać program lub funkcję, pobierając dane wejściowe przez STDIN (lub najbliższą alternatywę), argument wiersza poleceń lub argument funkcji i wypisując wynik przez STDOUT (lub najbliższą alternatywę), wartość zwracaną funkcji lub parametr funkcji (wyjściowej).

Przypadki testowe

Każdy przypadek testowy składa się z dwóch wierszy, z których pierwszy to wejście, a drugie wyjście.

Heeeeeelp me. It shouldn't be messed up.
Hee \blp\b me\b. It\b sh\bou\bld\bn't be\b me\bss\bed\b up\b.

alert("Hello, world!");
al\ber\bt("He\bll\bo, wo\brl\bd!");

1223234234523456
123456
Akangka
źródło
6
Jest dobrze zdefiniowany, ale dlaczego nie ma odpowiedzi?
Akangka,
1
Jakoś mi tego brakowało; miłe wydzielenie! Być może spróbuję napisać odpowiedź później.
ETHprodukcje
To przypomina mi czas, kiedy mój przyjaciel wysłał SMS-a za pośrednictwem UDP
TRGWII,
1
Myślę, że twój ostatni przypadek testowy wymaga naprawy. Uwzględniasz pierwszą postać (za 1każdym razem) w biegach.
Leif Willerts
Naprawdę nie rozumiem, co mam zrobić ... Przepraszam. Czy możesz dodać jakieś dane wejściowe i wyjściowe oraz przykłady z wyjaśnieniem? Przepraszam.
Yassin Hajaj

Odpowiedzi:

10

CJam, 207

{_,1>{:E1<_0{:I2$,+E=:C+:R1>C'9>)*+:P,E,<{EP#{L0}{PRI)1}?}{PE#L{R8cP,E,-*+}?0}?}g}&}:U;LqS+'a+{_'[,_el^A,s+&,V={+}{s\V!:V{L{:BU_aL?B,,1>Bf{_2$<U_{_W=8>S8c+*+\@>j+}{?;}?}+{,}$0=}j}|\}?}%s'\8cN++'\"\bn"f+er-2<

Wypróbuj online

Wyjaśnienie:

Prawie zapomniałem napisać: p

Problem został rozwiązany w kilku krokach:

  • tekst jest podzielony na ciągi znaków alfanumerycznych (nazwijmy je słowami) i ciągi znaków innych niż alfanumeryczne (inne niż słowa)
  • nie-słowa są drukowane tak jak są, a słowa są ustalone
  • naprawianie słowa odbywa się rekurencyjnie (z zapamiętywaniem): podziel słowo na 2 części na wszystkie możliwe sposoby (w tym pustą 2. część), spróbuj odhaczyć pierwszą część (patrz poniżej), napraw drugą część i połącz wyniki spacją -backspace w razie potrzeby; wybierz najkrótsze pod-rozwiązanie
  • nieodczytanie fragmentu oznacza znalezienie minimalnego ciągu znaków alfanumerycznych, po którym ewentualnie następują odstępy (ale bez odstępów pośrodku), które po pomieszaniu skutkują danym fragmentem; odbywa się to za pomocą prostego, chciwego algorytmu, przechodząc od lewej do prawej, budując równolegle nieprzerwany łańcuch i jego pomieszaną wersję oraz określając następny potrzebny znak na każdym kroku; niektóre fragmenty nie mogą być rozczłonkowane
aditsu
źródło
1
Święta krowa ... to jeden kawał programu CJam! Dobra robota.
ETHprodukcje