Jogando Pickomino


10

No jogo Pickomino , existem várias peças no meio da mesa, cada uma com um número inteiro positivo diferente. A cada turno, os jogadores jogam dados de uma certa maneira e recebem uma pontuação, que é um número inteiro não negativo.

Agora o jogador pega o ladrilho com o número mais alto que ainda é menor ou igual à sua pontuação, removendo o ladrilho do meio e adicionando-o à sua pilha. Se isso não for possível, porque todos os números no meio são maiores que a pontuação do jogador, o jogador perde o bloco mais alto da pilha (que foi adicionada mais recentemente), que é retornada ao meio. Se o jogador não tiver mais peças, nada acontece.

O desafio

Simule um jogador jogando o jogo contra si mesmo. Você recebe uma lista dos ladrilhos no meio e uma lista das pontuações que o jogador obteve. Retorne uma lista dos ladrilhos do jogador após todos os turnos terem sido avaliados.

Regras do desafio

  • Você pode assumir que a lista com os blocos é ordenada e não contém nenhum número inteiro duas vezes.
  • Você pode pegar as duas listas de entrada na ordem que desejar
  • A saída deve manter a ordem dos blocos na pilha, mas você pode decidir se a lista é classificada de cima para baixo ou de baixo para cima.

Regras gerais

  • Isso é , então a resposta mais curta em bytes vence.
    Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação.
  • As regras padrão se aplicam à sua resposta com as regras de E / S padrão , para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno.
  • As brechas padrão são proibidas.
  • Se possível, adicione um link com um teste para o seu código (ou seja, TIO ).
  • É recomendável adicionar uma explicação para sua resposta.

Exemplo

(retirado do 6º caso de teste)

Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: [22, 22, 22, 23, 21, 24, 0, 22]

A primeira pontuação é 22, portanto, pegue o bloco mais alto no meio <= 22, que é o próprio 22.

