Tam naprawiłem (za pomocą taśmy)


41

Wyzwanie:

Biorąc pod uwagę ciąg zawierający tylko wielkie i / lub małe litery (w zależności od tego, co wolisz), umieść go tapepoziomo, aby go naprawić. Robimy to poprzez sprawdzenie różnicy dwóch sąsiadujących liter w alfabecie (pomijając wrap-around i tylko idzie do przodu) i wypełnienie przestrzeni z taką TAPE/ tapejak będziemy potrzebować.


Przykład:

Wejście: abcmnnnopstzra
Wyjście:abcTAPETAPETmnnnopTAstTAPETzra

Dlaczego?

  • Pomiędzy ci mpowinno być defghijkl(długość 9), więc wypełniamy to TAPETAPET;
  • Pomiędzy pi spowinno być qr(długość 2), więc wypełniamy to TA;
  • Pomiędzy ti zpowinno być uvwxy(długość 5), więc wypełniamy to TAPET.

Zasady konkursu:

  • Różnica dotyczy tylko przodu, więc nie ma między nimi taśmy zra.
  • Możliwe jest posiadanie wielu takich samych sąsiadujących liter jak nnn.
  • Dozwolone jest przyjmowanie danych wejściowych w dowolnym rozsądnym formacie. Może być pojedynczym łańcuchem, tablicą / listą znaków, tablicą znaków / listą itp. Wyjście ma taką samą elastyczność.
  • Możesz używać małych i / lub wielkich liter w dowolny sposób. Dotyczy to zarówno wejścia, wyjścia, jak i TAPE.
  • Możliwe, że nie TAPEjest konieczne, w którym to przypadku dane wejściowe pozostają niezmienione.

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania.
  • Do odpowiedzi mają zastosowanie standardowe reguły , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami i zwracanymi typami, pełnych programów. Twoja decyzja.
  • Domyślne luki są zabronione.
  • Jeśli to możliwe, dodaj link do testu kodu.
  • W razie potrzeby dodaj również wyjaśnienie.

Przypadki testowe:

Input:  "abcmnnnopstzra"
Output: "abcTAPETAPETmnnnopTAstTAPETzra"

Input:  "aza"
Output: "aTAPETAPETAPETAPETAPETAPEza"

Input:  "ghijk"
Output: "ghijk"

Input:  "aabbddeeffiiacek"
Output: "aabbTddeeffTAiiaTcTeTAPETk"

Input:  "zyxxccba"
Output: "zyxxccba"

Input:  "abccxxyz"
Output: "abccTAPETAPETAPETAPETAPExxyz"

Input:  "abtapegh"
Output: "abTAPETAPETAPETAPETtaTAPETAPETAPETApeTgh"

Input:  "tape"
Output: "taTAPETAPETAPETApe"

10
Nie jestem pewien, dlaczego odrzucamy niektóre poprawki (np. Odrzucamy APE po naprawie za pomocą TAPETAPETU i przed naprawą za pomocą TA), wydaje mi się to stratą dobrego TAPE, ale może właśnie tak rzucam (przepraszam).
Jonathan Allan,

@JonathanAllan Hehe, naprawdę masz rację, że to trochę marnowanie „taśmy”. Hmm, może być coś, czego mógłbym użyć w drugiej części wyzwania . ;)
Kevin Cruijssen

Co jeśli ciąg przychodzi z taśmą - np. AbTAPEgh?
manassehkatz-Reinstate Monica

@manassehkatz Będzie interpretowany jak każdy inny znak, więc ab[TAPETAPETAPETAPET]TA[TAPETAPETAPETA]PE[T]gh(dodano, []aby był bardziej czytelny).
Kevin Cruijssen

1
@KevinCruijssen Co jest spójne, choć (jak w przypadku pytania „taśma marnująca”) nie jest w 100% logiczne. Więc może jeszcze jeden przypadek testowy: Wprowadź TAPE, wyjdź TATAPETAPETAPETAPE (myślę, że mam rację ...)
manassehkatz-Reinstate Monica

Odpowiedzi:


8

05AB1E , 14 12 bajtów

'¡ÉIÇ¥<∍‚ζJJ

Wypróbuj online!

