Crianças baralhar cartões

12

Baralhar um baralho de cartas é difícil para as crianças, então elas precisam descobrir maneiras de obter um baralho bem baralhado razoável o mais simples possível.

Uma maneira de fazer isso que fornece resultados razoavelmente bons é:

  1. Retire o cartão superior e insira-o em um local aleatório no baralho
  2. Retire o cartão de baixo e insira-o em um local aleatório no baralho
  3. Continue até achar que é bom o suficiente.

Observe que você nunca deve inserir um cartão no topo ou no fundo, ele deve ser colocado em algum lugar do baralho.


Em vez de baralhar cartas, vamos embaralhar caracteres alfanuméricos: 0-9, A-J, a-j, q-ze Q-Z.

Comece com a sequência mostrada abaixo e embaralhe os caracteres da maneira descrita acima. Você pode escolher se deseja continuar baralhando infinitamente ou embaralhar as cartas 100 rodadas (100 cartas da parte superior e 100 cartas da parte inferior).

0123456789abcdefghijqrstuvwxyzABCDEFGHIJQRSTUVWXYZ

O desafio é exibir os personagens sendo embaralhados. Cada "ordem aleatória" (retirar e inserir cartão) deve levar entre 0,25 e 0,35 segundos.

O gif abaixo mostra um exemplo de saída:

insira a descrição da imagem aqui


Isso é portanto o código mais curto em bytes vence.


"Por que você não tem a-t, em vez de a-j, q-z?" Porque isso deve ilustrar naipes de cartas, não apenas personagens. E sim, existem 5 naipes.


Nota: Decidi parar de usar a marca de seleção em -challenges. Meta posts relevantes aqui e aqui .

Stewie Griffin
fonte
Como existem 5 fatos?
TrojanByAccident
1
@TrojanByAccident Os cinco conjuntos são cartões (caracteres ASCII) por ação são 0-9, A-J, a-j, q-ze Q-Z, de acordo com a questão.
mbomb007
e há 50 cartas, não 52. talvez as crianças tenham perdido algumas.
Jasen
@ mbomb007 Eu estava perguntando como havia 5 naipes de cartas. A menos que eu esteja perdendo alguma coisa, só existem espadas, paus, copas e diamantes. Isso é 4.
TrojanByAccident
2
@TrojanByAccident Isso não usa cartões. Ele usa ASCII em vez de cartões. Estes são os cinco processos da ASCII. Em vez de baralhar cartas, vamos embaralhar caracteres alfanuméricos
mbomb007

Respostas:

5

JavaScript (ES6), 192 188185 bytes

document.write('<pre id=o>')
s='ABCDEFGHIJQRSTUVWXYZ'
a=[0,...123456789+s.toLowerCase()+s]
setInterval('o.innerText=a.join``;a.splice(Math.random(s^=1)*48+1,0,s?a.pop():a.shift())',250)

Editar: salvou 4 bytes graças a @ L.Serné. Economizou 3 bytes graças a @Arnauld.

Neil
fonte
Eu acho que você pode salvar alguns bytes se você se mover e^=1dentro dos parênteses vazios da Math.randomchamada. Você também pode alterar textContent para innerHTML, já que não está transmitindo caracteres especiais. Você também pode definir e0 na toLowerCasechamada.
Lucas
Você realmente não precisa e. Você poderia apenas usar s. (Porque ('some_string'^1) === 1)
Arnauld
4

MATL, 62 58 56 bytes

2 bytes salvos graças a @Luis

4Y2'A':'J'tk'Q':'Z'tk&h`48YrQJh&)@o?l&)wb}wO&)]&htD3&XxT

Esta versão será executada indefinidamente. Experimente a demonstração online no MATL Online , um intérprete experimental online que suporta saída dinâmica. Isso será executado por 30 segundos (um limite rígido imposto pela versão online) se não for eliminado primeiro.

Explicação

4Y2     % Predefined literal for the characters '0'...'9'
'A':'J' % Create an array of the characters 'A'...'J'
tk      % Duplicate and make lowercase
'Q':'Z' % Create an array of the characters 'Q'...'Z'
tk      % Duplicate and make lowercase
&h      % Horizontally concatenate everything
`       % Do...while loop
  48YrQ % Determine a random integer between 2 and 49 
  Jh&)  % Split the string at the selected location
  @o?   % If this is an odd time through the loop
    l&) % Grab the first character
    wb  % Move it to the middle of the stack of three strings
  }     % Else...
    wO&)% Grab the last character and move it to the middle of the stack
  ]     % End of if statment
  &h    % Horizontally concatenate all strings on the stack
  tD    % Duplicate and display the current string
  3&Xx  % Pause for 0.3 seconds and clear the display
  T     % Push a literal TRUE to the stack to make this an infinite loop
        % Implicit end of while loop
