Munge mein Passwort

17

Allgemeine Wörter sollten dennoch vermieden werden, um als Passwörter verwendet zu werden. Diese Herausforderung ist dabei , ein sehr einfaches Programm Codierung , dass munges ein bestimmtes Passwort ( M odify U ntil N ot G uessed E asily).

Eingang

Ein Wort, das eine im Alphabet geschriebene Zeichenfolge ist abcdefghijklmnopqrstuvwxyz. Es spielt keine Rolle, ob die Buchstaben in Klein- oder Großbuchstaben geschrieben sind.

Munging

  1. Ändern jede wiederholte Sequenz eines gleichen Brief an sich selbst durch die Anzahl , wie oft der Buchstabe wurde wiederholt ( LLLLmit 4L)
  2. Ändern Sie den ersten amit@
  3. Ändern Sie den ersten bmit8
  4. Ändern Sie den ersten cmit(
  5. Ändern Sie den ersten dmit6
  6. Ändern Sie den ersten emit3
  7. Ändern Sie den ersten fmit#
  8. Ändern Sie den ersten gmit9
  9. Ändern Sie den ersten hmit#
  10. Ändern Sie den ersten imit1
  11. Ändern Sie die Sekunde imit!
  12. Ändern Sie den ersten kmit<
  13. Ändern Sie den ersten lmit1
  14. Ändern Sie die Sekunde lmiti
  15. Ändern Sie den ersten omit0
  16. Ändern Sie den ersten qmit9
  17. Ändern Sie den ersten smit5
  18. Ändern Sie die Sekunde smit$
  19. Ändern Sie den ersten tmit+
  20. Ändern Sie den ersten vmit>
  21. Ändern Sie die Sekunde vmit<
  22. Ändern Sie den ersten wmituu
  23. Ändern Sie die Sekunde wmit2u
  24. Ändern Sie den ersten xmit%
  25. Ändern Sie den ersten ymit?

Regel 1 muss so oft angewendet werden, bis eine weitere Anwendung nicht mehr möglich ist. Danach werden die restlichen Regeln angewendet.

Ausgabe Das gemungte Wort

Beispiele

  • codegolf -> (0639o1#
  • programming -> pr09r@2m1ng
  • puzzles -> pu2z135
  • passwords -> p@25uu0r6$
  • wwww -> 4uu
  • aaaaaaaaaaa -> 11a
  • lllolllolll -> 3103io3l
  • jjjmjjjj -> 3jm4j

Dies ist , also machen Sie bitte Ihr Programm so kurz wie möglich!

Nichts in diesem Beitrag sollte als Passwortidee oder als Teil der Passwortpraxis verwendet werden.

mdahmoune
quelle
18
Die Tatsache, dass solche Programme möglich sind, bedeutet, dass der Angreifer sie genauso einfach schreiben und das Passwort munge (und die verschiedenen Munges ausprobieren) könnte (noch einfacher, weil sie oft Zugang zu besserer Hardware haben). Aus Sicherheitsgründen sage ich also: Nichts in diesem Beitrag sollte als Passwortvorschlag oder als Teil der Passwortpraxis verwendet werden.
NH.
1
Ich empfehle, diesen Haftungsausschluss fett zu machen und oben zu duplizieren. Man kann niemals vorsichtig
genug sein

Antworten:

11

Java 8, 237 321 319 280 247 241 240 237 Bytes

s->{for(int a[]=new int[26],i=0,l=s.length,t,x;i<l;i+=t){for(t=0;++t+i<l&&s[i]==s[t+i];);System.out.print((t>1?t+"":"")+(++a[x=s[i]-65]>2?s[i]:"@8(63#9#1J<1MN0P9R5+U>u%?ZABCDEFGH!JKiMNOPQR$TU<2XYZ".charAt(x+26*~-a[x])+(x==22?"u":"")));}}

+84 Bytes, weil die Regeln geändert wurden. ( BEARBEITEN: Endlich zurück zu meinen ursprünglichen 237 Bytes. ) Das Ersetzen WWWWmit 222Wist in Java einfach, aber 4Wnicht. Wenn Java nur die Möglichkeit hätte, die Regex-Erfassungsgruppe für etwas zu verwenden. Englisch: www.mjfriendship.de/en/index.php?op...=view&id=167 Die Länge mit "$1".length(), das Ersetzen der Übereinstimmung selbst durch "$1".replace(...), das Umwandeln der Übereinstimmung in eine Ganzzahl mit new Integer("$1")oder die Verwendung von etwas Ähnlichem wie Retina (dh s.replaceAll("(?=(.)\\1)(\\1)+","$#2$1")) oder JavaScript (dh s.replaceAll("(.)\\1+",m->m.length()+m.charAt(0))) wäre meine Nummer 1, die ich in Java sehen möchte Ich denke, dies ist das zehnte Mal, dass ich es hasse, dass Java mit dem Capture-Group-Match nichts anfangen kann .
-78 Bytes dank @ OlivierGrégoire .

I / O wird in Großbuchstaben geschrieben.

Erläuterung:

Probieren Sie es hier aus.

s->{                           // Method with String parameter and no return-type
  for(int a[]=new int[26],     //  Array with 26x 0
          i=0,                 //  Index-integer, starting at 0
          l=s.length,          //  Length
          t,x;                 //  Temp integers
      i<l;                     //  Loop (1) over the characters of the input
      i+=t){                   //    After every iteration: Increase `i` by `t`
    for(t=0;++                 //   Reset `t` to 1
        t+i<l                  //   Inner loop (2) from `t+i` to `l` (exclusive)
        &&s[i]==s[t+i];        //   as long as the `i`'th and `t+i`'th characters are equal
    );                         //   End of inner loop (2)
    System.out.print(          //   Print:
     (t>1?t+"":"")             //    If `t` is larger than 1: print `t`
     +(++a[x=s[i]-65]>2?       //    +If the current character occurs for the third time:
       s[i]                    //      Simply print the character
      :                        //     Else:
       "@8(63#9#1J<1MN0P9R5+U>u%?ZABCDEFGH!JKiMNOPQR$TU<2XYZ".charAt(x
                               //      Print the converted character at position `x`
        +26*~-a[x])            //       + 26 if it's the second time occurring
       +(x==22?"u":"")));      //      And also print an additional "u" if it's 'W'
  }                            //  End of loop (1)
}                              // End of method
Kevin Cruijssen
quelle
10

JavaScript (ES6), 147 Byte

s=>[[/(.)\1+/g,m=>m.length+m[0]],..."a@b8c(d6e3f#g9h#i1k<l1o0q9s5t+v>x%y?i!lis$v<".match(/../g),["w","uu"],["w","2u"]].map(r=>s=s.replace(...r))&&s

Testfälle

Erläuterung

Durchläuft eine Reihe von Ersetzungen für die Eingabezeichenfolge sin der von der Abfrage angegebenen Reihenfolge. Jedes Element in der Serie ist ein Array oder eine Zeichenfolge mit zwei Elementen, die dann verteilt ( ...r) und an übergeben werden s.replace().

s=>[
    [/(.)\1+/g, m=>m.length + m[0]],// first replacement: transform repeated letters
                                    // into run-length encoding

                                    // string split into length-2 partitions and
                                    // spread into the main array
    ..."a@b8c(d6e3f#g9h#i1k<l1o0q9s5t+v>x%y?i!lis$v<".match(/../g),
                                    // next replacements: all single-char replacements.
                                    // "second" versions are placed at the end so they
                                    //    replace the second instance of that char

    ["w","uu"],["w","2u"]           // last replacements: the two "w" replacements
]
.map(r=> s = s.replace(...r))       // run all replacements, updating s as we go
&& s                                // and return the final string
Justin Mariner
quelle
Sehr gute Antwort
mdahmoune
6

05AB1E , 69 Bytes

-9 Bytes dank Emigna

γvygD≠×yÙ}J.•k®zĀÒĀ+ÎÍ=ëµι
•"@8(63#9#1<1095+>%?!i$<"ø'w„uu„2u‚â«vy`.;

Probieren Sie es online!

Okx
quelle
Sie könnten verwenden'w„uu„2u‚â
Emigna
Könnten Sie bitte das Ergebnis für wwww als Eingabe überprüfen?
Mdahmoune
@ mdahmoune Es gibt4uu
Okx
@ Emigna kartesisches Produkt, gute Idee.
Okx
Erster Teil kann seinγvygD≠×yÙ}J
Emigna
6

