Lass uns ein bisschen "enciph5r47g" machen


35

Dies ist die Umkehrung von Let's do some "deciph4r4ng"


In dieser Herausforderung besteht Ihre Aufgabe darin, eine Zeichenfolge zu verschlüsseln. Glücklicherweise ist der Algorithmus ziemlich einfach: Beim Lesen von links nach rechts muss jedes typische Schreibzeichen (ASCII-Bereich 32-126) durch eine Zahl N (0-9) ersetzt werden, um anzuzeigen, dass es mit dem Zeichen N + 1 identisch ist Positionen davor. Die Ausnahme ist, wenn das Zeichen in der ursprünglichen Zeichenfolge nicht an den letzten 10 Stellen vorkommt. In diesem Fall sollten Sie das Zeichen einfach erneut drucken. Tatsächlich sollten Sie in der Lage sein, den Vorgang von der ursprünglichen Herausforderung umzukehren.

Beispiel

Die Eingabezeichenfolge "Programming"würde folgendermaßen codiert:

Beispiel 1

Daher ist die erwartete Ausgabe "Prog2am0in6".

Erläuterungen und Regeln

  • Die Eingabezeichenfolge enthält ausschließlich ASCII-Zeichen im Bereich von 32 bis 126. Sie können davon ausgehen, dass es niemals leer sein wird.
  • Die ursprüngliche Zeichenfolge enthält garantiert keine Ziffer.
  • Sobald ein Zeichen codiert wurde, kann es wiederum durch eine nachfolgende Ziffer referenziert werden. Zum Beispiel "alpaca"sollte als codiert werden "alp2c1".
  • Referenzen werden niemals um die Zeichenfolge gewickelt: Es kann nur auf vorherige Zeichen verwiesen werden.
  • Sie können entweder ein vollständiges Programm oder eine Funktion schreiben, die das Ergebnis entweder druckt oder ausgibt.
  • Dies ist Codegolf, daher gewinnt die kürzeste Antwort in Bytes.
  • Standardlücken sind verboten.

Testfälle

Input : abcd
Output: abcd

Input : aaaa
Output: a000

Input : banana
Output: ban111

Input : Hello World!
Output: Hel0o W2r5d!

Input : this is a test
Output: this 222a19e52

Input : golfing is good for you
Output: golfin5 3s24o0d4f3r3y3u

Input : Programming Puzzles & Code Golf
Output: Prog2am0in6 Puz0les7&1Cod74G4lf

Input : Replicants are like any other machine. They're either a benefit or a hazard.
Output: Replicants 4re3lik448ny3oth8r5mac6in8.8T64y'r371it9376a1b5n1fit7or2a1h2z17d.

6
Ich sehe, dass Ihre Testfälle für jede Substitution immer die niedrigste mögliche Ziffer verwenden. Ist dies ein erforderliches Verhalten, oder können wir auch höhere Ziffern verwenden, wenn es mehr als eine Möglichkeit gibt?
Leo

@Leo Sie können eine beliebige Ziffer von 0 bis 9 verwenden, solange diese gültig ist.
Ingenieur Toast

Das ist wie ein Move-to-Front - Encoder, mit der Ausnahme , ohne die Bewegungs :)
Rohr

Antworten:


6

05AB1E , 20 19 18 Bytes

-2 Danke an Emigna

õ¹vDyåiDykëy}?yìT£

Probieren Sie es online!

õ                  # Push an empty string
 ¹v y              # For each character in input
   D               # Duplicate the string on the stack (call this S)
     åi            # If this character is in S
       Dyk         #   Push the index of that that character 
          ë }      # Else
           y       #   Push the character 
             ?     # Print without newline
              yì   # Prepend this character to S
                T£ # Remove all but the first 10 elements from S

Ich denke )¹vDyåiDykëy}?y¸ìT£funktioniert auch.
Emigna

õIvDyåiDykëy}?yìT£
Wenn Sie

@Emigna Fühlen Sie sich frei, Ihre mit dem zu aktualisieren :)
Riley

Ich hätte nicht daran gedacht, wenn Sie nicht geantwortet hätten, also sollten Sie es haben. Gut gemacht!
Emigna

@Emigna Ich denke, das ist fair. Vielen Dank!
Riley

12

Retina , 24 23 Bytes

(.)(?<=\1(.{0,9}).)
$.2

Probieren Sie es online!