Wyjaśnienie

'¡É            # push the string "tape"
   I           # push input
    Ç          # convert to a list of character codes
     ¥         # calculate deltas
      <        # decrement
       ∍       # extend the string "tape" to each of these sizes
               # results in an empty string for sizes smaller than zero
        ‚ζ     # zip with input (results in a list of pairs)
          JJ   # join to a list of strings and then to a string

4
Czy mógłbyś dodać wyjaśnienie? Myślę, że jest dość podobny do odpowiedzi Jelly, ale jestem ciekawy, które z bohaterów są używane do tego, które z operacji mają uzyskać wynik. Jedna z ogólnych zasad w moich wyzwaniach: „ W razie potrzeby dodaj wyjaśnienie. ” W przypadku języków takich jak Jelly, 05AB1E, węgiel drzewny, APL itp. Można założyć, że większość ludzi nie może ich przeczytać, a wyjaśnienie jest obowiązkowe . :)
Kevin Cruijssen

@KevinCruijssen: Z pewnością. Zazwyczaj dodaję wyjaśnienie do moich odpowiedzi 05AB1E, ale nie zawsze mam odpowiedni czas, kiedy je publikuję.
Emigna

1
@KevinCruijssen w argumentach dowolnego łącza 05AB1E TIO, które można dodać, -daby uzyskać zrzut stosu operacji po operacji surowego stosu tego, co dzieje się zamiast wyjaśnienia, ale staram się je również opublikować, ale nie jest to proste, szczególnie na niektórych z mojego LOL.
Magic Octopus Urn

10

Galaretka , 13 bajtów

OI’“¡ʂƁ»ṁ$€ż@

Wypróbuj online!

Wyjaśnienie

OI '„¡ʂƁ» ṁ $ € ż @ - Pełny program. Weź ciąg jako argument wiersza poleceń.
O - numer porządkowy. Uzyskaj wartości ASCII każdego znaku.
 I '- Uzyskaj przyrosty (delty) i odejmij 1 od każdego.
          € - Za każdą różnicę ...
   „¡ꟅƁ» ṁ $ - Uformuj skompresowany ciąg „taśmy” zgodnie z tymi wartościami.
                Zasadniczo wydłuża / skraca „taśmę” do niezbędnej długości.
           ż @ - Przeplot z wejściem.

Oto sztuczka, która doprowadzi cię do 12
Jonathan Allan

@JonathanAllan To wydaje mi się nieważne. Wyprowadza abctapetapetmnnnopapstetapezrazamiast abctapetapetmnnnoptasttapetzra.
Pan Xcoder,

7
Och, tak, to nieważne - nie zdawałem sobie sprawy, że mamy marnować taśmę z rolki!
Jonathan Allan

7

Haskell , 58 bajtów

f(x:y:r)=x:take(length[x..y]-2)(cycle"TAPE")++f(y:r)
f s=s

Wypróbuj online! Funkcja fpowtarza się nad ciągiem znaków i sprawdza kolejne znaki xoraz y. cycle"TAPE"daje nieskończony ciąg "TAPETAPETAPE...". [x..y]pobiera zakres znaków od xdo ywłącznie, więc musimy odjąć dwa od długości. W przypadku, gdy xwystępuje później w alfabecie, ylub oba są tym samym znakiem, po odjęciu otrzymujemy liczbę ujemną, ale na szczęście takeje również akceptuje i po prostu nic nie bierze.


6

Perl 5 , -F46 bajtów

#/usr/bin/perl -F
use 5.10.0;
say map{((P,E,T,A)x7)[2..-$^H+($^H=ord)],$_}@F

Wypróbuj online!


