Lily pad jumping


24

Neste desafio, você precisa simular um sapo pulando para frente e para trás em lírios. O lago é infinitamente grande, tem uma linha de um número infinito de lírios, e o sapo pode saltar sobre quantos lírios quiser.

Esse sapo gosta de pular para frente e para trás: depois de pular para frente, ele sempre pula para trás e vice-versa.

Você recebe uma lista de números inteiros, que representa seus saltos. Você precisa produzir o resultado de seus saltos.

Por exemplo, diga que você passou [2,3,6,8,2]:

Nosso sapo começa pulando 2 lírios para a frente:

_2

Em seguida, 3 lírios de volta:

3__2

Então 6 lírios para a frente:

3__2__6

8 de volta:

8_3__2__6

Finalmente, 2 lírios para a frente (observe como os 2 substituem os 3):

8_2__2__6

Para ser mais explícito: sua entrada é uma matriz de números S, você precisa exibir S[K]na posição S[K] - S[K-1] + S[K-2] - S[K-3]....

  • Se for necessário imprimir vários números em um determinado local, imprima apenas aquele com o índice mais alto.
  • Você deve usar _se um local específico estiver vazio
  • Se um número tiver vários dígitos, ele não ocupará vários locais. (Em outras palavras, um local pode consistir em vários caracteres)
  • Você pode assumir que sua lista não está vazia e que todos os números inteiros são maiores que 0.

Casos de teste:

5                   ____5
2,2                 2_2
4,3,2,1             3124
5,3,2,1             _3125
2,3,6,8,2           8_2__2__6
10,3,12,4,1,12,16   ___12__3__10____41__1216
100,4,7,2,2         _______________________________________________________________________________________________4___1002_2

Este é um , então responda com o menor número de caracteres possível!


13
Gostaria de saber quem assistiu ao Numberphile?
Okx

3
Portanto, haverá um desafio para cada vídeo do Numberphile ...
Fatalize 23/02


5
@Fatalize Não vejo nada de errado nisso.
orlp

11
Também relacionado ;-)
Arnauld

Respostas:


9

MATL , 35 34 bytes

Agradecemos a @Emigna por economizar 1 byte!

