Dort habe ich es behoben (mit Klebeband)


41

Herausforderung:

Wenn eine Zeichenfolge nur Groß- und / oder Kleinbuchstaben enthält (je nachdem, was Sie bevorzugen), platzieren Sie sie tapehorizontal, um sie zu reparieren. Dazu prüfen wir den Unterschied zweier benachbarter Buchstaben im Alphabet (ignorieren den Umbruch und gehen nur vorwärts) und füllen den Raum mit so viel TAPE/ tapewie wir benötigen.


Beispiel:

Eingabe: abcmnnnopstzra
Ausgabe:abcTAPETAPETmnnnopTAstTAPETzra

Warum?

  • Zwischen cund msollte sein defghijkl(Länge 9), also füllen wir dies mit TAPETAPET;
  • Zwischen pund ssollte sein qr(Länge 2), also füllen wir dies mit TA;
  • Zwischen tund zsollte sein uvwxy(Länge 5), also füllen wir dies mit TAPET.

Herausforderungsregeln:

  • Der Unterschied gilt nur vorwärts, also kein Band dazwischen zra.
  • Es ist möglich, mehrere gleiche benachbarte Buchstaben wie zu haben nnn.
  • Sie dürfen die Eingabe in einem angemessenen Format vornehmen. Kann ein einzelner String, ein String-Array / eine Liste, ein Zeichen-Array / eine Liste usw. sein. Die Ausgabe hat die gleiche Flexibilität.
  • Sie dürfen Klein- und / oder Großbuchstaben nach Belieben verwenden. Dies gilt sowohl für die Eingabe als auch für die Ausgabe und TAPE.
  • Möglicherweise ist keine TAPEEingabe erforderlich. In diesem Fall bleibt die Eingabe unverändert.

Allgemeine Regeln:

  • Das ist , also gewinnt die kürzeste Antwort in Bytes.
    Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden.
  • Für Ihre Antwort gelten Standardregeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methoden mit den richtigen Parametern und vollständige Programme vom Rückgabetyp verwenden. Ihr Anruf.
  • Standardlücken sind verboten.
  • Fügen Sie nach Möglichkeit einen Link zu einem Test für Ihren Code hinzu.
  • Fügen Sie ggf. auch eine Erklärung hinzu.

Testfälle:

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
Unsicher, warum wir einige zwischen den Reparaturen verwerfen würden (z. B. verwerfen wir APE nach dem Fixieren mit TAPETAPET und vor dem Fixieren mit TA), scheint mir eine Verschwendung von gutem TAPE zu sein, aber vielleicht rolle ich nur so (sorry).
Jonathan Allan

@ JonathanAllan Hehe, Sie haben in der Tat Recht, dass es eine Verschwendung von "Band" ist. Hmm, könnte etwas sein, das ich in Teil 2 der Herausforderung verwenden könnte . ;)
Kevin Cruijssen

Was ist, wenn der String mit Klebeband geliefert wird - z. B. abTAPEgh?
Manassehkatz

@manassehkatz Es würde wie jedes andere Zeichen interpretiert werden, also ab[TAPETAPETAPETAPET]TA[TAPETAPETAPETA]PE[T]gh(; fügte das hinzu [], um es lesbarer zu machen).
Kevin Cruijssen

1
@ KevinCruijssen Was aber konsistent ist (wie bei der Frage "Wasting Tape") nicht 100% logisch. Also vielleicht noch ein Testfall: TAPE eingeben, TATAPETAPETAPETAPE ausgeben (ich glaube, ich habe das richtig verstanden ...)
manassehkatz

Antworten:


8

05AB1E , 14 12 Bytes

'¡ÉIÇ¥<∍‚ζJJ

Probieren Sie es online!

Erläuterung

'¡É            # 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
Würde es Ihnen etwas ausmachen, eine Erklärung hinzuzufügen? Ich denke, es ist der Jelly-Antwort ziemlich ähnlich, aber ich bin gespannt, welche der Charaktere für welche der Operationen verwendet werden, um das Ergebnis zu erhalten. Eine der allgemeinen Regeln bei meinen Herausforderungen: " Fügen Sie bei Bedarf auch eine Erklärung hinzu. " Bei Sprachen wie Jelly, 05AB1E, Charcoal, APL usw. muss davon ausgegangen werden, dass die meisten Benutzer sie nicht lesen können und dass eine Erklärung obligatorisch ist . :)
Kevin Cruijssen

