Karty losowe dla dzieci

12

Tasowanie talii kart jest trudne dla dzieci, dlatego muszą wymyślić sposoby uzyskania rozsądnej, dobrze przetasowanej talii tak prosto, jak to możliwe.

Jednym ze sposobów osiągnięcia tego, który daje dość dobre wyniki, jest:

  1. Wyjmij górną kartę i włóż ją losowo do talii
  2. Wyjmij dolną kartę i włóż ją w losowe miejsce w talii
  3. Kontynuuj, aż uwierzysz, że jest wystarczająco dobry.

Pamiętaj, że nigdy nie należy wkładać karty w górne lub dolne miejsce, należy ją umieścić gdzieś w talii.


Zamiast tasowanie kart, będziemy losowe znaki alfanumeryczne: 0-9, A-J, a-j, q-zi Q-Z.

Zacznij od ciągu pokazanego poniżej i potasuj znaki w sposób opisany powyżej. Możesz wybrać, czy chcesz dalej tasować nieskończenie, czy tasować karty 100 rund (100 kart od góry i 100 kart od dołu).

0123456789abcdefghijqrstuvwxyzABCDEFGHIJQRSTUVWXYZ

Wyzwanie polega na wyświetleniu tasowanych postaci. Każde „tasowanie” (wyjmowanie i wkładanie karty) zajmuje od 0,25 do 0,35 sekundy.

Poniższy gif pokazuje przykładowy wynik:

wprowadź opis zdjęcia tutaj


To jest więc wygrywa najkrótszy kod w bajtach.


„Dlaczego nie masz a-tzamiast a-j, q-z?” Bo to zilustruje kolory kart, a nie tylko postaci. I tak, jest 5 kolorów.


Uwaga: postanowiłem przestać używać znacznika wyboru na wyzwaniach . Odpowiednie posty na meta tutaj i tutaj .

Stewie Griffin
źródło
Jak jest 5 kolorów?
TrojanByAccident
1
@TrojanByAccident Pięć zestawy są karty (znaki ASCII) przez kolorze są 0-9, A-J, a-j, q-zi Q-Z, zgodnie z pytaniem.
mbomb007
i jest 50 kart, a nie 52. być może dzieci trochę zgubiły.
Jasen
@ mbomb007 Pytałem, jak było 5 kolorów kart. Jeśli czegoś mi nie brakuje, są tylko pik, trefl, kier i karo. To 4.
TrojanByAccident
2
@TrojanByAccident To nie używa kart. Używa ASCII zamiast kart. To jest pięć kolorów ASCII. Zamiast tasowania kart będziemy tasować znaki alfanumeryczne
mbomb007

Odpowiedzi:

5

JavaScript (ES6), 192 188 185 bajtów

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)

Edycja: Zapisano 4 bajty dzięki @ L.Serné. Zaoszczędzono 3 bajty dzięki @Arnauld.

Neil
źródło
Myślę, że możesz zaoszczędzić kilka bajtów, jeśli przejdziesz e^=1do pustych nawiasów Math.randomwywołania. Możesz także zmienić textContent na innerHTML, ponieważ nie przekazujesz żadnych specjalnych znaków. Możesz również ustawić ena 0 w trakcie toLowerCasepołączenia.
Łukasz
Naprawdę nie potrzebujesz e. Możesz po prostu użyć s. (Ponieważ ('some_string'^1) === 1)
Arnauld
4

MATL, 62 58 56 bajtów

2 bajty zapisane dzięki @Luis

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

Ta wersja będzie działać przez czas nieokreślony. Wypróbuj demo online w MATL Online , eksperymentalnym tłumaczu online , który obsługuje dynamiczne wyjście. Będzie działać przez 30 sekund (twardy limit narzucony przez wersję online), jeśli nie zostanie zabity jako pierwszy.

Wyjaśnienie

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
źródło
4

Perl, 117 bajtów

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

Aby uruchomić:

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

Objaśnienia:
- @F=(0..9,a..j,"q"..z,A..J,Q..Z)tworzy początkową talię i przechowuje ją @F.
- {...;redo}działa ...wiecznie.
- splice@F,++$|+rand(@F-2),0,++$v%2?shift@F:pop@Falternatywnie wyjmij pierwszy / ostatni element z talii i włóż w losowej pozycji (zwiększając $|, aby wydruki nie były buforowane),
- print"\r",@Fdrukuje talię,
- select$,,$,,$,,.3śpi przez 0,3 sekundy (Perl sleepnie może spać krócej niż 1 sekunda),

Dada
źródło
zakres liczbowy jest 0..9, a nie 1..9, a twoja początkowa talia również jest
zepsuta
@ardnew rzeczywiście, dzięki. Musiałem być zmęczony, kiedy napisałem ten kod. Naprawiono mimo to :)
Dada
4

Python 3, 199 196 192 186 bajtów

Zaoszczędź 4 bajty dzięki TuukkaX i 6 bajtów dzięki 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

Używa funkcji Pythona 3 printdo tłumienia nowej linii, krótszej niż Python 2 sys.stdout.write.

Wykorzystuje zmienną flip-flop do przełączania między przesunięciem górnej i dolnej karty.

Nie golfowany:

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
źródło
Byłby import random,timekrótszy?
FlipTack
@FlipTack Tak, 6 bajtów krótszych, dzięki!
busukxuan
@ mbomb007 Dzięki, zrobiono :-)
busukxuan
3

C, 290 285 bajtów

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

Nie golfowany:

#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
źródło
2

Szybki, 288 bajtów

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

Gra w Swift jest zawsze wyzwaniem, ponieważ jednym z jej atutów jest ekspresja.

Silvan Mosberger
źródło
2

Rubinowy ( 138 119 bajtów)

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}

Nie tak krótki jak @PaulPrestidge, ale przynajmniej rozumiem to. Wspaniale jest też dowiedzieć się, że rubin jest jak niekończący się tunel niesamowitości!

pottedmeat7
źródło
1

Rubin, 111 101 znaków

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}

Pętle nieskończone.

Paul Prestidge
źródło
1

Noodel , niekonkurencyjne 41 bajtów

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

Spróbuj:)

Jak to działa

"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
źródło
Dlaczego to nie konkuruje?
Stewie Griffin,
@StewieGriffin Nie ukończyłem wydania parsera js aż do momentu wyzwania. Cała funkcjonalność istniała wcześniej, ale nie wiedziałem, czy pozwoliłem Noodel na konkurowanie. Więc wybrałem bezpieczną trasę :)
tkellehe
@ mbomb007, dziękuję za naprawienie tego. Nie zdawałem sobie sprawy, że został umieszczony na wierzchu.
tkellehe
0

bash, 170 bajtów

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

tutaj „^” (w pierwszym wierszu) reprezentuje ctrl-m: wprowadzony w wierszu polecenia jako ctrl-v enterlub w edytorze zgodnie z działaniem edytora (przy założeniu, że edytor działa)

Jasen
źródło