Nouvelle idée de mot de passe: Word-walker


23

J'ai pensé à une nouvelle façon de générer mes mots de passe, et même si ce n'est probablement pas très intelligent à long terme, cela pourrait quand même faire un code-golf amusant.

En prenant une chaîne de mots, le mot de passe est généré ainsi:

  • Choisissez le nième caractère du nième mot
  • Si n est plus grand que le mot, continuez à compter à rebours

Exemple:

This is a fun task!
T     s a  u      !

T est le premier caractère
s est le deuxième
a est le premier, mais dans les deux sens c'est aussi le troisième
u est le deuxième mais à cause du comptage à rebours c'est aussi le quatrième
'!' est le cinquième personnage de 'tâche!' et sera donc inclus dans le mot de passe final,Tsau!

Règles

  • L'entrée sera une chaîne
  • Séparez la chaîne sur les espaces, tous les autres caractères doivent être inclus
  • Les lettres majuscules doivent rester en majuscules, idem pour les minuscules
  • Vous faites n étapes dans chaque mot, où n est le nombre de mots qui ont précédé plus un
  • Si n est plus grand que le mot, vous devez reculer dans le mot, si vous appuyez sur le début, vous avancez de nouveau jusqu'à ce que vous ayez fait un pas n fois
  • Le premier et le dernier caractère ne sont intensifiés qu'une seule fois, donc 'fun' à la septième position comme exemple va 'funufun' et se termine sur n, pas 'funnuff' et se termine sur f
  • La sortie doit être une chaîne

Exemples:

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

Le code le plus court en octets gagne!


3
toest le 12ème mot (indexé 0) dans la longue chaîne, et donc la lettre de code devrait être t, non o.
Neil

@Neil <s> la séquence est indexée 1, sinon vous ne pouvez pas commencer par la première lettre du premier mot </s> (j'ai essayé) ma mauvaise, je la vois maintenant
Troels MB Jensen

14
Tsau!est chinois pourFuck!
sergiol

1
De plus, votre plan d'étape pour choisir funufun plutôt que funnuff augmentera le pourcentage de voyelles dans la sortie. Cryptographiquement, ce n'est pas un puissant générateur de mots de passe.
Criggie

1
@Criggie Je n'ai jamais eu l'intention de l'utiliser, mais comme je l'ai dit, cela constituerait un défi amusant, et il semble que les golfeurs soient d'accord
Troels MB Jensen

Réponses:



7

05AB1E , 11 octets

#vyN©Fû}®è?

Essayez-le en ligne!

Explication

#             # 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 114 110 octets

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 octets grâce à @SamYonnou en créant un portage de la réponse JavaScript de @ user71546 .
-4 octets grâce à @SamYonnou à nouveau, optimisant l'algorithme pour Java.

Essayez-le en ligne.

Explication:

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)

Ne fonctionne pas pour les cas de test 0, 2 et 5
TFeld

1
golfé à 117 "en utilisant une approche plus arithmétique" similaire à ce que la version de user71546 semble faire: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 Merci! Et j'ai pu jouer trois octets de plus en supprimant les supports et en changeant ==0pour <1.
Kevin Cruijssen

1
golfé à 110 en se débarrassant de la ++i>(j=a.length()-1)condition puisque les mathématiques fonctionnent de la même manière quel que soit le résultat de cette condition: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 Merci encore! J'ai légèrement changé 0<(j=a.length()+i-++i)?en (j=a.length()-1)>0*i++?afin que l'explication soit un peu plus facile à taper (aucun octet enregistré ne le fait cependant).
Kevin Cruijssen

3

Fusain , 16 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

  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

Je n'ai pas souvent l'occasion d'utiliser le dernier paramètre de Slice.


J'aime que Charcoal utilise un glyphe de ciseaux
Jonah

3

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

-1 octet @Arnauld

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

Essayez-le en ligne!

Explication

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

Rouge , 135 octets

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]

Essayez-le en ligne!

Lisible:

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 octets

s.e@+b_Ptbkc

Essayez-le en ligne

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 octets

¸Ëê ŪD gEÉ

Essayez-le

¸Ë+s1J w)gE

Essayez-le


Explications