@ KevinCruijssen: Auf jeden Fall. Normalerweise füge ich meinen 05AB1E-Antworten eine Erklärung hinzu, aber ich habe nicht immer die richtige Zeit, wenn ich sie poste.
Emigna

1
@ KevinCruijssen in den Argumenten eines beliebigen 05AB1E TIO-Links, den Sie hinzufügen können -d, um den Operation-by-Operation-Dump des unformatierten Stacks dessen zu erhalten, was anstelle einer Erklärung vor sich geht von mir LOL.
Magic Octopus Urn

10

Jelly , 13 Bytes

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

Probieren Sie es online!

Erläuterung

OI '' ¡ʂƁ »ṁ $ € ż @ - Volles Programm. Nehmen Sie eine Zeichenfolge als Befehlszeilenargument.
O - Ordinal. Holen Sie sich die ASCII-Werte der einzelnen Zeichen.
 I '- Ermittle die Inkremente (Deltas) und subtrahiere 1 von jedem.
          € - Für jeden Unterschied, den ich ...
   “¡ꟅƁ» ṁ $ - Formen Sie den komprimierten String "tape" gemäß diesen Werten.
                Grundsätzlich "Band" auf die erforderliche Länge verlängern / verkürzen.
           ż @ - Interleave mit der Eingabe.

Hier ist ein Trick , um dich auf 12 zu bringen
Jonathan Allan

@ JonathanAllan Das scheint mir ungültig. Es gibt abctapetapetmnnnopapstetapezrastatt abctapetapetmnnnoptasttapetzra.
Mr. Xcoder

7
Oh ja, es ist ungültig - ich hatte nicht bemerkt, dass wir Band von der Rolle verschwenden sollten!
Jonathan Allan

7

Haskell , 58 Bytes

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

Probieren Sie es online! Die Funktion fwiederholt die Zeichenfolge und betrachtet aufeinanderfolgende Zeichen xund y. cycle"TAPE"ergibt die unendliche Zeichenfolge "TAPETAPETAPE...". [x..y]Ruft den Zeichenbereich von xbis yeinschließlich ab, so müssen wir zwei von der Länge subtrahieren. Im Fall xspäter im Alphabet erfolgt dann yoder beide das gleiche Zeichen, wir eine negative Zahl nach Abzug, aber glücklicherweise takediejenigen akzeptiert , wie gut und dauern nur nichts.


6

Perl 5 , -F46 Bytes

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

Probieren Sie es online!


2
Ich wollte gerade fragen, warum P,E,T,Aanstatt T,A,P,E, aber jetzt merke ich, dass Sie zwei Bytes ((P,E,T,A)x7)[2..-$^H+($^H=ord)anstelle von ((T,A,P,E)x7)[0..-$^H+($^H=ord)-2gespeichert haben. Gute Antwort!
Kevin Cruijssen

Tatsächlich sehr nett! Viel besser als mein naiive Ansatz! Sie können jedoch mit literal ^H( \x08) 2 Bytes sparen !
Dom Hastings

@DomHastings Literal-Steuerzeichenvariablen wurden bereits für viele Perl-Versionen deaktiviert. Ich könnte eine Punktzahl für eine ältere Perl-Version beanspruchen (wie ich es kürzlich getan habe do$0), aber es sind nur 2 Bytes hier, also habe ich mich nicht darum
gekümmert

Ah, natürlich! Das liegt daran, dass macOS standardmäßig 5.18.2 hat, also ist es die Version, mit der ich am vertrautesten bin!
Dom Hastings



4

C 84 Bytes

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

Probieren Sie es online!

C (auf Windows-Eingabeaufforderung ausführen), 81 Byte

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

Ausgabe:


4

Python 3 , 98 Bytes

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]

Probieren Sie es online!

-1 Byte danke an Asone Tuhid


@AsoneTuhid Danke. Ich würde empfehlen, Ihre eigene Antwort zu posten, da Sie ziemlich viel Golf gespielt haben und Sie auch TFelds Antwort auf die gleiche Sache Golf gespielt haben, sodass das Bearbeiten zu Dupes führen würde (was nicht verboten ist)
HyperNeutrino

Okay, haben ein -1 Byte
Asone Tuhid

@ AsoneTuhid oh okay, danke
HyperNeutrino

4

Scala , 66 Bytes

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

Probieren Sie es online!

Erläuterung

/: 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

Willkommen bei PPCG und schöne erste Antwort! +1 von mir.
Kevin Cruijssen

4

PHP , 85 Bytes

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

Probieren Sie es online!

Erläuterung

$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
Willkommen auf der Seite! :)
DJMcMayhem

