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!

Troels MB Jensen
quelle
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
Emigna
quelle
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)
Kevin Cruijssen
quelle
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.

Neil
quelle
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
Shieru Asakoto
quelle
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
]
Galen Ivanov
quelle
2

Perl 5 , 76 Bytes

print map{$l=length;substr$_.reverse,$i++%(2*$l-2||1)*(1+1/$l),1}split" ",<>

Probieren Sie es online!

fockjef
quelle
2

k , 31 30 28 Bytes

{x{*|y#x,1_|1_x}'1+!#x}@" "\

Probieren Sie es online!

zgrep
quelle
|-1_->1_|
ngn
Sie können 2 Bytes sparen, indem Sie die Argumente des inneren Lambdas austauschen
ngn
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
Sok
quelle
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
Zottelig
quelle
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!

ErikF
quelle
-(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!

Jona
quelle
1

C # (.NET Core) , 111 Byte

s=>{int i=-1,j;return String.Concat(s.Split(' ').Select(a=>a[++i>(j=a.Length-1)?j>0?i/j%2<1?i%j:j-i%j:0:i]));};

Probieren Sie es online!

Vadim
quelle
Willkommen bei PPCG. Schöne Antwort
Muhammad Salman
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

nimi
quelle
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

Stax , 9 Bytes

éñ~╗D¡┤Gq

Führen Sie es aus und debuggen Sie es

Ausgepackt, ungolfed und kommentiert sieht es so aus.

j       split into words
{       start block for mapping
  cDrD  copy word; remove first and last character; reverse
  +     concatenate with original word
  i@    modularly (wrap-around) index using map iteration index
m       perform map

Führen Sie dieses aus

rekursiv
quelle
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
user2803033
quelle
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++})}
Peter Vandivier
quelle
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!

Jona
quelle