Suever
fonte
4

Perl, 117 bytes

@F=(0..9,a..j,"q"..z,A..J,Q..Z);{print"\r",@F;splice@F,++$|+rand(@F-2),0,++$v%2?shift@F:pop@F;select$,,$,,$,,.3;redo}

Para executá-lo:

perl -e '@F=(0..9,a..j,"q"..z,A..J,Q..Z);{print"\r",@F;splice@F,++$|+rand(@F-2),0,++$v%2?shift@F:pop@F;select$,,$,,$,,.3;redo}'

Explicações:
- @F=(0..9,a..j,"q"..z,A..J,Q..Z)cria o deck inicial e o armazena @F.
- {...;redo}executa ...para sempre.
- splice@F,++$|+rand(@F-2),0,++$v%2?shift@F:pop@Falternativamente, remova o primeiro / último elemento do deck e insira-o em uma posição aleatória (enquanto aumenta $|, para que as impressões não sejam armazenadas em buffer),
- print"\r",@Fimprime o deck,
- select$,,$,,$,,.3dorme por 0,3 segundos (o Perl sleepnão consegue dormir por menos de 1 segundo),

dada
fonte
o intervalo numérico é 0..9, não 1..9, e sua plataforma inicial está fora de ordem, bem :)
ardnew
@ardnew de fato, obrigado. Eu devo estar cansado quando escrevi este código. É corrigido de qualquer maneira :)
Dada
4

Python 3, 199 196 192 186 bytes

Economizou 4 bytes graças ao TuukkaX e 6 bytes graças ao FlipTack!

import time,random
s="abcdefghijqrstuvwxyz";s="0123456789"+s+s.upper()
f=0
while 1:print(end="\r"+s);time.sleep(.3);s,e=s[1^f:50-f],s[f and-1];i=random.randint(1,49);s=s[:i]+e+s[i:];f^=1

Usa a printfunção do Python 3 para suprimir nova linha, menor que a do Python 2 sys.stdout.write.

Usa uma variável flip-flop para alternar entre mover as cartas superior e inferior.

Ungolfed:

from random import randint
from time import sleep

string = "abcdefghijqrstuvwxyz"
string = "0123456789" + string + string.upper()
flip_flop = 0
while True:
    print("\r"+string,end="")
    sleep(0.3)
    string,char = string[not flip_flop:50-flip_flop], string[flip_flop and -1]
    position = randint(1,49)
    string = string[:position] + char + string[position:]
    f = not f
busukxuan
fonte
Seria import random,timemais curto?
FlipTack
@FlipTack Sim, 6 bytes a menos, obrigado!
busukxuan
@ mbomb007 Obrigado, feito :-)
busukxuan
3

C, 290 285 bytes

#include<stdio.h>
#include<time.h>
#define S(s,a,b){int p=rand()%48+1;clock_t c=clock()+300;while(c>clock());int x=d[s];for(int i=s;i a p;)d[i b]=d[i];d[p]=x;printf(d);}
main(){char d[]="0123456789abcdefghijqrstuvwxyzABCDEFGHIJQRSTUVWXYZ\r";srand(time(0));for(;;){S(0,<,++)S(49,>,--)}}

Ungolfed:

#include<stdio.h> // variadic(printf) functions without a valid prototype = UB
#include<time.h>  // required for the implementation-defined clock_t type
// note that <stdlib.h> isnt required for srand()/rand() because they are
//  validly declared implicitly
#define S(s,a,b) // macro function
{
    int p=rand()%48+1;     // get a random position within the array
    clock_t c=clock()+300; // get the time 300 milliseconds from now
    while(c>clock());      // wait for that time
    int x=d[s];            // save the s'th character in a tempvar
    for(int i=s;i a p;)    // shift everything in the array from p
        d[i b]=d[i];       // a determines the comparison: </>
                           // b determines the operation: ++/--
    d[p]=x;                // put the tempvar in its new position
    printf(d);             // print the modified string
} // note: the \r at the end makes it so the next printf overwrites it

main() // main entry point
{      // deck to shuffle below
    char d[]="0123456789abcdefghijqrstuvwxyzABCDEFGHIJQRSTUVWXYZ\r";
    srand(time(0)); // seed the random number generator
    for(;;)         // infinite loop
    {
        S(0,<,++)   // shuffle from the start of the deck
        S(49,>,--)  // shuffle from the end of the deck
    }
}
Taylor Hansen
fonte
2

Rápido, 288 bytes