Middle: [21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Stack: [22]
Remaining scores: [22, 22, 23, 21, 24, 0, 22] 

A pontuação seguinte é 22, portanto, pegue o ladrilho mais alto no meio <= 22. Como 22 já foi tirado, o jogador deve levar 21.

Middle: [23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Stack: [22, 21]
Remaining scores: [22, 23, 21, 24, 0, 22]

A próxima pontuação é 22, mas todos os números <= 22 já estão sendo usados. Portanto, o jogador perde o bloco mais alto da pilha (21), que é devolvido ao meio.

Middle: [21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Stack: [22]
Remaining scores: [23, 21, 24, 0, 22]

As próximas pontuações são 23, 21 e 24, então o jogador pega essas peças do meio.

Middle: [25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Stack: [22, 23, 21, 24]
Remaining scores: [0, 22]

O jogador rebenta e marca zero. Portanto, o bloco com o número 24 (no topo da pilha) é retornado para o meio.

Middle: [24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Stack: [22, 23, 21]
Remaining scores: [22]

A última pontuação é 22, mas todas as peças <= 22 já estão ocupadas, então o jogador perde a peça mais alta da pilha (21).

Middle: [21, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Final Stack and Output: [22, 23]

Casos de teste

(com o bloco mais alto último na lista de saída)

Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: [26, 30, 21]
Output: [26, 30, 21]

Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: [35, 35, 36, 36]
Output: [35, 34, 36, 33]

Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: [22, 17, 23, 19, 23]
Output: [23]

Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: []
Output: []

Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: [22, 17, 23, 19, 23, 0]
Output: []

Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: [22, 22, 22, 23, 21, 24, 0, 22]
Output: [22, 23]

Tiles: [1, 5, 9, 13, 17, 21, 26]
Scores: [6, 10, 23, 23, 23, 1, 0, 15]
Output: [5, 9, 21, 17, 13, 1]

Tiles: []
Scores: [4, 6, 1, 6]
Output: []

Caixa de areia


Podemos assumir que não há blocos com um valor zero no meio?
Modalidade de ignorância

@EmbodimentofIgnorance Diz "número inteiro positivo", então sim.
Ørjan Johansen

Como as peças são únicas, seria aceitável tomá-las como uma máscara de bit?
Arnauld

@TRITICIMAGVS Sim, se a pilha do meio é vazio, o jogador pode não ter uma telha do meio, para que eles perdem uma telha (se tiver)
Coruja preta Kai

@Arnauld Isso é aceitável
Black Owl Kai

Respostas:


3

Haskell , 119 111 104 103 bytes

1 byte economizado graças a Ørjan Johansen

(#)=span.(<)
(a%(b:c))d|(g,e:h)<-b#d=(e:a)%c$g++h|g:h<-a,(i,j)<-g#d=h%c$i++g:j|1>0=a%c$d
(a%b)c=a
([]%)

Experimente online!

Assume que os blocos são classificados em ordem decrescente.

Não há muita fantasia acontecendo aqui. O primeiro argumento é a pilha de jogadores, o segundo a pontuação e o terceiro é a pilha no meio.


11
Isso não pode estar certo, porque sortestá em ascensão. O caso de teste do TIO nunca atinge esse ramo, no entanto. Eu recomendo testar todos os casos sempre que iterar dessa maneira.
Ørjan Johansen

@ ØrjanJohansen Obrigado! Corrigido agora. Pelo menos não preciso mais importar!
Ad Hoc Garf Hunter

Salve um byte com (#)=span.(<).
Ørjan Johansen

@ ØrjanJohansen Alteração feita. O engraçado é que eu tentei isso antes e pensei que ele adicionava um byte.
Ad Hoc Garf Hunter

3

Japt, 24 bytes

Oof! Isso não funcionou tão bem quanto eu pensei!

Recebe a entrada na ordem inversa.

®=Va§Z)Ì?NpVjZ:VpNo)nÃN¤

Experimente ou execute todos os casos de teste no TIO

®=Va§Z)Ì?NpVjZ:VpNo)nÃN¤     :Implicit input of N=[U=scores, V=tiles]
®                            :Map each Z in U
 =                           :  Reassign to Z
  Va                         :    0-based index of last element in V (-1 if not found)
    §Z                       :      Less than or equal to Z
      )                      :  End reassignment
       Ì                     :  Sign of difference with -1 (1 if found, 0 if not)
        ?                    :  If truthy (not zero)
         Np                  :    Push to N
           VjZ               :      Remove and return the element at index Z in V
              :              :  Else
               Vp            :    Push to V
                 No          :      Pop the last element of N
                   )         :    End Push
                    n        :    Sort V
                     Ã       :End map
                      N¤     :Slice the first 2 elements (the original inputs) off N

2

Perl 6 , 89 bytes

{my@x;@^a;@^b>>.&{@x=|@x,|(keys(@a@x).grep($_>=*).sort(-*)[0]//(try ~@x.pop&&()))};@x}

Experimente online!

Eu acho que há mais alguns bytes a serem jogados fora disso ...


2

C # (Compilador interativo do Visual C #) , 159 158 154 bytes

Chamado como f(tiles)(scores)

n=>m=>{var s=new Stack<int>();m.Add(0);n.ForEach(k=>{var a=m.Except(s).Where(x=>x<=k).Max();if(a<1)m.Add(s.Count<1?0:s.Pop());else s.Push(a);});return s;}

Se apenas System.Voidé realmente um tipo de retorno e não apenas um espaço reservado para reflexão. Eu seria capaz de substituir if(a<1)m.Add(s.Count<1?0:s.Pop());else s.Push(a);com var t=a>1?m.Add(s.Count<1?0:s.Pop()):s.Push(a);, salvando dois bytes.

Experimente online!

//Function taking in a list and returning
//another function that takes in another list and returns a stack
n=>m=>{
//Initialize the stack
var s=new Stack<int>();
//Add a zero to the tiles, to ensure no exceptions appear due to accessing
//non-existent elements in an empty collection later
//when we try to filter it later and getting the biggest element
m.Add(0);
//Iterate through our scores
n.ForEach(k=>{
//Create a variable called a, which we will use later
var a=
//Get all the elements in the middle that haven't appeared in our stack
m.Except(s).
//And throw away all elements that are bigger than our current score
Where(x=>x<=k).
//And get the biggest element there, and that is now the value of a
//Without the m.Add(0), we would get an exception here
Max();
//Self-explanatory, if a is less than 1 aka if a equals 0
//Checks if all elements in the middle are bigger than our score 
//Except for our self added 0, of course
if(a<1)
//Add 0 to the middle if the stack is empty
//Remember, zeros don't affect the list
m.Add(s.Count<1?0:
//Else pop the stack and add that to the middle
s.Pop());
//If a isn't 0, add a to the stack
else s.Push(a);});
//Afterwards, return the stack
return s;}


2

JavaScript (Node.js) , 80 bytes

A mesma lógica da versão ES6, mas usa os blocos como uma máscara de bits BigInt e as pontuações como uma matriz de BigInts.

m=>s=>s.map(g=x=>!x||m>>x&1n?m^=1n<<(x?r.push(x)&&x:r.pop()||~x):g(--x),r=[])&&r

Experimente online!


JavaScript (ES6),  100 98 94  87 bytes

Toma entrada como (tiles)(scores). Os ladrilhos podem ser passados ​​em qualquer ordem.

t=>s=>s.map(g=x=>m[x]?m[x?r.push(x)&&x:r.pop()]^=1:g(x-1),t.map(x=>m[x]=1,m=[r=[]]))&&r

Experimente online!

Comentado

t => s =>                 // t[] = tiles; s[] = scores
  s.map(g = x =>          // for each score x in s[]:
    m[x] ?                //   if m[x] is set:
      m[                  //     update the 'middle':
        x ?               //       if x is not equal to 0:
          r.push(x) && x  //         push x in the stack r[] and yield x
        :                 //       else:
          r.pop()         //         pop the last value from the stack
                          //         (may be undefined if the stack is empty)
      ] ^= 1              //     toggle the corresponding flag in m[]
    :                     //   else:
      g(x - 1),           //     try again with x - 1
    t.map(x =>            //   initialization of the 'middle': for each value x in t[]:
      m[x] = 1,           //     set m[x]
      m = [r = []]        //     the stack r[] is stored as the first entry of m[],
                          //     which ensures that g will always stop when x = 0
    )                     //   end of initialization
  ) && r                  // end of main loop; return r[]

1

Carvão , 35 bytes

Fη«≔⌈Φ講κιι¿ι«≔Φθ⁻κιθ⊞υι»¿υ⊞θ⊟υ»Iυ

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

Fη«

Loop sobre as pontuações.

≔⌈Φ講κιι

Procure o ladrilho mais alto disponível.

¿ι«

Se existir, então ...

≔Φθ⁻κιθ

... retire o ladrilho do meio ...

⊞υι

... e adicione-o à pilha.

»¿υ

Caso contrário, se a pilha não estiver vazia ...

⊞θ⊟υ

Remova o bloco mais recente da pilha e retorne-o ao meio.

»Iυ

Imprima a pilha resultante da mais antiga para a mais nova.



1

05AB1E , 27 22 bytes

vÐy>‹ÏDgĀià©K®së\sª])¨

Experimente online ou verifique todos os casos de teste .

Explicação:

v            # Loop `y` over the (implicit) input-list of scores:
 Ð           #  Triplicate the tiles list (takes it as implicit input in the first iteration)
  y>‹        #  Check for each if `y` <= the value in the tiles list
     Ï       #  Only leave the values at the truthy indices
 D           #  Duplicate the remaining tiles
  ¯Êi        #  If this list is not empty:
     à       #   Pop the list, and push its maximum
      ©      #   Store it in the register, without popping
       K     #   Remove it from the tiles list
        ®    #   Push the maximum again
         s   #   Swap the maximum and tiles-list on the stack
    ë        #  Else:
     \       #   Remove the duplicated empty tiles-list from the stack
      sª     #   Add the last tile to the tiles-list
]            # Close the if-else and loop
 )           # Wrap everything on the stack into a list
  ¨          # Remove the last item (the tiles-list)
             # (and output the result implicitly)

1

Pitão, 32 bytes

VE ?JeS+0f!>TNQ=-QeaYJaQ.)|Y]0;Y