2
Chciałem zapytać dlaczego P,E,T,Azamiast T,A,P,E, ale teraz zauważam, że użyłeś ((P,E,T,A)x7)[2..-$^H+($^H=ord)zamiast ((T,A,P,E)x7)[0..-$^H+($^H=ord)-2zapisać dwa bajty. Niezła odpowiedź!
Kevin Cruijssen

Naprawdę bardzo ładnie! O wiele lepsze niż moje naiwne podejście! Możesz jednak zapisać 2 bajty za pomocą literal ^H( \x08)!
Dom Hastings,

@DomHastings Dosłowne zmienne znaków sterujących zostały już wyłączone dla wielu wersji perla. Mógłbym zażądać wyniku na starszej wersji perla (tak jak ostatnio do$0), ale tutaj są tylko 2 bajty, więc nie zawracałem sobie głowy
Ton Hospel

Ach, oczywiście! To dlatego, że macOS ma domyślnie 5.18.2, więc jest to wersja, którą znam najbardziej!
Dom Hastings,



4

C, 84 bajtów

i,l;f(char*s){for(;*s;)for(putchar(l=*s++),l=s[i=0]+~l;i<l;)putchar("TAPE"[i++%4]);}

Wypróbuj online!

C (uruchamiany z wiersza polecenia systemu Windows), 81 bajtów

i,l;f(char*s){for(;putchar(l=*s++);)for(l=s[i=0]+~l;i<l;)putchar("TAPE"[i++%4]);}

Wynik:


4

Python 3 , 98 bajtów

lambda a:"".join(sum(zip(a,[("TAPE"*9)[:y>x and~ord(x)+ord(y)]for x,y in zip(a,a[1:])]),()))+a[-1]

Wypróbuj online!

-1 bajt dzięki Asone Tuhid


@AsoneTuhid Dzięki. Polecam opublikować własną odpowiedź, ponieważ sporo grałeś w golfa, a także grałeś w odpowiedź TFeld na to samo, więc edytowanie spowodowałoby duplikaty (co nie jest niedozwolone)
HyperNeutrino

W porządku, miej 1 bajt
Asone Tuhid

@AsoneTuhid no dobra, dzięki
HyperNeutrino

4

Scala , 66 bajtów

(s:String)=>s./:("z"){(o,c)=>o+("TAPE"*6).take(c-o.last-1)+c}.tail

Wypróbuj online!

Wyjaśnienie

/: foldLeft over the string
("z") starting with a non-empty string to we don't have to handle the first iteration in a special way
"TAPE"*6 generate a long enough string of TAPETAPETA...
.take(c-o.last-1) take the difference between this character and the previous (now the last char in the output so far) characters from the TAPETAPETA... string. o.last will always be safe because we start with a non-empty string.
o+...+c append it to the output so far ... and add this character to the end
.tail get rid of the leading z we added

Witamy w PPCG i niezła pierwsza odpowiedź! +1 ode mnie
Kevin Cruijssen

4

PHP , 85 bajtów

$s=str_split($argv[1]);foreach($s as$l)echo str_pad($l,ord(next($s))-ord($l),'TAPE');

Wypróbuj online!

Wyjaśnienie

$s = str_split($argv[1]);   // convert the parameter string to an array
foreach($s as $l)           // loop the array
echo str_pad(               // print
  $l,                       // the letter
  ord(next($s)) - ord($l),  // calculate the distance to the next letter using ASCII values
  'TAPE'                    // padding string
);                          // profit!

2
Witamy na stronie! :)
DJMcMayhem

3

JavaScript, 131 127 bajtów

4 bajty zapisane dzięki Rickowi Hitchcockowi.

z=(a=>[...a].reduce((x,y)=>x+[...Array((f=y[c='charCodeAt']()-x.slice(-1)[c]())>1?f-1:0)].reduce((e,r,t)=>e+"TAPE"[t%4],"")+y))

Rozwinięty

z = a => [... a]. redukcja (
  (x, y) =>
    x + [... Array (
      (f = y.charCodeAt () - (x.slice (-1) .charCodeAt ()))> 1? (f-1): 0
    )].redukować(
      (e, r, t) => 
        e + „TAPE” [t% 4], „”) + y
);

Mój problem polega na tym, że JavaScript nie ma czystego sposobu na uzyskanie odległości między znakiem a i b.

<script>
  z=(a=>[...a].reduce((x,y)=>x+[...Array((f=y[c='charCodeAt']()-x.slice(-1)[c]())>1?f-1:0)].reduce((e,r,t)=>e+"TAPE"[t%4],"")+y))
</script>

<main>
  <input id="input-box" type="text">
  <pre id=output>output</pre>
</main>

<script>
  inputBox = document.getElementById("input-box");
  inputBox.addEventListener("keyup", function(e){
    output.innerText = z(inputBox.value);
  });
</script>


1
Miły. Możesz zapisać bajt, usuwając końcowy średnik i zaoszczędzić jeszcze kilka bajtów, przypisując charCodeAtdo zmiennej: z=(a=>[...a].reduce((x,y)=>x+[...Array((f=y[c='charCodeAt']()-x.slice(-1)[c]())>1?f-1:0)].reduce((e,r,t)=>e+"TAPE"[t%4],"")+y))
Rick Hitchcock

Dzięki! Jestem absolutnie oburzony tym, jak to działa, ale dobrze jest wiedzieć, że tak będzie w przyszłości.
Jhal


2

Węgiel drzewny , 20 bajtów

⭆θ⁺…TAPE∧κ⊖⁻℅ι℅§θ⊖κι

Wypróbuj online! Wyjaśnienie:

 θ              θ       Input string
⭆                       Map over characters
                  κ     Current index
                 ⊖      Decremented
               §        Index into string
             ι          Current character
            ℅ ℅         Ordinal
           ⁻            Subtract
          ⊖             Decremented
         κ              Current index
        ∧               Logical and
    TAPE                Literal string
   …                    Mold to length
                   ι    Current character
  ⁺                     Concatenate
                        Implicitly print

2

Pip , 29 bajtów

O@a{"TAPE"@<MX[0v-$-Ag]}.BMPa

Pobiera dane wejściowe jako argument wiersza polecenia (małe lub wielkie litery, nie ma znaczenia). Wypróbuj online!

Wyjaśnienie

O@a{"TAPE"@<MX[0v-$-Ag]}.BMPa
                               a is 1st cmdline arg; v is -1 (implicit)
O                              Output without newline
 @a                            the first character of a
                          MPa  Map this function to pairs of successive characters of a:
                    Ag          Get the ASCII codes of the two characters
                  $-            Fold on subtraction (i.e. asc(first)-asc(second))
                v-              -1 minus the above (i.e. asc(second)-asc(first)-1)
              [0      ]         A list containing 0 and the above
            MX                  Max of the list
          @<                    The first ^ characters (with cyclic indexing)
    "TAPE"                      of this string
   {                   }.B      Concatenate the second character

2

JavaScript (ES6), 80 78 bajtów

f=([s,...S],t=S[0])=>t?s.padEnd((t>s)*(parseInt(s+t,36)-370)%37,'TAPE')+f(S):s

Odległość między dwoma znakami można określić, przekształcając ich konkatenację w podstawę 36, odejmując 370, moduł 37.

Na przykład (parseInt('cy',36)-370)%37 == 22.

Następnie możemy użyć padEnddo wypełnienia luk i rekurencji do obsługi pętli.

Przypadki testowe:


2

K4 , 48 bajtów

Rozwiązanie:

{,/_[w;x],',[1_d w:&0<d:-1+-':"j"$x;0]#\:"TAPE"}

Przykłady:

q)k){,/_[w;x],',[1_d w:&0<d:-1+-':"j"$x;0]#\:"TAPE"}"abcmnnnopstzra"
"abcTAPETAPETmnnnopTAstTAPETzra"
q)k){,/_[w;x],',[1_d w:&0<d:-1+-':"j"$x;0]#\:"TAPE"}"aza"
"aTAPETAPETAPETAPETAPETAPEza"
q)k){,/_[w;x],',[1_d w:&0<d:-1+-':"j"$x;0]#\:"TAPE"}"zyxxccba"
"zyxxccba"
q)k){,/_[w;x],',[1_d w:&0<d:-1+-':"j"$x;0]#\:"TAPE"}"aabbddeeffiiacek"
"aabbTddeeffTAiiaTcTeTAPETk"

