Neue Passwortidee: Word-Walker


23

Ich habe mir eine neue Methode ausgedacht, um meine Passwörter zu generieren, und obwohl es auf lange Sicht wahrscheinlich nicht sehr clever ist, könnte es dennoch Spaß machen, Code-Golf zu spielen.

Unter Verwendung einer Wortfolge wird das Passwort folgendermaßen generiert:

  • Wählen Sie das n-te Zeichen im n-ten Wort
  • Wenn n größer als das Wort ist, zählen Sie rückwärts weiter

Beispiel:

This is a fun task!
T     s a  u      !

T ist das erste Zeichen
s ist das zweite
a ist das erste, aber hin und her ist es auch das dritte
u ist das zweite, aber da rückwärts gezählt wird, ist es auch das vierte
'!' ist das fünfte Zeichen in 'Aufgabe!' und somit im endgültigen Passwort enthalten sein,Tsau!

Regeln

  • Die Eingabe wird eine Zeichenfolge sein
  • Trennen Sie die Zeichenfolge in Leerzeichen, alle anderen Zeichen müssen enthalten sein
  • Großbuchstaben müssen wie Kleinbuchstaben groß geschrieben werden
  • Sie gehen in jedem Wort n Schritte vor, wobei n die Anzahl der vorangegangenen Wörter plus eins ist
  • Wenn n größer als das Wort ist, müssen Sie das Wort rückwärts durchgehen. Wenn Sie den Anfang treffen, gehen Sie erneut vorwärts, bis Sie n- mal einen Schritt gemacht haben
  • Das erste und letzte Zeichen wird nur einmal verschoben, so dass "funufun" auf der siebten Position als Beispiel "funufun" und endet auf n, nicht "funnuff" und endet auf f
  • Die Ausgabe muss eine Zeichenfolge sein

Beispiele:

Input              Output
Once Upon A Time   OpAe
There was a man    Taaa
Who made a task    Waak
That was neat!     Taa
This is a long string to display how the generator is supposed to work  Tsagnoyotoipto

Der kürzeste Code in Bytes gewinnt!


3
toist das 12. Wort (0-indiziert) in der langen Zeichenfolge, und daher sollte der Codebuchstabe tnicht sein o.
Neil

@Neil <s> die Sequenz ist 1-indiziert, sonst kann man nicht mit dem ersten Buchstaben des ersten Wortes beginnen </ s> (ich habe es versucht) mein schlechtes, ich sehe es jetzt
Troels MB Jensen

14
Tsau!is chinese forFuck!
sergiol

1
Auch Ihr Schrittplan für die Auswahl von Funufun anstelle von Funnuff erhöht den Prozentsatz der Vokale in der Ausgabe. Kryptografisch ist dies kein starker Passwortgenerator.
Criggie

1
@Criggie Ich hatte nie vor, es zu benutzen, aber wie gesagt, es wäre eine lustige Herausforderung, und es scheint, dass die Golfer einverstanden sind
Troels MB Jensen

Antworten:



7

05AB1E , 11 Bytes

#vyN©Fû}®è?

Probieren Sie es online!

Erläuterung

#             # split input on spaces
 vy           # for each word in input
   N©F        # N times do, where N is the current iteration
      û}      # palendromize the word
        ®è    # use N to index into the resulting word
          ?   # print


4

Java 10, 148 117 114 110 Bytes

s->{int i=-1,j;for(var a:s.split(" "))System.out.print(a.charAt((j=a.length()-1)>0*i++?i/j%2<1?i%j:j-i%j:0));}

-31 Bytes dank @SamYonnou durch Erstellen eines Ports für die JavaScript-Antwort von @ user71546 . Nochmals
-4 Bytes dank @SamYonnou , der den Algorithmus für Java optimiert.

Probieren Sie es online aus.

Erläuterung:

