Nueva idea de contraseña: Word-walker


23

Pensé en una nueva forma de generar mis contraseñas, y aunque probablemente no sea muy inteligente a largo plazo, aún podría ser un divertido código de golf.

Tomando una cadena de palabras, la contraseña se genera así:

  • Elija el enésimo carácter en la enésima palabra
  • Si n es más grande que la palabra, continúe contando hacia atrás

Ejemplo:

This is a fun task!
T     s a  u      !

T es el primer personaje
s es el segundo
a es el primero, pero yendo y viniendo también es el tercero
u es el segundo, pero por contar hacia atrás también es el cuarto
'!' es el quinto personaje en 'tarea!' y así se incluirá en la contraseña final,Tsau!

Reglas

  • La entrada será una cadena
  • Separe la cadena en espacios, todos los demás caracteres deben estar incluidos
  • Las letras mayúsculas deben permanecer en mayúsculas, igual que en minúsculas
  • Realizas n pasos en cada palabra, donde n es la cantidad de palabras que han aparecido antes más una
  • Si n es más grande que la palabra, debe retroceder a través de la palabra, si presiona el inicio, avanzará nuevamente hasta que haya pisado n veces
  • El primer y último personaje solo se sube una vez, así que 'diversión' en la séptima posición como ejemplo va 'funufun' y termina en n, no 'funnuff' y termina en f
  • La salida debe ser una cadena

Ejemplos:

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

¡El código más corto en bytes gana!


3
toes la palabra 12 (0-indexada) en la larga cadena, y por lo tanto la letra del código debe ser t, no o.
— Neil

@Neil <s> la secuencia está indexada en 1, de lo contrario no puede comenzar con la primera letra de la primera palabra </s> (lo intenté) mal, lo veo ahora
— Troels MB Jensen

14
Tsau!es chino paraFuck!
— sergiol

1
Además, su plan de pasos para elegir funufun sobre funnuff aumentará el porcentaje de vocales en la salida. Criptográficamente, este no es un generador de contraseñas seguro.
— Criggie

1
@Criggie Nunca tuve la intención de usarlo, pero como dije, sería un desafío divertido, y parece que los golfistas están de acuerdo
— Troels MB Jensen

Respuestas:



7

05AB1E , 11 bytes

#vyN©Fû}®è?

Pruébalo en línea!

Explicación

#             # 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 gracias a @SamYonnou al crear un puerto de la respuesta JavaScript de @ user71546 .
-4 bytes gracias a @SamYonnou nuevamente, optimizando el algoritmo para Java.

Pruébalo en línea.

Explicación:

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)

No funciona para los casos de prueba 0, 2 y 5
— TFeld

1
bajó a 117 "usando un enfoque más aritmético" similar a lo que parece estar haciendo la versión de user71546: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 ¡Gracias! Y he podido jugar tres bytes más quitando los corchetes y cambiando ==0a <1.
— Kevin Cruijssen

1
Golfed a 110 al deshacerse de la ++i>(j=a.length()-1)condición ya que las matemáticas funcionan de la misma manera, independientemente del resultado de esa condición: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 Gracias de nuevo! He cambiado ligeramente 0<(j=a.length()+i-++i)?a, (j=a.length()-1)>0*i++?por lo que la explicación fue un poco más fácil de escribir (sin embargo, no se guardaron bytes).
— Kevin Cruijssen 01 de

3

Carbón , 16 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

  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

No suelo usar el último parámetro de Slice.


Me gusta que el carbón use un glifo de tijera
— Jonás

3

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

-1 byte @Arnauld

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

Pruébalo en línea!

Explicación

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

Rojo , 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]

Pruébalo en línea!

Legible:

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

Pruébalo en línea

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 -P, 11 bytes

¸Ëê ŪD gEÉ

Intentalo

¸Ë+s1J w)gE

Intentalo


Explicaciones

¸Ëê Ū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 (versión de cadena), 114 bytes (versión impresa)