Eine ziemlich einfache Regex-Substitution. Wir passen jedes Zeichen an und versuchen, eine Kopie von 0-9 Zeichen davor zu finden. Wenn wir es finden, ersetzen wir das Zeichen durch die Anzahl der Zeichen, die wir abgleichen mussten, um zur Kopie zu gelangen.

Die Ergebnisse stimmen nicht ganz mit den Testfällen überein, da diese die größtmögliche Stelle anstelle der kleinstmöglichen Stelle verwenden.


4
Der Look-Behind mit variabler Länge betrügt: p
Dada,

8
@Dada Lookbehind mit variabler Länge ist der Weg der Erleuchtung.
Martin Ender

Leider ist es so ... Wenn Sie gelangweilt sind, können Sie diese in Perl implementieren!
Dada

Wie pro OP Kommentar auf die ursprüngliche Aufgabe „können Sie jede einzelne Ziffer Sie 0-9 wollen verwenden, solange sie gültig ist.“ ... so sollte eine möglichst große gültig
Doktor J

@DoktorJ ja, ich habe es geändert, nachdem das OP diese Klarstellung hinzugefügt hat.
Martin Ender

8

JavaScript (ES6), 74 57 54 Byte

3 Bytes gespart dank ETHproductions mit dem Brillanten p=/./gstatt p={}(inspiriert von Neil)

s=>s.replace(p=/./g,(c,i)=>(i=p[c]-(p[c]=i))>-11?~i:c)

Testfälle


Da die Zeichenfolge garantiert keine Ziffer enthält, können Sie sstattdessen verwenden p?
Neil

(Ich war in der Lage, Ihre ursprüngliche findVersion mit zu übertreiben lastIndexOf, was etwas überraschend ist, da sie 11 Buchstaben lang ist ....)
Neil

@Neil Ich bin gerade nicht vor einem Computer, aber ich glaube nicht, dass das funktionieren würde, da JS-Strings unveränderlich sind.
Arnauld

2
Ich kann bestätigen, dass das Festlegen von Eigenschaften für Zeichenfolgenliterale nicht funktioniert. Aber ... es sieht so aus, als würde es mit Regex funktionieren, also könnte man möglicherweise s=>s.replace(p=/./g,(c,i)=>(i=p[c]-(p[c]=i))>-10?~i:c)3 Bytes einsparen.
ETHproductions

1
@YOU Ich weiß nicht wirklich, was hier passiert ist, aber es stellte sich heraus, dass ich bei meiner letzten Bearbeitung einen Fehler für alle Browser eingeführt habe. Dies ist jetzt behoben. Danke fürs bemerken!
Arnauld

7

Haskell , 72 66 Bytes

Danke an Laikoni für das Golfen mit 6 Bytes!

(a:r)%s=last(a:[n|(n,b)<-zip['0'..'9']s,b==a]):r%(a:s)
e%s=e
(%"")

Probieren Sie es online!

Die Funktion %hält die teilweise verarbeitete Zeichenfolge in ihrem zweiten Argument umgekehrt, sodass sie die ersten 10 Elemente dieser Zeichenfolge nach Vorkommen des zu untersuchenden Zeichens durchsuchen kann. Die Übermittlung besteht aus der unbenannten Funktion, (%"")die die vorherige Funktion mit der leeren Zeichenfolge als zweitem Argument aufruft.


f(a:s)=f s++(last$[a]:[show n|(n,b)<-zip[0..9]s,b==a])spart zwei Bytes.
Laikoni

Warten Sie, f(a:s)=f s++[last$a:[n|(n,b)<-zip['0'..'9']s,b==a]]spart noch mehr.
Laikoni

Wenn Sie unterwegs rückgängig machen anstatt zu verwenden, reversesparen Sie ein weiteres Byte: Probieren Sie es online aus!
Laikoni

@Laikoni Danke, das ist wunderbar!
Leo


3

Perl 5 , 36 Bytes

35 Byte Code + -pFlag.

s/(\D)(.{0,9})\K\1/length$2/e&&redo

Probieren Sie es online!

Einige Erklärungen:
Das Ziel ist es, ein nicht-stelliges Zeichen ( \Daber es entspricht der Rückreferenz \1in meinem Regex) zu ersetzen , dem weniger als 10 Zeichen ( .{0,9}) und dasselbe Zeichen ( (\D)... \1) die Länge der .{0,9}Gruppe vorausgehen ( length$2). Und redowährend Charaktere ersetzt werden.


