Kinder mischen Karten


12

Ein Kartenspiel zu mischen ist für Kinder sehr schwer, daher müssen sie Wege finden, um ein vernünftiges, gut gemischtes Kartenspiel so einfach wie möglich zu erhalten.

Eine Möglichkeit, dies zu tun, die einigermaßen gute Ergebnisse liefert, ist:

  1. Nehmen Sie die oberste Karte heraus und legen Sie sie an einer beliebigen Stelle in den Stapel
  2. Nehmen Sie die unterste Karte heraus und legen Sie sie an einer beliebigen Stelle im Stapel ein
  3. Fahren Sie fort, bis Sie glauben, dass es gut genug ist.

Beachte, dass du niemals eine Karte in den oberen oder unteren Bereich stecken sollst, sie sollte irgendwo im Stapel liegen.


Statt Karten schlurfen, werden wir alphanumerische Zeichen mischen: 0-9, A-J, a-j, q-zund Q-Z.

Beginnen Sie mit der unten gezeigten Zeichenfolge und mischen Sie die Zeichen wie oben beschrieben. Sie können wählen, ob Sie das Mischen unendlich fortsetzen oder die Karten 100 Runden lang mischen möchten (100 Karten von oben und 100 Karten von unten).

0123456789abcdefghijqrstuvwxyzABCDEFGHIJQRSTUVWXYZ

Die Herausforderung besteht darin, die zu mischenden Charaktere anzuzeigen. Jedes "Mischen" (Herausnehmen und Einlegen der Karte) muss zwischen 0,25 und 0,35 Sekunden dauern.

Das folgende GIF zeigt eine Beispielausgabe:

Bildbeschreibung hier eingeben


Das ist also gewinnt der kürzeste Code in Bytes.


„Warum gehst du nicht haben a-tstatt a-j, q-z?“ Denn dies soll Anzüge von Karten veranschaulichen, nicht nur Charaktere. Und ja, es gibt 5 Anzüge.


Hinweis: Ich habe mich entschieden, das Häkchen bei Herausforderungen nicht mehr zu verwenden. Relevante Metapostings hier und hier .


Wie gibt es 5 Anzüge?
TrojanByAccident

1
@TrojanByAccident Die fünf Sätze sind Karten (ASCII - Zeichen) durch Anzug sind 0-9, A-J, a-j, q-zund Q-Znach der Frage.
mbomb007

und es gibt 50 Karten, nicht 52. Vielleicht haben die Kinder einige verloren.
Jasen

@ mbomb007 Ich habe gefragt, wie es 5 Anzüge von Karten gibt. Sofern ich nichts vermisse, gibt es nur Pik, Keulen, Herzen und Diamanten. Das ist 4.
TrojanByAccident

2
@TrojanByAccident Dies verwendet keine Karten. Es wird ASCII anstelle von Karten verwendet. Dies sind die fünf Anzüge von ASCII. Anstatt die Karten zu mischen, mischen wir die alphanumerischen Zeichen
mbomb007

Antworten:


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)

Bearbeiten: 4 Bytes dank @ L.Serné gespeichert. 3 Bytes dank @Arnauld eingespart.


Ich denke, Sie können ein paar Bytes sparen, wenn Sie sich e^=1in den leeren Klammern des Math.randomAufrufs bewegen . Sie können textContent auch in innerHTML ändern, da Sie keine Sonderzeichen übergeben. Sie können eden Wert auch innerhalb des toLowerCaseAnrufs auf 0 setzen .
Luke

Das brauchst du nicht wirklich e. Du könntest es einfach benutzen s. (Weil ('some_string'^1) === 1)
Arnauld

4

MATL, 62 58 56 Bytes

2 Bytes gespart dank @Luis

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

Diese Version wird auf unbestimmte Zeit ausgeführt. Testen Sie die Online-Demo bei MATL Online , einem experimentellen Online-Interpreter, der die dynamische Ausgabe unterstützt. Dies dauert 30 Sekunden (ein hartes Limit, das von der Online-Version vorgegeben wird), wenn es nicht zuerst getötet wird.

Erläuterung

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

Um es auszuführen:

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

Erklärungen:
- @F=(0..9,a..j,"q"..z,A..J,Q..Z)Erstellt das erste Deck und speichert es in @F.
- {...;redo}führt ...für immer aus.
- splice@F,++$|+rand(@F-2),0,++$v%2?shift@F:pop@Falternativ das erste / letzte Element von dem Deck entfernen und an einer zufälligen Position eingefügt (während Inkrementieren $|, so dass die Drucke nicht gepuffert sind),
- print"\r",@Fdruckt das Deck,
- select$,,$,,$,,.3schläft für 0,3 Sekunden (Perl sleepnicht schlafen kann für weniger als 1 Sekunde),


der numerische Bereich ist 0..9nicht 1..9, und dein Anfangsstapel ist auch nicht in Ordnung :)
Ardnew

@ardnew in der Tat danke. Ich muss müde gewesen sein, als ich diesen Code geschrieben habe. Es ist sowieso behoben :)
Dada

4

Python 3, 199 196 192 186 Bytes

4 Bytes dank TuukkaX und 6 Bytes dank 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

Verwendet die printFunktion von Python 3 , um Zeilenumbrüche zu unterdrücken, die kürzer als die von Python 2 sind sys.stdout.write.

Verwendet eine Flip-Flop-Variable, um zwischen dem Verschieben der oberen und der unteren Karte zu wechseln.

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

Wäre import random,timekürzer?
FlipTack

@FlipTack Ja, 6 Bytes kürzer, danke!
Busukxuan

@ mbomb007 Danke, fertig :-)
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
    }
}

2

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

Golfen in Swift ist immer eine Herausforderung, da Ausdruckskraft eines der Verkaufsargumente ist.


2

Rubin ( 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}

Nicht so kurz wie @PaulPrestidge, aber zumindest verstehe ich das. Auch toll zu lernen, dass Rubin wie ein endloser Tunnel voller Wahnsinn ist!


1

Rubin, 111 101 Zeichen

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}

Endlos wiederholbar.


1

Noodel , nicht konkurrierende 41 Bytes

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

Versuch es:)

Wie es funktioniert

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


Warum ist das nicht konkurrierend?
Stewie Griffin

@StewieGriffin Ich habe die Veröffentlichung des js-Parsers erst nach der Challenge abgeschlossen. Alle Funktionen existierten zuvor, aber ich wusste nicht, ob es für mich richtig war, Noodel den Wettbewerb zu ermöglichen . Also bin ich den sicheren Weg
gegangen

@ mbomb007, danke, dass du das behoben hast. Ich wusste nicht, dass es oben platziert wurde.
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

hier steht '^' (in der ersten Zeile) für ctrl-m: in der Befehlszeile als ctrl-v enteroder in einem Editor eingegeben, je nachdem , wie Ihr Editor arbeitet (vorausgesetzt, Ihr Editor arbeitet)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.