Perl 5 , 152 + 1 ( -p) = 153 Bytes

s/(.)\1+/(length$&).$1/ge;%k='a@b8c(d6e3f#g9h#i1j!k<l1mio0q9r5s$t+u>v<x%y?'=~/./g;for$i(sort keys%k){$r=$k{$i};$i=~y/jmru/ilsv/;s/$i/$r/}s/w/uu/;s/w/2u/

Probieren Sie es online!

Xcali
quelle
PLZ, was meinst du mit (-p)?
mdahmoune
1
@mdahmoune -pwird als Argument für perldie Befehlszeile verwendet , die automatisch Eingaben von STDINund printden Inhalt von $_am Ende des Skripts liest . TIO erlaubt diese Option und da perl -pe<code>ist 1 Byte mehr als perl -e<code>es als ein zusätzliches Byte gezählt wird.
Dom Hastings
Ich denke, Sie haben einen Tippfehler gemacht, sollte das nicht stattdessen ein ~Dazwischen j~ksein !? Derzeit ersetzt es das zweite Vorkommen von idurch a ~anstelle von a !.
Kevin Cruijssen
@Xcali #testingonproduction
NieDzejkob
2
@NieDzejkob Es gibt keinen besseren Ort. Nur so können Sie sicher sein, dass es in der Produktion funktioniert.
Xcali
4

