Bambini che mescolano le carte


12

Mescolare un mazzo di carte è difficile per i bambini, quindi devono trovare modi per ottenere un mazzo ben mischiato ragionevole nel modo più semplice possibile.

Un modo per farlo che dà risultati ragionevolmente buoni è:

  1. Prendi la prima carta e inseriscila in un posto casuale nel mazzo
  2. Prendi la carta in basso e inseriscila in un posto casuale nel mazzo
  3. Continua finché non ritieni che sia abbastanza buono.

Nota che non devi mai inserire una carta nel punto superiore o inferiore, dovrebbe essere posizionata da qualche parte nel mazzo.


Invece di mischiare le carte, ci mischiamo caratteri alfanumerici: 0-9, A-J, a-j, q-ze Q-Z.

Inizia con la stringa mostrata sotto e mescola i caratteri come descritto sopra. Puoi scegliere se vuoi continuare a mescolare all'infinito o mescolare le carte per 100 round (100 carte dall'alto e 100 carte dal basso).

0123456789abcdefghijqrstuvwxyzABCDEFGHIJQRSTUVWXYZ

La sfida è mostrare i personaggi che vengono mescolati. Ogni "shuffle" (estrarre e inserire la carta) deve durare tra 0,25 e 0,35 secondi.

La gif che segue mostra un esempio di output:

inserisci qui la descrizione dell'immagine


Questo è quindi vince il codice più breve in byte.


"Perché non hai a-tinvece di a-j, q-z?" Perché questo illustrerà i semi delle carte, non solo i personaggi. E sì, ci sono 5 semi.


Nota: ho deciso di smettere di usare il segno di spunta su -challenges. Meta post pertinenti qui e qui .


Come ci sono 5 semi?
TrojanByAccident

1
@TrojanByAccident I cinque set sono le carte (caratteri ASCII) di seme sono 0-9, A-J, a-j, q-ze Q-Z, a seconda della domanda.
mbomb007,

e ci sono 50 carte, non 52. forse i bambini ne hanno perse alcune.
Jasen,

@ mbomb007 Mi chiedevo come fossero 5 semi di carte. A meno che non mi manchi qualcosa, ci sono solo picche, fiori, cuori e quadri. Quello è 4.
TrojanByAccident

2
@TrojanByAccident Questo non usa le carte. Usa ASCII invece di carte. Questi sono i cinque semi di ASCII. Invece di mescolare le carte,
mescoleremo i

Risposte:


5

JavaScript (ES6), 192 188 185 byte

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)

Modifica: salvato 4 byte grazie a @ L.Serné. Salvato 3 byte grazie a @Arnauld.


Penso che puoi risparmiare qualche byte se ti sposti e^=1tra parentesi vuote della Math.randomchiamata. Puoi anche modificare textContent in innerHTML, poiché non stai passando alcun carattere speciale. È inoltre possibile impostare e0 all'interno della toLowerCasechiamata.
Luca

Non hai davvero bisogno e. Potresti semplicemente usare s. (Perché ('some_string'^1) === 1)
Arnauld l'

4

MATL, 62 58 56 byte

2 byte salvati grazie a @Luis

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

Questa versione funzionerà indefinitamente. Prova la demo online su MATL Online , un interprete online sperimentale che supporta l'output dinamico. Questo funzionerà per 30 secondi (un limite imposto dalla versione online) se non viene ucciso per primo.

Spiegazione

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

4

Perl, 117 byte

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

Per eseguirlo:

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

Spiegazioni:
- @F=(0..9,a..j,"q"..z,A..J,Q..Z)crea il mazzo iniziale e lo memorizza @F.
- {...;redo}esegue ...per sempre.
- in splice@F,++$|+rand(@F-2),0,++$v%2?shift@F:pop@Falternativa rimuovi il primo / ultimo elemento dal mazzo e inseriscilo in una posizione casuale (durante l'incremento $|, quindi le stampe non sono memorizzate nel buffer),
- print"\r",@Fstampa il mazzo,
- select$,,$,,$,,.3dorme per 0,3 secondi (il Perl sleepnon può dormire per meno di 1 secondo),


l'intervallo numerico è 0..9no 1..9e anche il tuo mazzo iniziale è fuori servizio :)
ardnew

@ardnew davvero, grazie. Devo essere stanco quando ho scritto questo codice. È riparato comunque :)
Dada il

4

Python 3, 199 196 192 186 byte

Salvato 4 byte grazie a TuukkaX e 6 byte grazie 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

Utilizza la printfunzione di Python 3 per sopprimere la nuova riga, più corta di quella di Python 2 sys.stdout.write.

Utilizza una variabile flip-flop per passare dallo spostamento delle carte superiore a quella inferiore.

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

Sarebbe import random,timepiù breve?
FlipTack

@FlipTack Sì, 6 byte in meno, grazie!
Busukxuan,

@ mbomb007 Grazie, fatto :-)
busukxuan

3

C, 290 285 byte

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

2

Rapido, 288 byte

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

Giocare a golf in Swift è sempre una sfida, poiché uno dei suoi punti di forza è l'espressività.


2

Rubino ( 138 119 byte)

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}

Non breve come @PaulPrestidge ma almeno lo capisco .. Anche bello imparare che il rubino è come un tunnel infinito di fantastico!


1

Rubino, 111 101 caratteri

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}

Cicli infiniti.


1

Noodel , 41 byte non competitivi

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

Provalo:)

Come funziona

"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>


Perché questo non è in competizione?
Stewie Griffin,

@StewieGriffin Non ho finalizzato il rilascio del parser js fino a dopo la sfida. Prima esistevano tutte le funzionalità, ma non sapevo se fosse corretto per me permettere a Noodel di competere. Quindi, ho preso la strada sicura :)
tkellehe

@ mbomb007, grazie per averlo risolto. Non mi ero reso conto che fosse posto in cima.
tkellehe,

0

bash, 170 byte

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

qui '^' (nella prima riga) rappresenta ctrl-m: immesso nella riga di comando come ctrl-v entero in un editor in base a come funziona l'editor (supponendo che l'editor funzioni )

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.