3

Javascript, 131 127 Bytes

4 Bytes gespart dank Rick Hitchcock.

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

Abgerollt

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

Mein Problem hier ist, dass Javascript keine saubere Möglichkeit hatte, die Entfernung zwischen Zeichen a und b zu ermitteln.

<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
Nett. Sie können ein Byte speichern, indem Sie das nachstehende Semikolon entfernen, und ein paar weitere Bytes speichern, indem Sie charCodeAteiner Variablen 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

Vielen Dank! Ich bin absolut angewidert, wie das funktioniert, aber es ist gut zu wissen, dass es für die Zukunft funktioniert.
Jhal


2

Holzkohle , 20 Bytes

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

Probieren Sie es online! Erläuterung:

 θ              θ       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 Bytes

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

Nimmt Eingaben als Befehlszeilenargument (Klein- oder Großbuchstaben, egal). Probieren Sie es online!

Erläuterung

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 bis 78 Byte

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

Der Abstand zwischen zwei Zeichen kann bestimmt werden, indem ihre Verkettung in die Basis 36 umgewandelt wird, wobei der Modul 37 subtrahiert wird.

Zum Beispiel (parseInt('cy',36)-370)%37 == 22.

Wir können dann verwenden padEnd, um die Lücken zu füllen, und Rekursion, um die Schleife zu behandeln.

Testfälle:


2

K4 , 48 Bytes

Lösung:

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

Beispiele:

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"

Erläuterung:

Ziemlich einfache Lösung, aber hohe Byteanzahl ... Finde die Deltas, nimm sie aus der Zeichenkette "TAPE"und verbinde sie mit dem ursprünglichen Zeichenkettenschnitt, in dem die Deltas> 1 sind.

{,/_[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 Bytes

Eine anonyme VBE-Direktfensterfunktion, die Eingaben als Großbuchstaben über die Zelle A1akzeptiert und an das VBE-Direktfenster ausgibt.

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 Bytes

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

Probieren Sie es online!

Dies ist eigentlich ziemlich einfach - wir nehmen die Eingabe als Teilung unserer Zeichenfolge in eine Reihe von Zeichen (danke an Asone Tuhid für diesen Hinweis) und wenden eine Reduktionsoperation an, bei der wir jedes Zeichen mit "TAPE" als Füllzeichenfolge auf die erforderliche Länge begründen.


Die Frage besagt, dass Sie Eingaben als Array von Zeichen annehmen können. ( 53 Bytes )
Asone Tuhid

2

K (oK) , 33 Bytes

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

Probieren Sie es online!

{ } anonyme Funktion mit Argument x

-':x subtrahiere jeden vorherigen Punkt (benutze eine imaginäre 0 vor dem ersten Punkt)

1_ Lass den ersten Gegenstand fallen

0, stellen Sie eine 0 voran

-1+ addiere -1

0| max (0, ...)

(... )#\:"TAPE"gestalten Sie die Zeichenfolge "TAPE"für jedes Element aus der Liste auf der linken Seite neu

(... an jede umgeformte Zeichenkette ),'xdas entsprechende Zeichen von anhängenx

,/ verketten alle



2

Java (JDK) , 91 Byte

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

Probieren Sie es online!

Erläuterung

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
  );

Credits

  • -2 Bytes dank RM
  • -4 Bytes dank ceilingcat , durch Upgrade auf Java 10+ und Umstellung aufvar
  • -3 Bytes dank Kevin Cruijssen , indem ich das Ergebnis meiner (zuvor) alternativen Version drucke , anstatt es zurückzugeben

int p=123würde ein Zeichen speichern. Es spielt keine Rolle, was psich in der ersten Iteration befindet, solange es größer oder gleich dem ersten Zeichen ist. Der größte Wert, den das erste Zeichen haben kann, ist 'z'== ASCII 122, also ist 123 gut genug. Wenn Sie Großbuchstaben verwenden, können Sie auch 91 anstelle von 123 verwenden und ein anderes Zeichen speichern.
RM

@RM Danke, das funktioniert tatsächlich!
Olivier Grégoire

1
-3 Bytes, indem Sie direkt in Ihrer alternativen Methode drucken .
Kevin Cruijssen

1

C # (.NET Core) , 122 111 Bytes

11 Bytes dank @KevinCruijssen gespeichert

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;}

Probieren Sie es online!

