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.