32Oittn:oEq*Yst1hX<-Q(Vh' 0'95ZtXz

Experimente online! Ou verifique todos os casos de teste .

Como funciona

Golf seu código, não suas explicações!

A seguir, use a entrada [2,3,6,8,2]como um exemplo. Para ver resultados intermediários no código real, você pode inserir um %(símbolo de comentário) para interromper o programa nesse ponto e ver o conteúdo da pilha. Por exemplo, isso mostra a pilha após a instrução Ys(soma acumulada).

32       % Push 32 (ASCII for space)
O        % Push 0
i        % Input array
         % STACK: 32, 0, [2,3,6,8,2]
t        % Duplicate
         % STACK: 32, 0, [2,3,6,8,2], [2,3,6,8,2]
tn:      % Push [1 2 ... n] where n is length of input array
         % STACK: 32, 0, [2,3,6,8,2], [2,3,6,8,2], [1,2,3,4,5]
o        % Modulo 2
         % STACK: 32, 0, [2,3,6,8,2], [2,3,6,8,2], [1,0,1,0,1]
Eq       % Multiply by 2, subtract 1
         % STACK: 32, 0, [2,3,6,8,2], [2,3,6,8,2], [1,-1,1,-1,1]
*        % Multiply elementwise
         % STACK: 32, 0, [2,3,6,8,2], [2,-3,6,-8,2]
Ys       % Cumulative sum
         % STACK: 32, 0, [2,3,6,8,2], [2,-1,5,-3,1]
         % The top-most array is the positions where the entries of the second-top
         % array will be written. But postions cannot be less than 1; if that's
         % the case we need to correct so that the minimum is 1. If this happens,
         % it means that the frog has gone further left than where he started
t        % Duplicate
1hX<     % Append 1 and compute minimum. So if the original minimum is less than 1
         % this gives that minimum, and if it is more than 1 it gives 1
         % STACK: 32, 0, [2,3,6,8,2], [2,-1,5,-3,1], -3
-        % Subtract
         % STACK: 32, 0, [2,3,6,8,2], [5 2 8 0 2]
Q        % Add 1
         % STACK: 32, 0, [2,3,6,8,2], [6 3 9 1 3]
(        % Assign values (top array) to specified positions (second-top) into array
         % which contains a single 0 (third-top). Newer values overwrite earlier
         % values at the same position
         % STACK: 32, [8 0 2 0 0 2 0 0 6]
V        % Convert to string. This produces spaces between the numbers
         % STACK: 32, '8 0 2 0 0 2 0 0 6'
h        % Concatenate with initial 32 (space). This converts to char
         % STACK: ' 8 0 2 0 0 2 0 0 6'
         % Thanks to this initial space, all zeros that need to be replaced by '_'
         % are preceded by spaces. (In this example that initial space would not
         % be needed, but in other cases it will.) Other zeros, which are part of
         % a number like '10', must not be replaced
' 0'     % Push this string: source for string replacement
         % STACK: ' 8 0 2 0 0 2 0 0 6', ' 0 '
95       % Push 95 (ASCII for '_'): target for string replacement
         % STACK: ' 8 0 2 0 0 2 0 0 6', ' 0 ', 95
Zt       % String replacement
         % STACK: ' 8_2__2__6'
Xz       % Remove spaces. Implicit display
         % STACK: '8_2__2__6'

Eu acho que você poderia salvar dois bytes, substituindo '0', em vez de ' 0 ', porque Xzremove os espaços depois
B. Mehta

11
@ B.Mehta Obrigado. Inicialmente fiz isso, mas infelizmente não funciona, porque o '0'in também '10'é substituído. É por isso que eu adiciono uma inicial 32também
Luis Mendo

Ah, claro, meu erro #
B. Mehta

@ B.Mehta Não, isso não ficou claro com a minha explicação. Vou esclarecer isso mais tarde
Luis Mendo

11
A matriz mod 2 é invertida na explicação. E também, não ' 0'funcionaria tão bem?
Emigna

4

PHP, 100 101 99 104 bytes

for($p=-1;$d=$argv[++$k];+$i<$p?:$i=$p,$x>$p?:$x=$p)$r[$p+=$k&1?$d:-$d]=$d;for(;$i<=$x;)echo$r[$i++]?:_;

recebe entrada de argumentos de linha de comando; corra com -nr.

demolir

for($p=-1;          // init position
    $d=$argv[++$k]; // loop $d through command line arguments
    +$i<$p?:$i=$p,          // 3. $i=minimum index
    $x>$p?:$x=$p            // 4. $x=maximum index
)
    $r[
        $p+=$k&1?$d:-$d     // 1. jump: up for odd indexes, down else
    ]=$d;                   // 2. set result at that position to $d
for(;$i<=$x;)           // loop $i to $x inclusive
    echo$r[$i++]?:_;        // print result at that index, underscore if empty

Como isso lida com a entrada de exemplo 2,3,6,8,2, onde os 8saltos "para trás" passam do "começo" dos lírios?
AdmBorkBork 23/02

@AdmBorkBork O PHP suporta índices de matriz negativos.
Titus

Ah, não sabia disso. Obrigado!
AdmBorkBork 23/02

4

JavaScript (ES6), 99 107 bytes

Editar: como o OP esclareceu que o único limite deveria ser a memória disponível, isso foi atualizado para alocar exatamente o espaço necessário, em vez de depender de um intervalo máximo codificado.

f=(a,x='',p=M=0)=>a.map(n=>x[(p-=(i=-i)*n)<m?m=p:p>M?M=p:p]=n,i=m=1)&&x?x.join``:f(a,Array(M-m).fill`_`,-m)

Como funciona

Esta função funciona em duas passagens:

  • Durante o primeiro passe:

    • O 'ponteiro do sapo' p é inicializado para0 .
    • o x variável é definida como uma sequência vazia, para que todas as tentativas de modificá-la sejam simplesmente ignoradas.
    • Calculamos me Mquais são, respectivamente, os valores mínimo e máximo alcançados porp .
    • No final deste passe: fazemos uma chamada recursiva para f().
  • Durante o segundo passe:

    • pé inicializado para -m.
    • xé definido como uma matriz de tamanho M-m, preenchida com_ caracteres.
    • Nós inserimos os números nas posições corretas em x .
    • No final deste passo: retornamos uma versão unida de x, que é o resultado final.

Casos de teste


Isso falha nos casos em que o sapo salta abaixo do índice -998 ou acima de 1002. Exemplo: [1100]resulta no número impresso na posição em 1002vez de na posição 1100.
Ndscore 23/02

11
@nderscore Isso é fixo, ao custo de 8 bytes.
Arnauld

impressionante! bom método também :)
nderscore

4

R , 100 97 96 bytes

function(x){p=cumsum(x*c(1,-1))[seq(x^0)]
p=p+max(1-p,0)
v=rep('_',max(p));v[p]=x
cat(v,sep='')}

Experimente online!

A linha 1 encontra todas as posições para onde saltar. Primeiro, todos os saltos xsão multiplicados por 1 ou -1 e depois transformados nas posições finais usando a soma acumulada. O vetor c(-1,1)é reciclado, se necessário; no entanto, quando xtiver o comprimento 1, xé reciclado. Portanto, apenas seq(x^0)(equivalentes a seq_along(x)) somas são consideradas. (Um aviso é gerado quando o comprimento dex não é múltiplo de 2, mas não afeta o resultado)

A linha 2 aumenta as posições de salto para que todos sejam pelo menos 1.

As linhas 3 e 4 criam a saída e imprimem.

-1 byte de Giuseppe


truque puro com seq(x^0)!
Giuseppe

-p+1pode ter 1-pum byte a menos.
Giuseppe

@ Giuseppe Ah, definitivamente, obrigado!
Robert Hacken

3

Javascript (ES6), 109 bytes

f=x=>x.map((y,i)=>o[j=(j-=i%2?y:-y)<0?o.unshift(...Array(-j))&0:j]=y,o=[],j=-1)&&[...o].map(y=>y||'_').join``
<!-- snippet demo: -->
<input list=l oninput=console.log(f(this.value.split(/,/)))>
<datalist id=l><option value=5><option value="4,3,2,1"><option value="5,3,2,1"><option value="2,3,6,8,2"><option value="10,3,12,4,1,12,16"><option value="100,4,7,2,2"></datalist>

Comentado:

f=x=>x.map((y,i)=>o[j=(j-=i%2?y:-y)<0?o.unshift(...Array(-j))&0:j]=y,o=[],j=-1)&&[...o].map(y=>y||'_').join``
                /* initialize output array [] and index j at -1: */  o=[],j=-1
     x.map((y,i)=> /* iterate over all items in input x (y=item, i=index) */  )
                      (j-=i%2?y:-y) /* update j +/-y based on if index i is odd */
                                   <0? /* if resulting j index is less than zero */
                                      o.unshift(...Array(-j)) /* prepend -j extra slots to the output array */
                                                             &0 /* and give result 0 */
                                                               :j /* else give result j */
                    j= /* assign result to j */
                  o[ /* assign y to output array at index j */   ]=y
   /* short-circuit && then spread output array to fill any missing entries */ &&[...o]
                                                      /* fill falsey slots with '_' */ .map(y=>y||'_')
                                                                         /* join with empty spaces */ .join``

3

Perl 6 , 68 67 bytes

{(my @a)[[[\+] |(1,-1)xx*Z*$_].&{$_ X-min 1,|$_}]=$_;[~] @a X//"_"}

Experimente online!

Como funciona

Primeiro, ele determina os locais de salto cumulativos:

[[\+] |(1,-1)xx*Z*$_]
                  $_  # Input array.          e.g.  2, 3, 6, 8, 2
      |(1,-1)xx*      # Infinite sequence:          1,-1, 1,-1, 1...
                Z*    # Zip-multiplied.       e.g.  2,-3, 6,-8, 2
 [\+]                 # Cumulative addition.  e.g.  2,-1, 5,-3,-1

Em seguida, os transforma em índices de matriz baseados em 0, subtraindo o número mínimo (mas no máximo 1) de todos os números:

.&{$_ X-min 1,|$_}    #                       e.g.  5, 2, 8, 0, 2

Em seguida, cria uma matriz com os números de entrada atribuídos a esses índices:

(my @a)[   ]=$_;      #                       e.g.  8, Nil, 2, Nil, Nil, 2 Nil, Nil, 6

Por fim, concatena a matriz para uma cadeia de caracteres, com o sublinhado no lugar de elementos indefinidos:

[~] @a X//"_"         #                       e.g.  8_2__2__6

3

Geléia ,  28  24 bytes

-2 (e permitindo ainda mais -2) graças ao FrownyFrog (use a funcionalidade [pós-desafio] do aplicativo de prefixo rapidamente Ƥ)

ṚƤḅ-µCṀ»0+µṬ€×"³Ṛo/o”_;⁷

Experimente online! Programa completo, para um conjunto de testes com a mesma funcionalidade, clique aqui .

Quão?

ṚƤḅ-µCṀ»0+µṬ€×"³Ṛo/o”_;⁷ - Main link: list a       e.g. [ 5, 3, 2, 1]
 Ƥ                       - prefix application of:
Ṛ                        -  reverse                e.g. [[5],[3,5],[2,3,5],[1,2,3,5]]
   -                     - literal minus one
  ḅ                      - from base (vectorises)  e.g. [ 5, 2, 4, 3]=
    µ                    - start a new monadic chain - call that list c
                         - [code to shift so minimum is 1 or current minimum]
     C                   - complement (vectorises) e.g. [-4,-1,-3,-2]
      Ṁ                  - maximum                 e.g.     -1
       »0                - maximum of that & zero  e.g.      0
         +               - add to c (vectorises)   e.g. [ 5, 2, 4, 3]
          µ              - start a new monadic chain - call that list d
           Ṭ€            - untruth €ach            e.g. [[0,0,0,0,1],[0,1],[0,0,0,1],[0,0,1]]
               ³         - the program input (a)
             ×"          - zip with multiplication e.g. [[0,0,0,0,5],[0,3],[0,0,0,2],[0,0,1]]
                Ṛ        - reverse                      [[0,0,1],[0,0,0,2],[0,3],[0,0,0,0,5]]
                 o/      - reduce with or          e.g. [0,3,1,2,5]
                    ”_   - '_'
                   o     - or (replace 0 with '_') e.g. ['_',3,1,2,5]
                      ;⁷ - concatenate a newline   e.g. ['_',3,1,2,5, '\n']
                         - implicit print

Notas:

A concatenação final de uma nova linha ;⁷é para os casos em que não _aparece na saída; nesse caso, a impressão implícita exibirá uma representação da lista, por exemplo [3, 1, 2, 4], em vez de algo como o exemplo _3125. Para nenhuma nova linha à direita, uma pessoa poderia substituir ;⁷por ;““para adicionar uma lista de listas de caracteres [[''],['']](não é necessário fechar , pois é o último caractere de um programa).

A função inverdade, Ṭ, fornece uma lista com 1s nos índices em sua entrada, para um único número natural, n que é n-1 0 s seguido por uma 1permissão que permite que os números de entrada sejam colocados na sua distância correta da esquerda por multiplicação . A reversão,, é necessária para que as visitas de sapo sejam substituídas mais tarde do que as anteriores , quando a redução com ou o/, é realizada.


1,-ṁ×µ+\UƤ_@/€?
FrownyFrog

Ƥnão era um recurso no momento em que isso foi escrito, mas sim, isso funcionará. Melhor é UƤḅ€-(já que a conversão da base -1 é como multiplicar ...,1,-1,1,-1,1,-1,1e somar).
Jonathan Allan

... ou mesmo UƤḅ-desde vetorizar :) (Eu também fui com o contrário , já que não precisamos da complexidade do upend U)
Jonathan Allan

1

APL (Dyalog Unicode) , 45 SBCS de 30 bytes

{∊⍕¨⍵@i⍴∘'_'⌈/1+i←(⊢-1⌊⌊/)-\⍵}

Experimente online!

-\⍵varra o argumento alternando -e+

(⊢ - 1 ⌊ ⌊/)disso ( ) subtraia 1 ou o mínimo ( ⌊/), o que for menor ( )

i← atribuir a i

⌈/ 1+ incrementar e tirar o máximo

⍴∘'_' produzir que muitos sublinhados

⍵@icoloque os números do argumento ( ) nas posiçõesi

∊⍕¨ formatar cada um e achatar


0

Rubi , 85 bytes

->a{i=1;j=c=0;a.map{|x|[c-=x*i=-i,x]}.to_h.sort.map{|x,y|[?_*[x+~j,0*j=x].max,y]}*''}

Experimente online!

Registra as posições após cada salto, converte a matriz resultante em hash para remover duplicatas (preservando o último valor em cada posição duplicada) e cola os valores com a quantidade necessária de sublinhados.


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.