Wyjaśnienie:

Dość proste rozwiązanie, ale duża liczba bajtów ... Znajdź delty, pobierz z ciągu "TAPE", dołącz do oryginalnego cięcia ciągu, w którym delty są> 1.

{,/_[w;x],',[1_d w:&0<d:-1+-':"j"$x;0]#\:"TAPE"} / the solution
{                                              } / lambda
                                         "TAPE"  / the string TAPE
                                      #\:        / take each-left
           ,[                      ; ]           / join (,)
                                   0             / zero (ie append zero)           
                              "j"$x              / cast input to int
                           -':                   / deltas
                        -1+                      / subtract 1
                      d:                         / assign to d
                    0<                           / delta greater than 0?
                   &                             / indices where true
                 w:                              / assign to w
               d                                 / index into deltas at w
             1_                                  / drop first
         ,'                                      / join each-both
   _[w;x]                                        / cut input x at indices w
 ,/                                              / flatten

2

Excel VBA, 106 bajtów

Anonimowa funkcja bezpośredniego okna VBE, która pobiera dane jako ciąg wielkich liter przez komórkę A1i wysyła je do bezpośredniego okna VBE.

a=90:For i=1To[Len(A1)]:c=Mid([A1],i,1):b=Asc(c):For j=2To b-a:?Mid("peta",j Mod 4+1,1);:Next:?c;:a=b:Next