Anscheinend .*ist das nicht erforderlich, ein gültiges Zeichen im Bereich vor der ersetzten Ziffer ist in Ordnung.
Colsw

@ConnorLSW Yup, ich habe gerade dieses Update der Herausforderung gesehen und meine Antwort geändert, danke, dass Sie darauf hingewiesen haben.
Dada

3

Python 2, 89 84 Bytes

m=input()[::-1];j=1;t=''
for i in m:s=m[j:].find(i);t=[i,`s`][0<s<10]+t;j+=1
print t

Probieren Sie es online!

Durchläuft die Zeichenfolge in umgekehrter Reihenfolge und erstellt eine neue Zeichenfolge mit den richtigen eingefügten Zahlen.


3

Japt , 18 Bytes

£¯Y w bX s r"..+"X

Probieren Sie es online!

Erläuterung

£   ¯  Y w bX s r"..+"X
mXY{s0,Y w bX s r"..+"X}
                          // Implicit: U = input string
mXY{                   }  // Replace each char X and index Y in U by this function:
    s0,Y                  //   Take U.slice(0,Y), the part of U before this char.
         w bX             //   Reverse, and find the first index of X in the result.
                          //   This gives how far back this char last appeared, -1 if never.
              s           //   Convert the result to a string.
                r"..+"X   //   Replace all matches of /..+/ in the result with X.
                          //   If the index is -1 or greater than 9, this will revert to X.
                          // Implicit: output result of last expression


2

05AB1E , 20 Bytes

õIv¹N£RT£©yåi®ykëy}J

Probieren Sie es online!

Erläuterung

õ                     # push an empty string
 Iv                   # for each [index,char] [N,y] in input
   ¹N£                # push the first N characters of input
      R               # reverse
       T£             # take the first 10 characters of this string
         ©            # save a copy in register
          yåi         # if y is in this string
             ®yk      #   push the index of y in the string in register
                ë     # else 
                 y    #   push y
                  }   # end if
                   J  # join stack as one string


2

C (tcc) 113 Bytes

Da die Funktion eine Kopie einer Eingabezeichenfolge erstellt, beträgt die maximale Größe der Eingabe 98 Zeichen (mehr als ausreichend für die längste Testeingabe). Dies kann natürlich auf jeden anderen Wert geändert werden.

i,j;f(char*s){char n[99];strcpy(n,s);for(i=1;s[i];i++)for(j=i-1;j>-1&&i-j<11;j--)if(n[i]==n[j])s[i]=47+i-j;j=-1;}

Probieren Sie es online!

Bearbeiten

-15 Bytes. Vielen Dank Johan du Toit .


Agh! Begrenzen Sie die Eingabe auf 98 Zeichen und sparen Sie sich ein Byte!
Pipe

Schöne Lösung, aber Sie können weitere 15 Bytes speichern: i,j;f(char*s){char n[99];strcpy(n,s);for(i=1;s[i];i++)for(j=i-1;j>-1&&i-j<11;j--)if(n[i]==n[j])s[i]=47+i-j,j=-1;}
Johan du Toit

@JohanduToit Danke! Ich habe eine Frage. Wie genau funktioniert s [i] als Bedingung für die for-Schleife? Ich habe es oft in den Antworten anderer Leute auf dieser Website gesehen.
Maxim Mikhaylov

@ Max Lawnboy. Sie hatten ursprünglich Folgendes: 's [i] ^' \ 0 '', was die Abkürzung für 's [i]! =' \ 0 '' ist. Das Zeichenliteral '\ 0' ist gleich Null, sodass Sie es folgendermaßen schreiben können: 's [i]! = 0'. Die if-Anweisung in C prüft nur, ob der Wert null oder ungleich null ist, sodass '! = 0' nicht erforderlich ist.
Johan du Toit


2

Java 7, 102 101 Bytes

void a(char[]a){for(int b=a.length,c;--b>0;)for(c=b;c-->0&c+11>b;)if(a[c]==a[b])a[b]=(char)(b-c+47);}

Probieren Sie es online!

-1 Byte dank Kevin Cruijssen . Ich genieße immer eine Ausrede, um den Go-to-Operator zu verwenden.


Warum das --c>=0? Sie können es durch ersetzen c-->0, um ein Byte zu speichern.
Kevin Cruijssen