Si debo devolver una cadena (versión larga):

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

Pruébalo en línea!

De lo contrario, solo imprimo y no me preocupo por un búfer (versión corta):

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

Pruébalo en línea!


-(j>1)-1puede ser reemplazado por +~(j>1)1 byte menos, creo.
— Shieru Asakoto

106 caracteres: ¡ putchar( t[ j=strlen(t)-1, k = i++ % (j ? j*2 : 1), k<j ? k : j+j-k ]); Pruébelo en línea!
— user5329483

Versión almacenada: las variables globales están puestas a cero implícitamente. Reemplazar *u++con c[i]y eliminar u.
— user5329483

Basándose en @ user5329483 105 bytes
— ceilingcat

1

AWK, 79 bytes

¡Principalmente porque tengo curiosidad por ver mejores soluciones awk o 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)}}

Pruébalo en línea!



1

Haskell, 65 62 61 bytes

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

Pruébalo en línea!

Requiere la última versión de las Preludecuales presenta la <>función.

                   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  

Editar: -3 bytes gracias a @ user28667, -1 byte gracias a @B. Mehta


Parece que zipWith(\i w->(cycle$id<>reverse.drop 1.init$w)!!i)[0..].wordstambién funciona.
— user28667

1
Puede guardar otro byte cambiando la lambda para \i->(!!i).cycle.(id<>reverse.drop 1.init)factorizar la wmención explícita (TIO)
— B. Mehta

1

Stax , 9 bytes

éñ~╗D¡┤Gq

Ejecutar y depurarlo

Desempaquetado, sin golf y comentado, se ve así.

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

Ejecute este


1

PHP , 77 bytes

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

Pruébalo en línea!

  • -3 bytes gracias a Kevin
  • -10 bytes gracias a Titus

1
¡Buena respuesta! Una cosa pequeña para el golf: puede deshacerse de los soportes y un tercer byte adicional cambiando foreach(...){$c=...;echo$c[...];}a foreach(...)echo($c=...)[...];. Pruébelo en línea: 87 bytes
— Kevin Cruijssen

Puede usar la lista de argumentos para dividir automáticamente las palabras (-8 bytes) y .=guardar dos bytes: while(ord($w=$argv[++$i]))echo($w.=strrev(substr($w,1,-1)))[~-$i%strlen($w)]; pruébelo en línea
— Titus

¡Agradable! Una pregunta: ~ - $ i hace lo mismo que ($ i-1), ¿verdad?
— user2803033

0

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

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

Pruebe los casos a continuación o pruébelo en línea

@(
    "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
Hay mucho que podrías acortar aquí. ¿Has visto los consejos para jugar al golf en PowerShell ?
— briantist

¡Gracias! Había pensado en usar el interruptor justo después de publicar, pero el resto aún no se me había ocurrido.
— Peter Vandivier

También un problema real aquí es que realmente no se ingresan datos en ningún lugar de este fragmento. Somos bastante flexibles para poder escribir un programa o función, pero el suyo tiene una entrada implícita. Como primer paso, es posible que simplemente reemplazar su ""|%{con $args|%{, pero creo que se puede jugar golf con mayor eficacia también;)
— briantist

1
Aquí hay una demostración en TIO que también muestra cómo usar la función de argumentos para casos de prueba . ¡Mantener el bloque de código solo para su código también le permite usar el enlace fácil de TIO y el recuento de bytes para su publicación!
— briantist

0

J, 43 bytes

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

sin golf

[: (> {~"_1 #@> | i.@#) [: (, }.@}:)&.> [: <;._1 ' '&,
  • <;._1 ' '&, dividido en espacios
  • (, }.@}:)&.> por cada palabra, mata el primer y el último olmo y agrega palabra
  • #@> | i.@# tomar el resto de la longitud de cada palabra dividido en su índice
  • > {~"_1 toma ese resultado y sácalo de cada palabra.

Pruébalo en línea!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.