Erläuterung:

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
Schöne Antwort, +1 von mir. Sie können 4 Bytes speichern , indem der Wechsel whileauf ein forund das Entfernen der Klammern: 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]);. :) Oh, und da Sie verwenden t="ETAP"nur einmal, können Sie es direkt verwenden und ändern stringzu var7 weitere Bytes zu speichern: 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: Danke, ich hätte nicht darüber nachgedacht, die Klammern loszuwerden, indem ich das Zeug in die for-Schleife verschoben hätte. Auch wenn ich mich für vermisst dumm fühle, kann ich "ETAP" direkt verwenden.
Raznagul

Ihre Antwort ist immer noch großartig, machen Sie sich also keine Sorgen. :) Ich bekomme fast jedes Mal Golf-Tipps, wenn ich selbst eine Antwort poste. Und es ist auch einfacher, eine vorhandene Antwort weiter zu golfen, als sie von Anfang an komplett zu golfen. PS: Sie haben sie vielleicht schon gesehen, aber Tipps zum Code-Golfen in C # und Tipps zum Golfen in <allen Sprachen> könnten interessant sein, wenn Sie sie noch nicht gelesen haben.
Kevin Cruijssen

1

Yabasic , 119 Bytes

Eine anonyme Funktion, die Eingaben als Großbuchstaben akzeptiert und an STDOUT ausgibt.

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

Probieren Sie es online!



1

Clojure, 139 119 Bytes

#(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 %))

Anonyme Funktion, die die Zeichenfolge übernimmt und die aufgezeichnete zurückgibt. Wie immer scheint Clojure nicht allzu gut zu funktionieren. Was ich nicht wirklich herausfinden konnte, ist das Abrufen des nächsten Charakters auf kurze Weise. Beim letzten Mal würde mir ein OutOfBoundsExceptionGrund klar werden. Also habe ich es umgangen cycle. Vielleicht gibt es eine elegantere Lösung.

Ungolfed

#(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 %))

Aktualisieren

Es ist gelungen, ein paar Bytes abzuschirmen. Befreie dich von der lästigen ifAussage, indem du die Differenz dekrementierst. takeErzeugt eine leere Liste, wenn die Zahl 0 oder weniger ist, was wiederum zu einer leeren Zeichenfolge führt.

#(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 %))

Ungolfed

#(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 Byte

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

Probieren Sie es online!

{ } anonyme Funktion mit Argument

⎕a⍳⍵ finden Sie Indizes seiner Zeichen im Alphabet

2-/ paarweise Unterschiede (prev minus next)

1+ addiere 1

- negieren

0⌈ max (0, ...)

0, stellen Sie eine 0 voran

⍴∘'TAPE'¨umformen zyklisch die Zeichenfolge 'TAPE'zu jedem

⍵,¨⍨ Hängen Sie jedes Zeichen vom Argument an die entsprechende umgeformte Zeichenfolge an

ebnen


1

CJam , 27 25 Bytes

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

Probieren Sie es online!

Weit, weit weg von den anderen Golfsprachen, aber ich bin trotzdem stolz auf dieses Golf.

Erläuterung

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 Bytes

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;}

versuche es 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;

Bitte hilf mir, es besser zu machen.

Vielen Dank an @cairdcoinheringaahing für den Tipp zu Leerzeichen. Danke an @RM für den Tipp auf Tape String. Vielen Dank an @KevinCruijssen für die Tipps zu Lambda und Ausdrücken.


1
Willkommen auf der Seite! Sie können viel Leerzeichen entfernen, um diese Antwort zu golfen, und Sie sollten diese Tipps zum Golfen in Java lesen !
Caird Coinheringaahing

1
Sie müssen die Variable t nicht erstellen, da Sie sie nur einmal verwenden. Sie können es einfach tun "TAPETAPETAPETAPETAPETAPET".substring....
RM

Willkommen bei PPCG! Zusätzlich zu dem, was @RM gesagt hat, können Sie noch ein paar weitere Dinge tun : int a=1,l=i.length;a<=l;a++Kann sein int a=0,l=i.length;++a<=l;, char u=i[a-1];o+=u;if(a<l){char n=kann sein char u=i[a-1],n;o+=u;if(a<l){n=, (n-u)braucht keine Klammer und n-u-1kann sein n+~u. Außerdem ist Ihre Antwort derzeit ein Ausschnitt anstelle einer Funktion. Um es zu einem Lambda zu machen, müssen Sie i->{vorne und }am Ende hinzufügen . Also insgesamt: Online ausprobieren. 153 Bytes
Kevin Cruijssen

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.