@KevinCruijssen Irgendwie hatte ich es im Kopf, dass ich vordekrementieren musste, sonst wäre die eigentliche Berechnung falsch ... Netter Fang!
Poke

1

MATL, 31 30 Bytes

&=R"X@@f-t10<)l_)t?qV}xGX@)]&h

Probieren Sie es bei MATL Online!

Erläuterung

        % Implicitly grab input as a string
&=      % Perform element-wise comparison with automatic broadcasting.
R       % Take the upper-triangular part of the matrix and set everything else to zero
"       % For each column in this matrix
X@      % Push the index of the row to the stack
@f      % Find the indices of the 1's in the row. The indices are always sorted in
        % increasing order
-       % Subtract the index of the row. This result in an array that is [..., 0] where
        % there is always a 0 because each letter is equal to itself and then the ...
        % indicates the index distances to the same letters
t10<)   % Discard the index differences that are > 9
l_)     % Grab the next to last index which is going to be the smallest value. If the index
        % array only contains [0], then modular indexing will grab that zero
t?      % See if this is non-zero...
  qV    % Subtract 1 and convert to a string
}       % If there were no previous matching values
  x     % Delete the item from the stack
  GX@)  % Push the current character
]       % End of if statement
&h      % Horizontally concatenate the entire stack
        % Implicit end of for loop and implicit display

Du bist vielleicht ein bisschen daneben, aber ich kann super nicht sagen, wo. Die Eingabe this is a testergibt this 222a1te52statt this 222a19e52. Die Sekunde twird nicht in konvertiert 9.
Ingenieur Toast

@EngineerToast Haha danke. Ich werde einen Blick darauf werfen.
Suever

1

PHP, 104 Bytes

vorwärts Lösung

for($i=0;$i<strlen($a=&$argn);$f[$l]=$i++)$a[$i]=is_int($f[$l=$a[$i]])&($c=$i-$f[$l]-1)<10?$c:$l;echo$a;

Rückwärts Lösungen

Online-Versionen

PHP, 111 Bytes

for(;++$i<$l=strlen($a=&$argn);)!is_int($t=strrpos($argn,$a[-$i],-$i-1))?:($p=$l-$i-$t-1)>9?:$a[-$i]=$p;echo$a;

PHP, 112 Bytes

for(;++$i<$l=strlen($a=&$argn);)if(false!==$t=strrpos($argn,$a[-$i],-$i-1))($p=$l-$i-$t-1)>9?:$a[-$i]=$p;echo$a;

Online Version


1

REXX, 124 125 Bytes

a=arg(1)
b=a
do n=1 to length(a)
  m=n-1
  c=substr(a,n,1)
  s=lastpos(c,left(a,m))
  if s>0&m-s<=9 then b=overlay(m-s,b,n)
  end
say b

Du könntest ein bisschen daneben sein. Ich kenne REXX nicht, aber ich gehe davon aus, dass sich der Fehler in Zeile 7 befindet, in der er s<9anstelle von s<10oder steht s<=9. Die Eingabe this is a testergibt this 222a1te52statt this 222a19e52. Die Sekunde twird nicht in konvertiert 9. Versuchen Sie es online
Engineer Toast

Vielen Dank, es war ein blöder Versuch, ein Byte zu entfernen. Der Code wurde behoben.
Idrougge

1

C (GCC) , 117 103 Bytes

i,j;f(char*s){for(i=strlen(s)-1;s[i];i--)for(j=i-1;s[j]&&i-j<11;j--)if(s[i]==s[j]){s[i]=47+i-j;break;}}

Probieren Sie es online!

103 Bytes ohne string.h-Import, funktioniert mit Warnung. Wenn dies gegen die Regeln verstößt, werde ich es ziehen

Hübscher Code:

i,j;
f(char *s) {
    // Chomp backwards down the string
    for(i=strlen(s)-1; s[i]; i--)
        // for every char, try to match the previous 10
        for(j=i-1; s[j] && i-j < 11; j--)
            // If there's a match, encode it ('0' + (i-j))
            if (s[i] == s[j]) {
                s[i] = 47+i-j;
                break;
            }
}

Bearbeitungen:

  • Geändert von LLVM zu gcc, um implizite i, j-Deklaration zu ermöglichen, lib-Import wurde entfernt.
  • Funktions-Wrapper zur Einhaltung hinzugefügt

Schlagen Sie (i=strlen(s);s[--i];)stattdessen vor(i=strlen(s)-1;s[i];i--)
ceilingcat
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.