Analisar aleatoriamente overhanded

13

Rod está moderando um jogo de cartas entre dois jogadores: George e Tim. Atualmente, Tim está baralhando as cartas. Rod suspeita que Tim está tentando trapacear, então ele precisa de sua ajuda para verificar se o embaralhamento é justo.

Tim está fazendo o barulho excessivo: ele corta uma pilha de cartas do fundo do baralho, corta várias partes do topo da pilha para o topo do baralho e repete o processo algumas vezes.

Rod tem olhos de águia e pode ver exatamente quantas cartas Tim está cortando a cada vez, no entanto, ele não pode calcular e acompanhar as cartas tão rápido quanto Tim está embaralhando. É aqui que você entra: Rod deseja que você escreva um programa ou função que obtenha as informações detalhadas de embaralhamento e determine se o embaralhamento é justo, fraco ou um truque.

  • Se após o embaralhamento, menos de 25 pares de cartas adjacentes permanecem adjacentes (na mesma ordem), o embaralhamento é justo e o jogo pode continuar.
  • Se pelo menos 25 pares (mas não todos) de cartas adjacentes permanecerem adjacentes, o baralhamento será fraco e Rod dará um tapa na cabeça de Tim e pedirá que ele embaralhe um pouco mais.
  • Se todas as cartas permanecerem na mesma posição no final, Tim está obviamente trapaceando e Rod o golpeará com uma grande truta.

Isso é código de golfe, então o código mais curto vence.

Entrada:

Você receberá uma série de números entre 0 e 52 (ambos exclusivos) separados por espaço, em várias linhas, onde cada linha representa uma rodada de embaralhamento que começa e termina com todas as cartas empilhadas.

Em cada linha, o primeiro número é o número de cartas que Tim corta da parte inferior do baralho, e cada número subseqüente é um número de cartas que ele solta da mão para o topo do baralho. Se alguma carta permanecer após o último número de uma linha, você deve assumir que Tim as coloca no topo do baralho.

A entrada é garantida como válida. Há pelo menos uma linha de números e cada linha contém pelo menos 2 números. O primeiro número em cada linha não é menor que a soma de todos os outros números na mesma linha. Uma nova linha à direita é opcional, você pode assumir que a entrada possui uma ou que não possui.

Resultado:

Seu programa deve imprimir / retornar "razoável" se o shuffle for justo, "fraco" se o shuffle for fraco e "truque" se Tim estiver mantendo todas as cartas na mesma ordem. Uma nova linha à direita é opcional.

Exemplo:

Presume-se que o baralho tenha 52 cartas, mas, para fins de demonstração, usarei um baralho menor de 10 cartas.

Entrada:

5 3 1
4 2 2

Convés inicial, visto de cima: 0 1 2 3 4 5 6 7 8 9
50 1 2 3 4( 5 6 7 8 9na mão)
35 6 7 0 1 2 3 4( 8 9na mão)
18 5 6 7 0 1 2 3 4( 9na mão)
final da linha ➜ 9 8 5 6 7 0 1 2 3 4
49 8 5 6 7 0( 1 2 3 4na mão)
21 2 9 8 5 6 7 0( 3 4na mão)
23 4 1 2 9 8 5 6 7 0
4 pares permanecem adjacentes:(3 4) (1 2) (5 6) (6 7)

Casos de teste:

43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5

Resultado: fair


43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5

Resultado: weak


29 24
19 18
38 2 1 8 13 6 4
47 15 16 5 2 1 7
34 22 9 3
44 9 10 11 3 1 7
33 18 4 2 3 3

Resultado: fair


24 6 12 4
25 3 19
36 4 25 2
19 11 1 3
15 9 3
37 5 27

Resultado: weak


26 13
26 13
26 13
26 13

Resultado: trick


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Resultado: weak


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Resultado: trick


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
49 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Resultado: fair

Requisitos:

  • Se você escrever uma função, ela poderá ler a partir da entrada padrão ou receber a entrada como um único parâmetro de sequência. Além disso, a função pode imprimir a saída ou devolvê-la.
  • O programa deve ser executável no Linux usando software disponível gratuitamente.
  • O código fonte deve usar apenas caracteres ASCII.
  • Sem brechas padrão.
aditsu sair porque SE é MAU
fonte
2
Por que a restrição ao ASCII? Muitos idiomas (APL, código de máquina, TI-BASIC) não usam ASCII, portanto você os está implicitamente proibindo.
lirtosiast
@ThomasKwa Porque não gosto dos problemas associados à exibição e contagem de caracteres não ASCII. Alguns desses idiomas têm representações ou alternativas ASCII. Eu acho que não é uma restrição muito dura e nivela levemente o campo de jogo.
aditsu encerrou porque SE é MAU
Acho que um sistema de pontuação como "Entradas que usam apenas caracteres ASCII imprimíveis terá sua contagem de bytes multiplicada por log (95) / log (256)" seria uma opção melhor se você deseja incentivar de maneira justa os envios de ASCII imprimíveis. O raciocínio é que o conteúdo informativo das entradas com a mesma pontuação seria igual. Pessoalmente, eu ainda preferiria uma pontuação simples por bytes.
lirtosiast
@ThomasKwa Ok, que tal isso? Somente caracteres Unicode imprimíveis, contagem de bytes em UTF-8
aditsu sair porque SE é MAL

Respostas:

3

Pitão, 62 bytes

@c"weak trick fair"d-!JlfhT-M.:us_cG.u+NYtKrH7-52hK.zU52 2>J26

Demonstração.

isaacg
fonte
4

CJam, 76 75 bytes

52,qN/{[~](52\-@/(\e_@{/(@+\e_}/\+}/2ew::m2f/0-,_!\26>-"weak trick fair"S/=

Experimente on-line no intérprete CJam .

Dennis
fonte
5
LOL, "trout" :)
aditsu saiu porque o SE é MAU
2

JavaScript, 292 289 bytes

Provavelmente, isso poderia extrair mais bytes, mas é uma primeira passagem rápida por enquanto:

d=[];for(i=0;i<52;i+=1)d[i]=i
s=prompt().split('\n')
s.forEach(function(e,i){s[i]=e.split(' ')
h=d.splice(-s[i][0],99)
for(j=1;j<s[i].length;j+=1)d.unshift.apply(d,h.splice(0,s[i][j]))
d.unshift.apply(d,h)})
for(c=0;i>1;i-=1)if(d[i-2]==d[i-1]-1)c+=1
alert(c<25?"fair":c<51?"weak":"trick")

EDIT: economizou 3 bytes reutilizando o valor do iloop de construção de baralho ao contar o número de cartões adjacentes.

Sean Latham
fonte