s->{                            // Method with String parameter and no return-type
  int i=-1,                     // Step integer, starting at -1
      j;                        // Temp integer
  for(var a:s.split(" "))       // Loop over the parts split by spaces
    System.out.print(           // Print:
     a.charAt((j=a.length()-1)  //  Set `j` to the the length of the part minus 1
               >0               //  If the length of the part is larger than 1 (`j` > 0)
                 *i++?          //  (and increase `i` by 1 in the process with `i++`)
                i/j%2<1?        //   If `i` integer-divided by `j` is even:
                 i%j            //    Print the character at index `i` modulo-`j`
                :               //   Else:
                 j-i%j          //    Print the character at index `j` minus `i` modulo-`j`
               :                //  Else:
                0));}           //   Print the first (and only) character
                                //   (the >0 check is added to prevent divided-by-0 errors)

Funktioniert nicht für Testfälle 0, 2 und 5
TFeld

1
Golfen auf 117 "mit einem arithmetischeren Ansatz", ähnlich wie es die Version von user71546 zu tun scheint:s->{int i=-1,j;for(var a:s.split(" ")){System.out.print(a.charAt(++i>(j=a.length()-1)?j>0?i/j%2==0?i%j:j-i%j:0:i));}}
SamYonnou

1
@ SamYonnou Danke! Und ich habe drei weiteres Bytes zum Golf der Lage gewesen , durch die Klammern zu entfernen und zu ändern , ==0um <1.
Kevin Cruijssen

1
Auf 110 golfen, indem die ++i>(j=a.length()-1)Bedingung beseitigt wird, da die Mathematik unabhängig vom Ergebnis dieser Bedingung auf die gleiche Weise funktioniert:s->{int i=-1,j;for(var a:s.split(" "))System.out.print(a.charAt(0<(j=a.length()+i-++i)?i/j%2<1?i%j:j-i%j:0));}
SamYonnou

1
@ SamYonnou Nochmals vielen Dank! Ich habe etwas geändert 0<(j=a.length()+i-++i)?, (j=a.length()-1)>0*i++?damit die Erklärung ein bisschen einfacher zu tippen war (keine Bytes, die dabei jedoch gespeichert wurden).
Kevin Cruijssen

3

Kohle , 16 Bytes

⭆⪪S §⁺ι✂ι±²¦⁰±¹κ

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

  S                 Input string
 ⪪                  Split on spaces
⭆                   Map over words and join
      ι ι           Current word
       ✂ ±²¦⁰±¹     Slice backwards from 2nd last character to start exclusive
     ⁺              Concatenate
    §          κ    Cyclically index on current word index
                    Implicitly print

Ich verwende nicht oft den letzten Parameter von Slice.


Mir gefällt, dass Charcoal eine Scheren-Glyphe verwendet
Jonah

3

JavaScript (Node.js) , 78 70 69 68 Byte

-1 Byte @Arnauld

x=>x.split` `.map((y,i)=>y[a=i%(l=y.length-1)|0,i/l&1?l-a:a]).join``

Probieren Sie es online!

Erläuterung

x=>
 x.split` `                    // Split the words by spaces
 .map((y,i)=>                  // For each word:
  y[                           //  Get the character at index:
                               //   A walk has cycle of length (2 * y.length - 2)
   a=i%(l=y.length-1)|0,       //   Calculate index a = i % (y.length - 1)
   i/l&1                       //   Check in which half the index i in
   ?l-a                        //   If in the second half of cycle, use y.length - 1 - a
   :a                          //   If in the first half of cycle, use a                  
  ]
 ).join``                      // Join back the letters

2

Rot , 135 Bytes

func[s][n: 0 p: copy""foreach w split s" "[append/dup r: copy""append w
reverse copy/part next w back tail w n: n + 1 append p r/(n)]p]

Probieren Sie es online!

Lesbar:

f: func[s][
    n: 0
    p: copy ""
    foreach w split s "  "[
        r: copy ""
        append/dup r append w reverse copy/part next w back tail w n: n + 1
        append p r/(n)
    ]
    p
]



1

Pyth , 12 Bytes

s.e@+b_Ptbkc

Probieren Sie es online aus