¸Ëê Ū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 octets (version chaîne), 114 octets (version imprimée)

Si je dois retourner une chaîne (version longue):

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

Essayez-le en ligne!

Sinon, j'imprime et je ne m'inquiète pas d'un tampon (version courte):

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

Essayez-le en ligne!


-(j>1)-1peut être remplacé par +~(j>1)1 octet de moins je pense.
Shieru Asakoto

106 caractères: putchar( t[ j=strlen(t)-1, k = i++ % (j ? j*2 : 1), k<j ? k : j+j-k ]); Essayez-le en ligne!
user5329483

Version tamponnée: les variables globales sont implicitement mises à zéro. Remplacer *u++par c[i]et enlever u.
user5329483

En s'appuyant sur @ user5329483 105 octets
plafondcat

1

AWK, 79 octets

Surtout parce que je suis curieux de voir de meilleures solutions awk ou bash!

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

Essayez-le en ligne!



1

Haskell, 65 62 61 octets

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

Essayez-le en ligne!

Il nécessite la dernière version Preludedont dispose la <>fonction.

                   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 octets grâce à @ user28667, -1 octet grâce à @B. Mehta


On dirait que ça zipWith(\i w->(cycle$id<>reverse.drop 1.init$w)!!i)[0..].wordsmarche aussi.
user28667

1
Vous pouvez enregistrer un autre octet en changeant le lambda pour \i->(!!i).cycle.(id<>reverse.drop 1.init)éliminer la wmention explicite (TIO)
B. Mehta

1

Stax , 9 octets

éñ~╗D¡┤Gq

Exécuter et déboguer

Déballé, non golfé et commenté, il ressemble à ceci.

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

Exécutez celui-ci


1

PHP , 77 octets

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

Essayez-le en ligne!

  • -3 octets grâce à Kevin
  • -10 octets grâce à Titus

1
Bonne réponse! Une petite chose au golf: vous pouvez vous débarrasser des supports et d'un troisième octet supplémentaire en changeant foreach(...){$c=...;echo$c[...];}pour foreach(...)echo($c=...)[...];. Essayez-le en ligne: 87 octets
Kevin Cruijssen

Vous pouvez utiliser la liste d'arguments pour diviser automatiquement en mots (-8 octets) et .=enregistrer deux octets: while(ord($w=$argv[++$i]))echo($w.=strrev(substr($w,1,-1)))[~-$i%strlen($w)]; essayez-le en ligne
Titus

Agréable! Une question: ~ - $ i fait la même chose que ($ i-1), non?
user2803033

0

Powershell 208 186 170 octets

$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++})}

Non golfé:

$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++
    })
}

Testez les cas ci-dessous ou essayez-le en ligne

@(
    "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
Il y a beaucoup de choses que vous pourriez raccourcir ici. Avez-vous vu les conseils pour jouer au golf dans PowerShell ?
briantist

Merci! J'avais pensé à utiliser switch juste après la publication, mais le reste ne m'était pas encore venu à l'esprit.
Peter Vandivier

De plus, un problème réel ici est que vous ne prenez pas vraiment d'entrée n'importe où dans cet extrait. Nous sommes assez flexibles pour pouvoir écrire un programme ou une fonction, mais le vôtre a une entrée implicite. Dans un premier temps, vous pourriez simplement remplacer le vôtre ""|%{par $args|%{, mais je pense que vous pouvez aussi le
jouer

1
Voici une démonstration dans TIO qui montre également comment utiliser la fonction d'arguments pour les cas de test . Garder le bloc de code pour votre code uniquement vous permet également d'utiliser la liaison facile et le nombre d'octets de TIO pour votre publication!
briantist

0

J, 43 octets

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

non golfé

[: (> {~"_1 #@> | i.@#) [: (, }.@}:)&.> [: <;._1 ' '&,
  • <;._1 ' '&, diviser sur les espaces
  • (, }.@}:)&.> pour chaque mot, tuez le premier et le dernier orme et ajoutez-le au mot
  • #@> | i.@# prendre le reste de la longueur de chaque mot divisé en son index
  • > {~"_1 prendre ce résultat et l'arracher à chaque mot.

Essayez-le en ligne!

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.