Nova idéia de senha: Word-walker


23

Pensei em uma nova maneira de gerar minhas senhas e, embora provavelmente não seja muito inteligente a longo prazo, ainda pode ser um código-golfe divertido.

Usando uma sequência de palavras, a senha é gerada assim:

  • Escolha o enésimo caractere na enésima palavra
  • Se n for maior que a palavra, continue contando para trás

Exemplo:

This is a fun task!
T     s a  u      !

T é o primeiro caractere
s é o segundo
a é o primeiro, mas indo e voltando também é o terceiro
u é o segundo, mas devido à contagem regressiva também é o quarto
'!' é o quinto caractere em 'tarefa!' e, portanto, será incluído na senha final,Tsau!

Regras

  • Entrada será uma string
  • Separe a sequência nos espaços, todos os outros caracteres devem ser incluídos
  • Letras maiúsculas devem permanecer em maiúsculas, mesmo com letras minúsculas
  • Você executa n etapas em cada palavra, onde n é o número de palavras que vieram antes mais uma
  • Se n for maior que a palavra, você deve retroceder na palavra; se você pressionar o início, seguirá em frente novamente até que você tenha pisado n vezes
  • O primeiro e o último caractere são pisados ​​apenas uma vez, então 'diversão' na sétima posição, como um exemplo, vai 'funufun' e termina em n, não 'funnuff' e termina em f
  • A saída deve ser uma sequência

Exemplos:

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

O código mais curto em bytes vence!


3
toé a palavra 12 (0 indexado) na corda longa e, portanto, a letra código deve ser t, não o.
314 Neil

@ Neil <s> a sequência é indexada em 1, caso contrário você não pode começar com a primeira letra da primeira palavra </s> (tentei) meu mal, estou vendo agora
Troels MB Jensen

14
Tsau!é chinês paraFuck!
sergiol

1
Além disso, seu plano de passo para escolher funufun sobre funnuff aumentará a porcentagem de vogais na saída. Criptograficamente, este não é um gerador de senhas forte.
Criggie

1
@Criggie Nunca tive a intenção de usá-lo, mas como eu disse, ele faria para um desafio divertido, e parece que os jogadores concordam
Troels Jensen MB

Respostas:



7

05AB1E , 11 bytes

#vyN©Fû}®è?

Experimente online!

Explicação

#             # 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 graças a @SamYonnou , criando uma porta da resposta JavaScript de @ user71546 .
-4 bytes graças a @SamYonnou novamente, otimizando o algoritmo para Java.

Experimente online.

Explicação:

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)

Não funciona para os casos de teste 0, 2 e 5
TFeld

1
chegou a 117 "usando uma abordagem mais aritmética", semelhante ao que a versão de user71546 parece estar fazendo: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 Thanks! E consegui jogar mais três bytes removendo os colchetes e mudando ==0para <1.
Kevin Cruijssen

1
golfed a 110 por se livrar da ++i>(j=a.length()-1)condição uma vez que a matemática funciona da mesma maneira, independentemente do resultado dessa condição: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 Thanks again! Eu mudei um pouco 0<(j=a.length()+i-++i)?para, (j=a.length()-1)>0*i++?para que a explicação fosse um pouco mais fácil de digitar (sem bytes salvos ao fazê-lo).
Kevin Cruijssen

3

Carvão , 16 bytes

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

Experimente online! Link é a versão detalhada do código. Explicação:

  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

Não costumo usar o último parâmetro do Slice.


Eu gosto que Charcoal usa uma tesoura glifo
Jonah

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``

Experimente online!

Explicação

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

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

Experimente online!

Legível:

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

Pitão , 12 bytes

s.e@+b_Ptbkc

Experimente online

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

Japonês -P, 11 bytes

¸Ëê ŪD gEÉ

Tente

¸Ë+s1J w)gE

Tente


Explicações

¸Ëê Ū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 (versão em cadeia), 114 bytes (versão em impressão)

Se eu precisar retornar uma string (versão longa):

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

Experimente online!

Caso contrário, apenas imprimo e não me preocupo com um buffer (versão curta):

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

Experimente online!


-(j>1)-1pode ser substituído por +~(j>1)1 byte a menos, eu acho.
Shieru Asakoto

106 caracteres: putchar( t[ j=strlen(t)-1, k = i++ % (j ? j*2 : 1), k<j ? k : j+j-k ]); Experimente online!
precisa saber é o seguinte

Versão em buffer: variáveis ​​globais são zeradas implicitamente. Substitua *u++por c[i]e remova u.
user5329483

Construindo em @ user5329483 105 bytes
ceilingcat

1

AWK, 79 bytes

Principalmente porque estou curioso para encontrar melhores soluções para 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)}}

Experimente online!



1

Haskell, 65 62 61 bytes

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

Experimente online!

Requer a versão mais recente da Preludequal possui a <>função.

                   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 graças a @ user28667, -1 byte graças a @B. Mehta


Parece que zipWith(\i w->(cycle$id<>reverse.drop 1.init$w)!!i)[0..].wordstambém funciona.
User28667

1
Você pode salvar outro byte, alterando o lambda para \i->(!!i).cycle.(id<>reverse.drop 1.init)factoring a explícita wmenção (TIO)
B. Mehta

1

Stax , 9 bytes

éñ~╗D¡┤Gq

Execute e depure

Descompactado, não jogado e comentado, parece com isso.

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

Execute este


1

PHP , 77 bytes

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

Experimente online!

  • -3 bytes graças a Kevin
  • -10 bytes graças a Titus

1
Boa resposta! Uma pequena coisa no golfe: você pode se livrar dos suportes e de um terceiro byte adicional, alterando foreach(...){$c=...;echo$c[...];}para foreach(...)echo($c=...)[...];. Experimente on-line: 87 bytes
Kevin Cruijssen

Você pode usar a lista de argumentos para dividir automaticamente as palavras (-8 bytes), e .=salva dois bytes: while(ord($w=$argv[++$i]))echo($w.=strrev(substr($w,1,-1)))[~-$i%strlen($w)]; experimentá-lo on-line
Tito

Agradável! Uma pergunta: ~ - $ i faz o mesmo que ($ i-1), certo?
precisa saber é o seguinte

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

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

Casos de teste abaixo ou experimente 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
Há muito que você pode reduzir aqui. Você já viu as dicas para jogar golfe no PowerShell ?
Briantist

Obrigado! Eu pensei em usar o switch logo após postar, mas o resto ainda não havia me ocorrido.
Peter Vandivier

Também um problema real aqui é que você realmente não recebe informações em nenhum lugar deste snippet. Somos bastante flexíveis em poder escrever um programa ou função, mas o seu tem entrada implícita. Como um primeiro passo que você pode simplesmente substituir o seu ""|%{com $args|%{, mas eu acho que você pode golfe-lo de forma mais eficaz também;)
briantist

1
Aqui está uma demonstração no TIO que também mostra como usar o recurso de argumentos para casos de teste . Manter o bloco de código apenas para o seu código também permite que você use as contagens fáceis de links e bytes da TIO para sua postagem!
Briantist

0

J, 43 bytes

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

destroçado

[: (> {~"_1 #@> | i.@#) [: (, }.@}:)&.> [: <;._1 ' '&,
  • <;._1 ' '&, dividir em espaços
  • (, }.@}:)&.> para cada palavra, mate o primeiro e o último olmo e acrescente à palavra
  • #@> | i.@# pegue o restante do comprimento de cada palavra dividido em seu índice
  • > {~"_1 pegue esse resultado e retire-o de cada palavra.

Experimente online!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.