2

Ruby , 59 53 bajtów

->s{s.reduce{|x,y|x+y.rjust(y.ord-x[-1].ord,"TAPE")}}

Wypróbuj online!

W rzeczywistości jest to dość proste - bierzemy dane wejściowe, dzieląc nasz ciąg znaków na tablicę znaków (dzięki Asone Tuhid za wskazanie tego) i stosujemy operację redukcji, w której uzasadniamy każdy znak do wymaganej długości, używając „TAPE” jako łańcucha wypełniającego.


Pytanie mówi, że możesz przyjmować dane wejściowe jako tablicę znaków. ( 53 bajty )
Asone Tuhid

2

K (oK) , 33 bajty

{,/((0|-1+0,1_-':x)#\:"TAPE"),'x}

Wypróbuj online!

{ } funkcja anonimowa z argumentem x

-':x odejmij każdy poprzedni (użyj wyimaginowanego 0 przed pierwszym elementem)

1_ upuść pierwszy przedmiot

0, wstawić 0

-1+ dodaj -1

0| max (0, ...)

(... )#\:"TAPE"przekształć ciąg "TAPE"do każdego elementu z listy po lewej stronie

(... ),'xdołączaj odpowiedni znak xdo każdego przekształconego łańcucha

,/ połącz wszystkie



2

Java (JDK) , 91 bajtów

s->{var p='z';for(var c:s)System.out.print("ETAP".repeat(9).substring(1,c>p?c-p:1)+(p=c));}

Wypróbuj online!

Wyjaśnienie

s->{                       // char[]-accepting lambda consumer, printing a String
 var p='z';                //  store the previous character
 for(var c:s){             //  for each character of the string
  System.out.print(        //   print...
   "ETAP".repeat(9)        //    "ETAP" repeated 9 times (to go above 26 chars)
    .substring(1,          //     of which, we substring c-p -1 characters
     c>p?c-p:1             //
    )                      //
   +(p=c)                  //    and append c, while also storing the previous character
  );

Kredyty

  • -2 bajty dzięki RM
  • -4 bajty dzięki pułapce cat , poprzez aktualizację do Java 10+ i przełączanie typów navar
  • -3 bajty dzięki Kevinowi Cruijssenowi , drukując wynik mojej (poprzedniej) alternatywnej wersji zamiast jej zwracać

int p=123uratuje jedną postać. Nie ma znaczenia, co pjest w pierwszej iteracji, o ile jest ona większa lub równa pierwszej postaci. Największa wartość, jaką może mieć pierwszy znak, to 'z'== ASCII 122, więc 123 jest wystarczająco dobre. Ponadto, jeśli użyłeś wielkich liter, możesz użyć 91 zamiast 123, oszczędzając inną postać.
RM

@RM Dzięki, naprawdę to działa!
Olivier Grégoire,


1

C # (.NET Core) , 122 111 bajtów

Zaoszczędź 11 bajtów dzięki @KevinCruijssen

s=>{var r=""+s[0];for(int i=1,e,d;i<s.Length;r+=s[i++])for(e=d=s[i]-s[i-1];d-->1;)r+="ETAP"[(e-d)%4];return r;}

Wypróbuj online!

Wyjaśnienie:

s => 
{
    var r = "" + s[0];                  //Declare string for the result and initialize with the first character from the input.
    for (                               //Loop over the input,
        int i = 1, e, d;                //starting with the second character, also declare helper variables.
        i < s.Length;                   //Loop until the end of the input is reached.
        r += s[i++])                    //Add the current character to the result and increase the counter.
        for (                           //Loop for adding the TAPE.
            e = d = s[i] - s[i - 1];    //Calculate the differnce between the current and the previous character.
            d-- > 1;)                   //Loop until the difference is 1.
            r += "ETAP"[(e - d) % 4];   //Add a character from the TAPE to the result.
    return r;                           //Return the result.
}

1
Dobra odpowiedź, +1 ode mnie. Można zapisać 4 bajty zmieniając whileDo fori usuwanie nawiasów: for(int i=1,e,d;i<s.Length;r+=s[i++])for(e=d=s[i]-s[i-1];d-->1;r+=t[(e-d)%4]);. :) Aha, i skoro używasz t="ETAP"tylko raz, można go używać bezpośrednio, a zmiana stringna varzaoszczędzenie 7 więcej bajtów: s=>{var r=""+s[0];for(int i=1,e,d;i<s.Length;r+=s[i++])for(e=d=s[i]-s[i-1];d-->1;r+="ETAP"[(e-d)%4]);return r;}.
Kevin Cruijssen

@KevinCruijssen: Dzięki, nie pomyślałbym o pozbyciu się nawiasów, przenosząc rzeczy do pętli for. Również jeśli czuję się głupio, że tęsknię za tym, że mogę użyć „ETAP” bezpośrednio.
raznagul

Twoja odpowiedź jest wciąż świetna, więc nie przejmuj się. :) Dostaję wskazówki dotyczące golfa prawie za każdym razem, gdy sam zamieszczam odpowiedź. Łatwiej jest też odegrać istniejącą odpowiedź, niż mieć ją od samego początku. PS: być może już je widziałeś, ale Porady dotyczące gry w kod w C # i Porady dotyczące gry w <wszystkie języki> mogą być interesujące do przeczytania, jeśli jeszcze tego nie zrobiłeś.
Kevin Cruijssen

1

Yabasic , 119 bajtów

Anonimowa funkcja, która pobiera dane wejściowe jako ciąg wielkich liter i wysyła je do STDOUT.

Input""s$
a=90
For i=1To Len(s$)
c$=Mid$(s$,i,1)
b=Asc(c$)
For j=2To b-a
?Mid$("peta",Mod(j,4)+1,1);
Next
?c$;
a=b
Next

Wypróbuj online!



1

Clojure, 139 119 bajtów

#(reduce-kv(fn[r x c](let[a(cycle "TAPE")i int d(-(i(nth(cycle %)(inc x)))(i c))](str r(if(> d 1)(apply str c(take(dec d)a))c))))""(vec %))

Anonimowa funkcja, która pobiera ciąg znaków i zwraca taśmę. Jak zawsze, Clojure nie wydaje się zbyt dobrze działać. To, czego tak naprawdę nie udało mi się wypracować, to pobranie następnego znaku w skrócie. Na ostatnim znaku dostanę OutOfBoundsExceptionoczywisty powód. Więc obejdę cycleto. Może jest bardziej eleganckie rozwiązanie.

Bez golfa

#(reduce-kv
  (fn [r x c]
    (let [a (cycle "TAPE")
          i int
          d (-
             (i (nth (cycle %) (inc x)))
             (i c))]
      (str r
           (if (> d 1)
             (apply str c (take (dec d) a))
             c))))
  ""
  (vec %))

Aktualizacja

Udało się uniknąć kilku bajtów. Pozbyłem się nieznośnego ifstwierdzenia, zmniejszając różnicę. taketworzy pustą listę, jeśli liczba wynosi 0 lub mniej, co z kolei skutkuje pustym łańcuchem.

#(reduce-kv(fn[r x c](let[d(-(int(nth(cycle %)(inc x)))(int c)1)](str r c(apply str(take d(cycle "TAPE"))))))""(vec %))

Bez golfa

#(reduce-kv
  (fn [r x c]
    (let [d (-
             (int (nth (cycle %) (inc x)))
             (int c)
             1)]
      (str
       r
       c
       (apply
        str
        (take
         d
         (cycle "TAPE"))))))
  ""
  (vec %))