Wahrscheinlich nicht das am meisten Golf spielende, aber es funktioniert.

-6 bytes dank ovs

-77 Bytes dank NieDzejkob und Jonathan French

Python 3 , 329 323 Bytes 246 Bytes

import re;n=input()
for a in re.finditer('(\w)\\1+',n):b=a.group();n=n.replace(b,str(len(b))+b[0],1)
for A,B,C in[('abcdefghikloqstvxyw','@8(63#9#1<1095+>%?','uu'),('ilsvw','!i$<','2u')]:
	for a,b in zip(A,list(B)+[C]):n=n.replace(a,b,1)
print(n)

Probieren Sie es online!

reffu
quelle
1
Ich denke, Sie können fallen.lower()
mdahmoune
Das macht Sinn, ich war mir nicht sicher, ob ich mit Großbuchstaben umgehen musste oder nicht.
Reffu
321 Bytes .
Jonathan Frech
1
320 Bytes .
Jonathan Frech
2
Eigentlich funktioniert Ihre Antwort nicht. jjjmjjjjsollte 3jm4jaber ausgeben 3jm3jj. Edit: 258 Bytes mit diesem Problem behoben
NieDzejkob
3

Netzhaut , 166 124 Bytes

(.)\1+
$.&$1
([a-y])(?<!\1.+)
¶$&
¶w
uu
T`l¶`@8(63#9#1j<\1mn0\p9r5+u>\w%?_`¶.
([ilsvw])(?<!\1.+)
¶$&
¶w
2u
T`i\lsv¶`!i$<_`¶.

Probieren Sie es online! Erläuterung:

(.)\1+
$.&$1

Ersetzen Sie eine Folge von wiederholten Buchstaben durch die Länge und den Buchstaben.

([a-y])(?<!\1.+)
¶$&

Ordnen Sie das erste Vorkommen der Buchstaben azu yund markieren Sie sie mit einem Platzhalter.

¶w
uu

Korrigieren Sie das erste Vorkommen von w.

T`l¶`@8(63#9#1j<\1mn0\p9r5+u>\w%?_`¶.

Korrigieren Sie das erste Vorkommen aller anderen Buchstaben von abis yund löschen Sie die Platzhalter.

([ilsvw])(?<!\1.+)
¶$&

Markiert das (ursprünglich) zweite Auftreten der Buchstaben i, l, s, v, oder wmit einem Platzhalter.

¶w
2u

Korrigieren Sie das zweite Vorkommen von w.

T`i\lsv¶`!i$<_`¶.

Korrigieren Sie das zweite Vorkommen der anderen vier Buchstaben.

Neil
quelle
Glauben Sie, dass es möglich ist, weiter Golf zu spielen?
mdahmoune
@mdahmoune Ja, ich denke, ich kann 33 Bytes sparen.
Neil
Ich habe deine Antwort
hochgestimmt
@ mdahmoune Gute Nachricht, ich habe tatsächlich 42 Bytes gespart!
Neil
Großartig, dein Code ist der zweitkürzeste;)
mdahmoune
3

Haskell , 221 218 213 Bytes

($(f<$>words"w2u li i! s$ v< a@ b8 c( d6 e3 f# g9 h# i1 k< l1 o0 q9 s5 t+ v> wuu x% y?")++[r]).foldr($)
f(a:b)(h:t)|a==h=b++t|1>0=h:f(a:b)t
f _ s=s
r(a:b)|(p,q)<-span(==a)b=[c|c<-show$1+length p,p>[]]++a:r q
r s=s

Probieren Sie es online!

Missbrauch foldr Ausführung der Zeichenfolge durch eine Folge von Zeichenfolgentransformationen in Reihenfolge. Die Sequenz "beginnt" mit rder die Wiederholungszählung ersetzt wird, indem spander Schwanz der Zeichenkette gebrochen wird, wenn er nicht mehr gleich dem Kopf ist. Wenn der erste Teil davon nicht leer ist, ist es eine Wiederholung, also geben wir die Länge +1 aus. Als nächstes curry wir ein Argument ffür jede Zeichenersetzung in (umgekehrter) Reihenfolge. Die Ersetzungen werden als einzelne Zeichenfolge codiert, wobei das erste Zeichen das zu ersetzende Zeichen ist und der Rest als Zeichenfolge (da die Ersetzungen aus mehreren Zeichen bestehen) an seine Stelle tritt. Ich habe diese codierten Zeichenfolgen in eine große Zeichenfolge eingefügt, die durch Leerzeichen getrennt ist, damit wordsich sie in eine Liste aufteilen kann.

EDIT: Danke @Laikoni, dass du mir 5 Bytes gespart hast! Das war eine kluge Verwendung, an die $ich nicht gedacht habe. Diesen <-Trick kannte ich auch nicht .

user1472751
quelle
Danke für die ausführliche Erklärung;)
mdahmoune
1
Sie können (p,q)<-span(==a)banstelle von let(p,q)=span(==a)bund p>[] anstelle von verwendenp/=[] .
Laikoni
2
Sparen Sie zwei weitere Bytes, indem Sie mpointfree machen: ($(f<$>words"w2u ... y?")++[r]).foldr($) Probieren Sie es online aus!
Laikoni
2

Lua , 173 Bytes

s=...for c,r in("uua@b8c(d6e3f#g9h#i1i!jjk<l1limmnno0ppq9rrs5s$t+v>v<wuuw2ux%y?zz"):gmatch"(.)(.u?)"do s=s:gsub(c..c.."+",function(p)return#p..c end):gsub(c,r,1)end print(s)

Probieren Sie es online!

Ungolfed und erklärte:

s = ...


--This string contains every character to replace, followed by
--the character(s) it should be replaced with.
--
--It also contains all characters for which repeated sequences
--of them should be replaced by "<number><character>". That is,
--all letters in the alphabet. This way, a single loop can do
--both the "replace repeated characters" and "encode characters"
--operations, saving a for loop iterating over the alphabet.
--
--Characters that shouldn't be replaced will be replaced with
--themselves.
--
--In order to avoid matching half of the "replace u with u"
--command as the replace part of another command, "uu" is placed
--at the beginning of the string. This ensures that only the
--2-character replacements for "w" get an extra "u".

cmdstring = "uua@b8c(d6e3f#g9h#i1i!jjk<l1limmnno0ppq9rrs5s$t+v>v<wuuw2ux%y?zz"


--Iterate over all the search/replace commands.
--The character to replace is in the "c" variable, the string to
--replace it with is in "r".
--
--Due to the dummy search/replace commands (i.e. "mm") placed
--in the string, this loop will also iterate over all letters
--of the alphabet.

for c,r in cmdstring:gmatch("(.)(.u?)") do
	
	--First, replace any occurences of the current letter
	--multiple times in a row with "<number><letter>".
	s = s:gsub(c..c.."+", function(p)
		return #p .. c
	end)
	
	--Then, replace the first occurence of the letter
	--with the replacement from the command string.
	s = s:gsub(c, r, 1)
end

print(s)
Jonathan S.
quelle
Lol lua :) gute Arbeit
mdahmoune
2

C # (.NET Core), 317 , 289 , 279 Bytes

p=>{string r="",l=r,h=r,c="a@b8c(d6e3f#g9h#i1i!k<l1lio0q9s5s$t+v>v<wuw2x%y?";int i=0,n=p.Length,d,a=1;for(;i<n;i++){h=p[i]+"";if(h==p[(i==n-1?i:i+1)]+""&&i!=n-1)a++;else{d=c.IndexOf(h);if(d>=0&&d%2<1){l=c[d+1]+"";h=l=="u"?"uu":l;c=c.Remove(d,2);}r+=a>1?a+""+h:h;a=1;}}return r;};

Probieren Sie es online!

Ich hoffe, es ist in Ordnung, ein char-Array als Eingabe und nicht als Zeichenfolge zu empfangen.

Ungolfed :

string result = "", casesCharReplacement = result, currentChar = result, cases = "a@b8c(d6e3f#g9h#i1i!k<l1lio0q9s5s$t+v>v<wuw2x%y?";
int i = 0, n = pas.Length, casesIndex, charAmounts = 1;

// For every char in the pass.
for (; i < n; i++)
{
    currentChar = pas[i] + "";
    // if the next char is equal to the current and its not the end of the string then add a +1 to the repeated letter.
    if (currentChar == (pas[(i == n - 1 ? i : i + 1)] + "") && i != n - 1)
        charAmounts++;
    else
    {
        // Finished reading repeated chars (N+Char).
        casesIndex = cases.IndexOf(currentChar);
        // Look for the replacement character: only if the index is an even position, otherwise I could mess up with letters like 'i'.
        if (casesIndex >= 0 && casesIndex % 2 < 1)
        {
            casesCharReplacement = cases[casesIndex + 1]+"";
            // Add the **** +u
            currentChar = casesCharReplacement == "u"?"uu": casesCharReplacement;
            // Remove the 2 replacement characters (ex: a@) as I won't need them anymore.
            cases = cases.Remove(casesIndex, 2);
        }
        // if the amount of letters founded is =1 then only the letter, otherwise number and the letter already replaced with the cases.
        result += charAmounts > 1 ? charAmounts + ""+currentChar : currentChar;
        charAmounts = 1;
    }
}
return result;
Emiliano
quelle
1
Ja, es ist in
Ordnung
2

C ++, 571 495 478 444 Bytes

-127 Bytes dank Zacharý

#include<string>
#define F r.find(
#define U(S,n)p=F s(S)+b[i]);if(p-size_t(-1)){b.replace(i,1,r.substr(p+n+1,F'/',n+p)-p-2));r.replace(p+1,F'/',p+1)-p,"");}
#define V(A)i<A.size();++i,c
using s=std::string;s m(s a){s b,r="/a@/b8/c(/d6/e3/f#/g9/h#/i1//i!/k</l1//li/o0/q9/s5//s$/t+/v>/wuu//w2u/x%/y?/";int c=1,i=0;for(;V(a)=1){for(;a[i]==a[i+1]&&1+V(a)++);b+=(c-1?std::to_string(c):"")+a[i];}for(i=0;V(b)){auto U("/",1)else{U("//",2)}}return b;}

Die "/a@/b8/c(/d6/e3/f#/g9/h#/i1//i!/k</l1//li/o0/q9/s5//s$/t+/v>/wuu//w2u/x%/y?/"Zeichenfolge wird zum Umwandeln von einem Zeichen in ein anderes verwendet. 1 /bedeutet, dass der erste "nächste Buchstabe" durch den folgenden ersetzt werden soll /, 2 bedeutet, dass der zweite "nächste Buchstabe" durch den folgenden ersetzt werden soll.

Probieren Sie es online aus

HatsuPointerKun
quelle
Großartig, könnten Sie bitte einen tio.run-Link hinzufügen?
mdahmoune
@ mdahmoune TIO-Link hinzugefügt, mit dem Code für Ihre Testfälle zu testen :)
HatsuPointerKun
494 Bytes , und aktualisieren Sie den TIO-Link entsprechend, wenn Sie ihn ändern.
Zacharý
@ Zacharý Sie müssen ein Leerzeichen zwischen dem Makronamen und dem Makroinhalt einfügen. Andernfalls wird beim Kompilieren mit C ++ 17 ein Fehler ausgegeben. Wissen Sie auch, wie Sie einen TIO-Link löschen? (da die alte nutzlos ist)
HatsuPointerKun
1
444 bytes
Zacharý
2

R , 224 219 Bytes

function(s,K=function(x)el(strsplit(x,"")),u=rle(K(s)))
Reduce(function(x,y)sub(K('abcdefghiiklloqsstvvwwxy')[y],c(K('@8(63#9#1!<1i095$+><'),'uu','2u',K('%?'))[y],x),1:24,paste0(gsub("1","",paste(u$l)),u$v,collapse=""))

Probieren Sie es online!

Böse, aber der Hauptteil ist die iterative Substitution in der Reduce. subÄndert nur das erste Vorkommen des Matches.

Vielen Dank an JayCe für den Hinweis auf ein schönes Golf!

Giuseppe
quelle
Gute Arbeit :)))))
mdahmoune
Sparen Sie 1 Byte, indem Sie die Argumente neu anordnen. Macht keinen großen Unterschied, wie ich weiß;)
JayCe
@ JayCe Ich fand einige weitere Bytes :-)
Giuseppe
1

Perl 5 , 123 Bytes

122 Byte Code + 1 für -p.

Entwickelt unabhängig von @ Xcali 's Antwort , aber ein sehr ähnliches Verfahren.

s/(.)\1+/$&=~y!!!c.$1/ge;eval"s/$1/$2/"while'a@b8c(d6e3f#g9h#i1i!k<l1lio0q9s5t+v>v<x%y?'=~/(.)(.)/g;s/s/\$/;s/w/uu/;s;w;2u

Probieren Sie es online!

Dom Hastings
quelle
1

Python 2 , 220 216 194 190 188 Bytes

import re
S=re.sub(r'(.)\1+',lambda m:`len(m.group(0))`+m.group(1),input())
for a,b in zip('abcdefghiiklloqsstvvxyww',list('@8(63#9#1!<1i095$+><%?')+['uu','2u']):S=S.replace(a,b,1)
print S

Probieren Sie es online!

Python 3 , 187 Bytes

import re
S=re.sub(r'(.)\1+',lambda m:str(len(m.group(0)))+m.group(1),input())
for a,b in zip('abcdefghiiklloqsstvvxyww',[*'@8(63#9#1!<1i095$+><%?','uu','2u']):S=S.replace(a,b,1)
print(S)

Probieren Sie es online!

TFeld
quelle
Vielen Dank
mdahmoune
Tolles Golfen;)
mdahmoune
186 Bytes . Sie können dies auch problemlos in 192 Bytes nach Python 3 portieren , aber ich denke nicht, dass es eine separate Antwort sein sollte.
NieDzejkob
@NieDzejkob Es sieht so aus, als würde Ihre Golf-Python-2-Version eine andere Ausgabe produzieren als die aktuelle Version des OP oder Ihre Python-3-Version.
Jonathan Frech
@JomathanFrech sorry, wie immer auf Produktion testen. 188 Bytes
NieDzejkob
1

Pip , 103 102 Bytes

aR:`(.)\1+`#_.B
Fm"abcdefghiiklloqsstvvwwxy"Z"@8(63#9#1!<1i095$+><WU%?"I#Ya@?@maRA:ym@1aR'W"uu"R'U"2u"

Probieren Sie es online!

Erläuterung

Der Code führt drei Transformationsschritte aus:

aR:`(.)\1+`#_.B  Process runs of identical letters

a                1st cmdline argument
 R:              Do this replacement and assign back to a:
   `(.)\1+`       This regex (matches 2 or more of same character in a row)
           #_.B   Replace with callback function: concatenate (length of full match) and
                  (first capture group)
                  Note: #_.B is a shortcut form for {#a.b}

Fm"..."Z"..."I#Ya@?@maRA:ym@1  Do the bulk of rules 2-25

  "..."                        String of letters to replace
       Z"..."                  Zip with string of characters to replace with
Fm                             For each m in the zipped list:
                   @m           First item of m is letter to replace
                a@?             Find its index in a, or nil if it isn't in a
               Y                Yank that into y
             I#                 If len of that is truthy:*
                     aRA:        Replace character in a at...
                         y        index y...
                          m@1     with second item of m

aR'W"uu"R'U"2u"  Clean up substitution
                 In the previous step, the replacements each had to be a single character.
                 This doesn't work for uu and 2u, so we use W and U instead (safe, since
                 uppercase letters won't be in the input) and replace them here with the
                 correct substitutions.
aR'W"uu"         In a, replace W with uu
        R'U"2u"  and U with 2u
                 and print the result (implicit)

* Wir müssen testen, ob a@?m@0Null ist. Es ist nicht genug zu testen, dass es wahr ist, da 0 ein legitimer Index ist, der falsch ist. Pip hat keine kurze Methode, um zu testen, ob ein Wert null ist, aber das Testen der Länge funktioniert in diesem Fall gut genug: Jede Zahl hat eine Länge von mindestens 1 (wahr), und nil hat eine Länge von null (falsch).

DLosc
quelle