s.e@+b_PtbkcQ   Final Q (input) implicit

           cQ   Split on spaces
 .e             Map the above with b=element, k=index
       Ptb        Remove 1st and last character
      _           Reverse
    +b            Prepend the unaltered element ('abcd' -> 'abcdcb')
   @      k       Get the kth character (0 indexed, wrapping)
s               Join on empty string, implicit output

1

Japt -P11 Bytes

¸Ëê ŪD gEÉ

Versuch es

¸Ë+s1J w)gE

Versuch es


Erklärungen

¸Ëê ŪD gEÉ
¸               :Split on spaces
 Ë              :Map over each element D at index E
  ê             :  Palindromise
    Å           :  Slice off the first character
     ªD         :  Logical OR with the original element (the above will return an empty string for single character words)
        g       :  Get the character at index
         EÉ     :  E-1
¸Ë+s1J w)gE
¸               :Split on spaces
 Ë              :Map over each element D at index E
   s1J          :  Slice off the first and last characters
       w        :  Reverse
  +     )       :  Append to D
         gE     :  Get the character at index E

1

C (gcc) , 148 Bytes (String-Version), 114 Bytes (Druckversion)

Wenn ich einen String zurückgeben muss (lange Version):

char c[99]={0};char*f(s,t,u,i,j,k)char*s,*t,*u;{for(u=c,i=0;t=strtok(s," ");s=0,i++)*u++=t[j=strlen(t),k=2*j-(j>1)-1,(i%k<j?i%k:k-i%k)%j];return c;}

Probieren Sie es online!

Ansonsten drucke ich nur und mache mir keine Sorgen um einen Puffer (Kurzversion):

f(s,t,i,j,k)char*s,*t;{for(i=0;t=strtok(s," ");s=0,i++)putchar(t[j=strlen(t),k=2*j-(j>1)-1,(i%k<j?i%k:k-i%k)%j]);}

Probieren Sie es online!


-(j>1)-1kann durch +~(j>1)1 Byte weniger ersetzt werden, denke ich.
Shieru Asakoto

106 Zeichen: putchar( t[ j=strlen(t)-1, k = i++ % (j ? j*2 : 1), k<j ? k : j+j-k ]); Probieren Sie es online!
user5329483

Gepufferte Version: Globale Variablen werden implizit auf Null gesetzt. Ersetzen Sie *u++mit c[i]und entfernen Sie u.
user5329483

Aufbauend auf @ user5329483 105 Bytes
Ceilingcat

1

AWK, 79 Bytes

Vor allem, weil ich neugierig bin, bessere awk- oder bash-Lösungen zu sehen!

{for(i=1;i<=NF;i++){l=length($i);k=int(i/l)%2?l-i%l:k%l;printf substr($i,k,1)}}

Probieren Sie es online!



1

Haskell, 65 62 61 Bytes

zipWith(\i->(!!i).cycle.(id<>reverse.drop 1.init))[0..].words

Probieren Sie es online!

Es erfordert die neueste Version, Preludedie die <>Funktion bietet .

                   words    -- split the input string into a list of words
zipWith(\i->     )[0..]     -- zip the elements i of [0..] and the words pairwise
                            -- with the function      
      ... <> ...            --   call the functions with a word and concatenate
                            --   the results. The functions are
        id                  --     id: do nothing
        reverse.drop 1.init --     drop last and first element and reverse
    cycle                   --   repeat infinitely
(!!i)                       -- take the ith elemnt of  

Edit: -3 Bytes dank @ user28667, -1 Bytes dank @B. Mehta


Sieht zipWith(\i w->(cycle$id<>reverse.drop 1.init$w)!!i)[0..].wordsauch so aus.
user28667

1
Sie können ein weiteres Byte speichern, indem Sie das Lambda ändern \i->(!!i).cycle.(id<>reverse.drop 1.init)und die explizite wErwähnung (TIO)
B. Mehta,


1

PHP , 77 Bytes

while(ord($w=$argv[++$i]))echo($w.=strrev(substr($w,1,-1)))[~-$i%strlen($w)];