Experimente on-line aqui ou verifique todos os casos de teste de uma vez aqui .

Deve haver espaço para melhorias aqui em algum lugar - qualquer sugestão seria muito apreciada!

VE ?JeS+0f!>TNQ=-QeaYJaQ.)|Y]0;Y   Implicit: Q=input 1 (middle), E=input 2 (scores), Y=[]
VE                            ;    For each score, as N, in the second input:
         f    Q                      Filter Q, keeping elements T where:
          !>TN                         T is not greater than N 
                                       (less than or equal is the only standard inequality without a token in Pyth, grrr)
       +0                            Prepend 0 to the filtered list
     eS                              Take the largest of the above (_e_nd of _S_orted list)
    J                                Store the above in J
   ?                                 If the above is truthy:
                   aYJ                 Append J to Y
                  e                    Take last element of Y (i.e. J)
               =-Q                     Remove that element from Q and assign the result back to Q
                                     Else:
                          |Y]0         Yield Y, or [0] if Y is empty
                        .)             Pop the last element from the above (mutates Y)
                      aQ               Append the popped value to Q
                               Y   Print Y

1

Perl 5 -apl -MList:Util=max, 97 bytes

$_=$".<>;for$i(@F){(($m=max grep$_<=$i,/\d+/g)&&s/ $m\b//?$s:$s=~s/ \d+$//?$_:$G).=$&}$_=$s;s/ //

TIO

lê partituras e blocos na próxima linha e imprime a saída.

Quão

  • -apl: -pfazer um loop sobre linhas e imprimir, -adivisão automática, -lpara mastigar da entrada e adicionar caracteres de nova linha à saída
  • $_=$".<> : para ler a próxima linha (blocos) e colocar um espaço no var padrão $_
  • for$i(@F){... }laço $imais @Fcampos da linha atual (pontuação)
  • (.. ?.. :.. ).=$&append jogo anterior para l-valor ternário
  • ($m=max grep$_<=$i,/\d+/g)&&s/ $m\b//?$scaso o valor máximo encontrado e removido dos blocos ( $_) o valor l seja scores ( $s)
  • $s=~s/ \d+$//?$_ caso contrário, se o último número puder ser removido da pontuação, são peças
  • :$G finalmente é lixo porque não pode ocorrer
  • $_=$s;s/ // para definir pontuações como var padrão e remover o espaço inicial
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.