Niños barajando cartas

12

Barajar un mazo de cartas es difícil para los niños, por lo que deben encontrar formas de obtener un mazo razonable y bien barajado de la manera más simple posible.

Una forma de hacer esto que da resultados razonablemente buenos es:

  1. Saca la carta superior e insértala en un lugar aleatorio en el mazo
  2. Saque la tarjeta inferior e insértela en un lugar aleatorio en el mazo.
  3. Continúa hasta que creas que es lo suficientemente bueno.

Tenga en cuenta que nunca debe insertar una tarjeta en el punto superior o inferior, debe colocarse en algún lugar del mazo.


En lugar de barajar las cartas, vamos a barajar caracteres alfanuméricos: 0-9, A-J, a-j, q-zy Q-Z.

Comience con la cadena que se muestra a continuación y mezcle los caracteres de la manera descrita anteriormente. Puede elegir si desea continuar barajando infinitamente o barajar las cartas 100 rondas (100 cartas desde la parte superior y 100 cartas desde la parte inferior).

0123456789abcdefghijqrstuvwxyzABCDEFGHIJQRSTUVWXYZ

El desafío es mostrar los personajes que se barajan. Cada "barajado" (sacar e insertar la tarjeta) tomará entre 0.25 y 0.35 segundos.

El siguiente gif muestra un ejemplo de salida:

ingrese la descripción de la imagen aquí


Este es el por lo que gana el código más corto en bytes.


"¿Por qué no tienes a-ten lugar de a-j, q-z?" Porque esto ilustrará juegos de cartas, no solo personajes. Y sí, hay 5 trajes.


Nota: he decidido dejar de usar la marca de verificación en -challenges. Publicaciones meta relevantes aquí y aquí .

Stewie Griffin
fuente
¿Cómo hay 5 trajes?
TrojanByAccident
1
@TrojanByAccident Los cinco conjuntos son tarjetas (caracteres ASCII) por demanda son 0-9, A-J, a-j, q-zy Q-Z, de acuerdo con la pregunta.
mbomb007
y hay 50 cartas, no 52. tal vez los niños perdieron algunas.
Jasen
@ mbomb007 Estaba preguntando cómo había 5 juegos de cartas. A menos que me falte algo, solo hay picas, tréboles, corazones y diamantes. Eso es 4.
TrojanByAccident
2
@TrojanByAccident Esto no usa tarjetas. Utiliza ASCII en lugar de tarjetas. Estos son los cinco trajes de ASCII. En lugar de barajar cartas,
barajaremos

Respuestas:

5

JavaScript (ES6), 192 188 185 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: Guardado 4 bytes gracias a @ L.Serné. Guardado 3 bytes gracias a @Arnauld.

Neil
fuente
Creo que puede guardar algunos bytes si se mueve e^=1dentro de los paréntesis vacíos de la Math.randomllamada. También puede cambiar textContent a innerHTML, ya que no está pasando caracteres especiales. También puede establecer ea 0 dentro de la toLowerCasellamada.
Lucas
Realmente no lo necesitas e. Podrías usarlo s. (Porque ('some_string'^1) === 1)
Arnauld
4

MATL, 62 58 56 bytes

2 bytes guardados gracias a @Luis

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

Esta versión se ejecutará indefinidamente. Pruebe la demostración en línea en MATL Online , un intérprete experimental en línea que admite salida dinámica. Esto se ejecutará durante 30 segundos (un límite estricto impuesto por la versión en línea) si no se elimina primero.

Explicación

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
fuente
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 ejecutarlo:

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

Explicaciones:
- @F=(0..9,a..j,"q"..z,A..J,Q..Z)crea el mazo inicial y lo almacena @F.
- Se {...;redo}ejecuta ...para siempre.
- splice@F,++$|+rand(@F-2),0,++$v%2?shift@F:pop@Falternativamente, retire el primer / último elemento de la plataforma e insértelo en una posición aleatoria (mientras se incrementa $|, para que las impresiones no se almacenen),
- print"\r",@Fimprime la cubierta,
- select$,,$,,$,,.3duerme durante 0.3 segundos (Perl sleepno puede dormir menos de 1 segundo),

Dada
fuente
el rango numérico es 0..9, no 1..9, y tu mazo inicial también está fuera de servicio :)
ardnew
@ardnew de hecho, gracias. Debo haber estado cansado cuando escribí este código. Está arreglado de todos modos :)
Dada
4

Python 3, 199 196 192 186 bytes

¡Ahorró 4 bytes gracias a TuukkaX y 6 bytes gracias a 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

Utiliza la printfunción de Python 3 para suprimir la nueva línea, más corta que la de Python 2 sys.stdout.write.

Utiliza una variable flip-flop para cambiar entre mover las cartas superior e inferior.

Sin golf:

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
fuente
¿ import random,timeSería más corto?
FlipTack
@FlipTack Sí, 6 bytes más cortos, ¡gracias!
busukxuan
@ mbomb007 Gracias, hecho :-)
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,>,--)}}

Sin golf:

#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
fuente
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)
}

Jugar al golf en Swift siempre es un desafío, ya que uno de sus puntos de venta es la expresividad.

Silvan Mosberger
fuente
2

Rubí ( 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}

No es tan corto como @PaulPrestidge, pero al menos lo entiendo. ¡También es genial saber que Ruby es como un túnel interminable de increíble!

carne en maceta7
fuente
1

Rubí, 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}

Bucles infinitamente.

Paul Prestidge
fuente
1

Noodel , 41 bytes no competitivos

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

Intentalo:)

Cómo 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
fuente
¿Por qué esto no compite?
Stewie Griffin
@StewieGriffin No finalicé el lanzamiento del analizador js hasta después del desafío. Toda esa funcionalidad existía antes de eso, pero no sabía si era correcto para mí permitir que Noodel compita. Entonces, tomé la ruta segura :)
tkellehe
@ mbomb007, gracias por arreglar eso. No me di cuenta de que estaba colocado en la parte superior.
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

aquí '^' (en la primera línea) representa ctrl-m: ingresado en la línea de comandos como ctrl-v entero en un editor de acuerdo con cómo funciona su editor (suponiendo que su editor funcione)

Jasen
fuente