Probieren Sie es online!

  • -3 Bytes dank Kevin
  • -10 Bytes dank Titus

1
Gute Antwort! Eine kleine Sache zum Golf: Sie können loszuwerden, die Klammern bekommen und ein zusätzliches drittes Byte durch eine Änderung foreach(...){$c=...;echo$c[...];}an foreach(...)echo($c=...)[...];. Versuchen Sie es online: 87 Bytes
Kevin Cruijssen

Sie können die Argumentliste verwenden, um sie automatisch in Wörter (-8 Bytes) aufzuteilen und .=zwei Bytes zu speichern: while(ord($w=$argv[++$i]))echo($w.=strrev(substr($w,1,-1)))[~-$i%strlen($w)]; Probieren Sie es online aus
Titus

Nett! Eine Frage: ~ - $ i macht dasselbe wie ($ i-1), richtig?
user2803033

0

Power Shell 208 186 170 Bytes

$args|%{$i=0;-join($_.Split()|%{$l=($b=($a=$_)).Length;if($l-gt2){$b=($a|%{-join$a[($l-2)..1]})}for($j=0;$a.Length-le$i;$j++){$a+=($b,$_)[$j%2]}$a.Substring($i,1);$i++})}

Ungolfed:

$args|%{
   $i=0;
    -join($_.Split()|%{
        $l=($b=($a=$_)).Length;
        if($l-gt2){
            $b=($a|%{-join$a[($l-2)..1]})
        }
        for($j=0;$a.Length-le$i;$j++){
            $a+=($b,$_)[$j%2]
        }
        $a.Substring($i,1);
        $i++
    })
}

Testfälle unten oder versuchen Sie es online

@(
    "This is a fun task!",
    "Once Upon A Time",
    "There was a man",
    "Who made a task",
    "That was neat",
    "This is a long string to display how the generator is supposed to work"
)|%{$i=0;-join($_.Split()|%{$l=($b=($a=$_)).Length;if($l-gt2){$b=($a|%{-join$a[($l-2)..1]})}for($j=0;$a.Length-le$i;$j++){$a+=($b,$_)[$j%2]}$a.Substring($i,1);$i++})}

1
Es gibt eine Menge, die Sie hier kürzer machen könnten. Haben Sie die Tipps zum Golfen in PowerShell gesehen ?
Briantist

Vielen Dank! Ich hatte gerade nach dem Posten darüber nachgedacht, switch zu verwenden, aber der Rest war mir noch nicht eingefallen.
Peter Vandivier

Ein aktuelles Problem hierbei ist auch, dass Sie in diesem Snippet nirgendwo wirklich Eingaben vornehmen. Wir sind ziemlich flexibel, wenn es darum geht, ein Programm oder eine Funktion zu schreiben, aber Ihre Eingabe ist implizit. Als erster Schritt könnte ersetzen Sie einfach Ihre ""|%{mit $args|%{, aber ich denke , man kann es Golf effektiver auch;)
briantist

1
Hier ist eine Demonstration in TIO, die auch zeigt, wie die Argumente für Testfälle verwendet werden . Wenn Sie den Codeblock nur für Ihren Code beibehalten, können Sie auch die einfache Verknüpfung und Bytezahl von TIO für Ihren Beitrag verwenden!
Briantist

0

J, 43 Bytes

[:(>{~"_1#@>|i.@#)[:(,}.@}:)&.>[:<;._1' '&,

ungolfed

[: (> {~"_1 #@> | i.@#) [: (, }.@}:)&.> [: <;._1 ' '&,
  • <;._1 ' '&, nach Leerzeichen aufteilen
  • (, }.@}:)&.> Töte für jedes Wort die erste und letzte Ulme und hänge sie an das Wort an
  • #@> | i.@# Man nehme den Rest der Länge jedes Wortes, aufgeteilt in seinen Index
  • > {~"_1 nimm das Ergebnis und pflücke es aus jedem Wort.

Probieren Sie es online!

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.