1

APL (Dyalog Classic) , 30 bajtów

{∊⍵,¨⍨⍴∘'TAPE'¨0,0⌈-1+2-/⎕a⍳⍵}

Wypróbuj online!

{ } funkcja anonimowa z argumentem

⎕a⍳⍵ znajdź indeksy jego znaków w alfabecie

2-/ różnice par (poprzedni minus następny)

1+ dodaj 1

- negować

0⌈ max (0, ...)

0, wstawić 0

⍴∘'TAPE'¨zmieniaj cyklicznie ciąg 'TAPE'dla każdego

⍵,¨⍨ dołączaj każdy znak z argumentu do odpowiedniego przekształconego łańcucha

spłaszczyć


1

CJam , 27 25 bajtów

q_:i2ew.{:-~0e>_"TAPE"*<}

Wypróbuj online!

Daleko, daleko od innych języków golfowych, ale i tak jestem z tego dumny.

Wyjaśnienie

q                            Read the input
     ew                      And take windows of size
    2                          2
   i                           from the code points
  :                            of each of its characters.
        {               }    For each of these windows:
         :                     Reduce with
          -                      subtraction.
                                 Since there are only 2 elements, this just subtracts them.
             e>                Take the maximum
           ~                     of this difference's bitwise negation
            0                    and zero.
                                 This returns -n-1 if n is negative, and 0 otherwise.
                                 Call this new value m.
                      *        Repeat
                "TAPE"           the string "TAPE" m times.
               _       <       And then take the first m elements.
                             The result of this will be an array of strings which consist of
                             the string "TAPE" repeated the proper amount of times.
       .                     Zip this array with the original input.
                             Since the original input is one element longer than this array,
                             the nothing is pushed after the final character.
                             Implicitly print everything.



