Kartu pengacakan anak-anak

12

Mengocok setumpuk kartu adalah hal yang sulit bagi anak-anak, sehingga mereka harus mencari cara untuk mendapatkan setumpuk kartu yang dikocok dengan baik sesederhana mungkin.

Salah satu cara untuk melakukan ini yang memberikan hasil yang cukup baik adalah:

  1. Keluarkan kartu teratas dan masukkan secara acak ke dalam dek
  2. Keluarkan kartu terbawah dan masukkan secara acak di geladak
  3. Lanjutkan sampai Anda yakin itu cukup baik.

Perhatikan bahwa Anda tidak akan pernah memasukkan kartu di tempat atas atau bawah, itu harus ditempatkan di suatu tempat di geladak.


Alih-alih menyeret kartu, kami akan mengocok karakter alfanumerik: 0-9, A-J, a-j, q-zdan Q-Z.

Mulailah dengan string yang ditunjukkan di bawah dan kocok karakter seperti yang dijelaskan di atas. Anda dapat memilih apakah Anda ingin terus mengocok tanpa batas atau mengocok kartu 100 putaran (100 kartu dari atas dan 100 kartu dari bawah).

0123456789abcdefghijqrstuvwxyzABCDEFGHIJQRSTUVWXYZ

Tantangannya adalah untuk menampilkan karakter yang dikocok. Setiap "acak" (mengeluarkan dan memasukkan kartu) akan memakan waktu antara 0,25 dan 0,35 detik.

Gif di bawah ini menunjukkan contoh output:

masukkan deskripsi gambar di sini


Ini adalah sehingga kode terpendek dalam byte menang.


"Kenapa kau tidak memiliki a-tbukan a-j, q-z?" Karena ini akan menggambarkan kartu yang sesuai, bukan hanya karakter. Dan ya, ada 5 setelan.


Catatan: Saya telah memutuskan untuk berhenti menggunakan tanda centang pada -challenges. Posting meta yang relevan di sini dan di sini .

Stewie Griffin
sumber
Bagaimana ada 5 setelan?
TrojanByAccident
1
@TrojanByAccident Lima set kartu (karakter ASCII) oleh jas adalah 0-9, A-J, a-j, q-zdan Q-Z, menurut pertanyaan itu.
mbomb007
dan ada 50 kartu, bukan 52. mungkin anak-anak kehilangan beberapa.
Jasen
@ mbomb007 Saya bertanya bagaimana ada 5 set kartu. Kecuali saya kehilangan sesuatu, hanya ada Sekop, Klub, Hati, dan Berlian. Itu 4.
TrojanByAccident
2
@TrojanByAccident Ini tidak menggunakan kartu. Ini menggunakan ASCII, bukan kartu. Ini adalah lima setelan ASCII. Alih-alih mengocok kartu, kami akan mengacak karakter alfanumerik
mbomb007

Jawaban:

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)

Sunting: Disimpan 4 byte berkat @ L.Serné. Disimpan 3 byte berkat @Arnauld.

Neil
sumber
Saya pikir Anda dapat menyimpan beberapa byte jika Anda bergerak e^=1di dalam tanda kurung kosong Math.randompanggilan. Anda juga dapat mengubah konten teks ke dalamHTML, karena Anda tidak melewati karakter khusus. Anda juga dapat mengatur eke 0 di dalam toLowerCasepanggilan.
Luke
Kamu tidak benar-benar membutuhkan e. Anda bisa menggunakannya s. (Karena ('some_string'^1) === 1)
Arnauld
4

MATL, 62 58 56 byte

2 Bytes disimpan berkat @Luis

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

Versi ini akan berjalan tanpa batas. Coba demo online di MATL Online , juru bahasa online eksperimental yang mendukung output dinamis. Ini akan berjalan selama 30 detik (batas keras yang diberlakukan oleh versi online) jika tidak terbunuh terlebih dahulu.

Penjelasan

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

Untuk menjalankannya:

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

Penjelasan:
- @F=(0..9,a..j,"q"..z,A..J,Q..Z)membuat dek awal, dan menyimpannya di @F.
- {...;redo}dieksekusi ...selamanya.
- Sebagai splice@F,++$|+rand(@F-2),0,++$v%2?shift@F:pop@Falternatif, hapus elemen pertama / terakhir dari geladak dan masukkan ke dalam posisi acak (sambil menambah $|, sehingga cetakan tidak buffer),
- print"\r",@Fmencetak geladak,
- select$,,$,,$,,.3tidur selama 0,3 detik (Perl sleeptidak dapat tidur kurang dari 5 1 detik),

Dada
sumber
kisaran numeriknya adalah 0..9tidak 1..9, dan dek awal Anda juga rusak :)
ardnew
@ardnew memang, terima kasih. Saya pasti lelah ketika saya menulis kode ini. Tetap diperbaiki :)
Dada
4

Python 3, 199 196 192 186 byte

Disimpan 4 byte berkat TuukkaX, dan 6 byte berkat 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

Menggunakan printfungsi Python 3 untuk menekan baris baru, lebih pendek dari Python 2 sys.stdout.write.

Menggunakan variabel flip-flop untuk beralih antara memindahkan kartu atas dan bawah.

Tidak Disatukan:

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
sumber
Apakah import random,timelebih pendek?
FlipTack
@ Lipatan Ya, 6 byte lebih pendek, terima kasih!
busukxuan
@ mbomb007 Terima kasih, selesai :-)
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,>,--)}}

Tidak Disatukan:

#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
sumber
2

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

Golf di Swift selalu menjadi tantangan, karena salah satu nilai jualnya adalah ekspresif.

Silvan Mosberger
sumber
2

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

Tidak sesingkat @PaulPrestidge tetapi setidaknya saya memahaminya .. Juga bagus untuk mengetahui bahwa ruby ​​seperti terowongan yang luar biasa!

pottedmeat7
sumber
1

Rubi, 111 101 karakter

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}

Loop tak terhingga.

Paul Prestidge
sumber
1

Noodel , 41 byte tidak bersaing

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

Cobalah:)

Bagaimana itu bekerja

"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
sumber
Mengapa ini tidak bersaing?
Stewie Griffin
@StewieGriffin Saya tidak menyelesaikan perilisan js parser sampai setelah tantangan. Semua fungsi ada sebelum itu, tetapi saya tidak tahu apakah itu benar bagi saya untuk memungkinkan Noodel untuk bersaing. Jadi, saya mengambil rute yang aman :)
tkellehe
@ mbomb007, terima kasih telah memperbaikinya. Saya tidak menyadari itu ditempatkan di atas.
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

di sini '^' (pada baris pertama) mewakili ctrl-m: dimasukkan pada baris perintah sebagai ctrl-v enteratau dalam editor sesuai dengan cara kerja editor Anda (dengan asumsi editor Anda bekerja)

Jasen
sumber