import Darwin
var o=Array("0123456789abcdefghijqrstuvwxyzABCDEFGHIJQRSTUVWXYZ".characters)
while true{
print(String(o),terminator:"\r")
fflush(__stdoutp);{o.insert(o.removeLast(),at:$0())
o.insert(o.removeFirst(),at:$0()+1)}({Int(arc4random_uniform(UInt32(o.count-1)))})
usleep(300000)
}

Golfe em Swift é sempre um desafio, pois um de seus pontos de venda é a expressividade.

Silvan Mosberger
fonte
2

Rubi ( 138 119 bytes)

f=0;a=[*0..9,*?a..?j,*?q..?z,*?A..?J,*?Q..?Z];loop{$><<a*''+?\r;a.insert(rand(48),f>0? a.shift : a.pop);f^=1;sleep 0.3}

Não é tão curto quanto @PaulPrestidge, mas pelo menos eu entendo .. Também é bom saber que ruby ​​é como um túnel interminável de incríveis!

pottedmeat7
fonte
1

Rubi, 111 101 caracteres

s=[*0..9,*?a..?j,*?q..?z,*?A..?J,*?Q..?Z,?\r]*''
loop{$><<s;s[1+rand(48),0]=s.slice!$.^=-2;sleep 0.3}

Loops infinitamente.

Paul Prestidge
fonte
1

Noodel , não competindo 41 bytes

"Q…Z"A…J"q…z"a…j"0…9⁵⁺ḷçṛ47⁺1ɱɲOṃḃɲ49ḅṙḍq

Tente:)

Como funciona

"Q…Z"A…J"q…z"a…j"0…9⁵⁺                    # Creates the string literal to be shuffled.
                      ḷçṛ47⁺1ɱɲO      ṙḍq # The main "infinite" loop that applies the animation.
                                ṃḃɲ49ḅ    # Sub-loop that acts like an if-statement that only runs every odd iteration of the loop.

"Q…Z                                      # Pushes the string literal "QRSTUVWXYZ".
    "A…J                                  # Pushes the string literal "ABCDEFGHIJ".
        "q…z                              # Pushes the string literal "qrstuvwxyz".
            "a…j                          # Pushes the string literal "abcdefghij".
                "0…9                      # Pushes the string literal "0123456789".
                    ⁵⁺                    # Add the five strings on the stack to make one string.
                      ḷ                   # Unconditionally loop the following code.
                       ç                  # Copy what is on the top of the stack, clear the screen, and then print the copy.
                        ṛ47               # Create a random integer from 0 to 47.
                           ⁺1             # Increment the number to get 1 - 48 such that will not be the top or bottom of the deck.
                             ɱ            # Push the number of times that the unconditional loop has ran.
                              ɲO          # Consume the counter and push on zero if is even and one if is odd.
                                ṃ         # Conditional loop that only passes if the top of the stack is truthy (if the counter is odd).
                                 ḃ        # Throws away the top of the stack.
                                  ɲ49     # Pushes the literal 49 in order to represent the top of the deck.
                                     ḅ    # Ends the conditional loop.
                                      ṙ   # Relocate an element in the string by using the two numbers on the stack (either 0 or 49 to the random number).
                                       ḍq # Delay for a quarter of second. (End of unconditional loop)

<div id="noodel" code='"Q…Z"A…J"q…z"a…j"0…9⁵⁺ḷçṛ47⁺1ɱɲOṃḃɲ49ḅṙḍq' input="" cols="50" rows="2"></div>

<script src="https://tkellehe.github.io/noodel/release/noodel-0.0.js"></script>
<script src="https://tkellehe.github.io/noodel/ppcg.min.js"></script>

tkellehe
fonte
Por que isso não está competindo?
Stewie Griffin
@StewieGriffin Não finalizei o lançamento do analisador js até depois do desafio. Todas as funcionalidades existiam antes disso, mas eu não sabia se era correto permitir que Noodel competisse. Então, tomei a rota segura :)
tkellehe
@ mbomb007, obrigado por corrigir isso. Eu não percebi que foi colocado em cima.
tkellehe
0

bash, 170 bytes

r(){((r=RANDOM%48+1));echo -n $c^;sleep .3;}
c=0123456789abcdefghijqrstuvwxyzABCDEFGHIJQRSTUVWXYZ
while r
do
c=${c:1:r}${c:0:1}${c:r+1}
r
c=${c:0:r}${c:49}${c:r:-1}
done

aqui '^' (na primeira linha) representa ctrl-m: inserido na linha de comando como ctrl-v enterou em um editor de acordo com o funcionamento do editor (assumindo que o editor funcione)

Jasen
fonte