0

Java, 213 166 153 bajtów

i->{String o="";for(int a=0,l=i.length;++a<=l;){char u=i[a-1],n;o+=u;if(a<l){n=i[a];o+="TAPETAPETAPETAPETAPETAPET".substring(0,n-u>0?n+~u:0);}}return o;}

spróbuj online

    String o = "";
    for (int a = 0, l = i.length; ++a <= l; ) {              // for each character
        char u = i[a - 1];                                    //  current character
        o += u;                                               //  add current character to output string 
        if (a < l) {                                          //  if it's not the last one
            char n = i[a];                                    //  next character
            o += "TAPETAPETAPETAPETAPETAPET".substring(0, n - u > 0 ? n +~ u : 0); // fill with enough tape but only forward
        }
    }
    return o;

Proszę, pomóż mi to ulepszyć.

Dzięki @cairdcoinheringaahing za wskazówkę dotyczącą białych znaków. Dzięki @RM za wskazówkę na sznurku taśmy. Dzięki @KevinCruijssen za wskazówki dotyczące lambda i wyrażeń.


1
Witamy na stronie! Możesz usunąć wiele białych znaków, aby zagrać w golfa w tej odpowiedzi i zapoznaj się z tymi wskazówkami dotyczącymi gry w golfa w Javie !
caird coinheringaahing

1
Nie musisz tworzyć zmiennej t, ponieważ używasz jej tylko raz. Możesz po prostu zrobić "TAPETAPETAPETAPETAPETAPET".substring....
RM

Witamy w PPCG! Oprócz tego, co powiedział @RM , możesz zagrać w golfa jeszcze kilka rzeczy: int a=1,l=i.length;a<=l;a++może być int a=0,l=i.length;++a<=l;, char u=i[a-1];o+=u;if(a<l){char n=może być char u=i[a-1],n;o+=u;if(a<l){n=, (n-u)nie potrzebuje nawiasu i n-u-1może być n+~u. Ponadto twoja odpowiedź jest obecnie fragmentem zamiast funkcji. Aby była lambda, musisz dodać i->{z przodu i }na końcu. Łącznie: wypróbuj online. 153 bajty
Kevin Cruijssen

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.