キッズシャッフルカード


12

カードのデッキをシャッフルするのは子供にとって難しいので、合理的によくシャッフルされたデッキをできるだけ簡単に得る方法を見つけなければなりません。

合理的に良い結果を与えるこれを行う1つの方法は次のとおりです。

  1. 一番上のカードを取り出して、デッキのランダムな場所に挿入します
  2. 一番下のカードを取り出して、デッキのランダムな場所に挿入します
  3. 十分だと思うまで続けます。

カードを上部または下部に挿入しないでください。カードはデッキのどこか配置する必要があります。


代わりにカードをシャッフルし、我々は英数字をシャッフルされます:0-9A-Ja-jq-zQ-Z

以下に示す文字列から始め、上記の方法で文字をシャッフルします。無限にシャッフルを続けるか、カードを100ラウンド(上部から100枚、下部から100枚)シャッフルするかを選択できます。

0123456789abcdefghijqrstuvwxyzABCDEFGHIJQRSTUVWXYZ

課題は、シャッフルされているキャラクターを表示することです。各「シャッフル」(カードの取り出しと挿入)には、0.25〜0.35秒かかります。

以下のgifは出力例を示しています。

ここに画像の説明を入力してください


これはので、バイト単位の最短コードが勝ちです。


「なぜ、a-t代わりに持っていないのですか?」a-jq-zこれはキャラクターだけでなく、カードのスーツを示すものだからです。そして、はい、5つのスーツがあります。


注: -challengesのチェックマークの使用を停止することにしました。関連するメタ投稿はこちらこちら


どのように5つのスーツがありますか?
TrojanByAccident

1
@TrojanByAccident 5セットは、スーツによってカード(ASCII文字)されている0-9A-Ja-jq-zおよびQ-Z、質問に応じました。
mbomb007

そして、52枚ではなく50枚のカードがあります。おそらく子供たちはいくつかを失いました。
ジェイセン

@ mbomb007カードのスーツが5枚あることを尋ねていました。何かが足りない場合を除き、スペード、クラブ、ハート、ダイヤモンドのみがあります。それは4です
。– TrojanByAccident

2
@TrojanByAccidentこれはカードを使用しません。カードの代わりにASCIIを使用します。これらはASCIIの5つのスーツです。カードをシャッフルする代わりに、英数字をシャッフルします
-mbomb007

回答:


5

JavaScript(ES6)、192 188 185バイト

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)

編集:@L.Sernéのおかげで4バイトを保存しました。@Arnauldのおかげで3バイト節約されました。


呼び出しのe^=1空の括弧内に移動すると、数バイト節約できると思いますMath.random。特別な文字を渡さないため、textContentをinnerHTMLに変更することもできます。コールe内で0に設定することもできtoLowerCaseます。
ルーク

本当に必要ありませんe。あなただけを使用することができますs。(理由('some_string'^1) === 1
アーナウド

4

MATL、62 58 56バイト

@Luisのおかげで2バイト節約

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

このバージョンは無期限に実行されます。MATL Onlineのオンラインデモを試しください動的出力をサポートする実験的なオンラインインタープリター。これは、最初に強制終了されない場合、30秒間(オンラインバージョンによって課せられるハード制限)実行されます。

説明

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バイト

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

実行するには:

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

説明:
- @F=(0..9,a..j,"q"..z,A..J,Q..Z)初期デッキを作成し、に保存し@Fます。
- 永遠に{...;redo}実行し...ます。
- splice@F,++$|+rand(@F-2),0,++$v%2?shift@F:pop@F代わりデッキから最初/最後の要素を削除して(インクリメントしながらランダムな位置に挿入し$|、プリントがバッファリングされていないので)
- print"\r",@Fデッキを出力し、
- select$,,$,,$,,.3(0.3秒間スリープPerlのsleep未満のためすることができない睡眠を1秒)、


数値の範囲は0..9でなく1..9、最初のデッキも故障しています:)
ardnew

@ardnew本当にありがとう。このコードを書いたとき、私は疲れていたに違いありません。とにかく修正されます:)
ダダ

4

Python 3、199 196 192 186バイト

TuukkaXのおかげで4バイト、FlipTackのおかげで6バイト節約されました!

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

Python 3のprint関数を使用して、Python 2より短い改行を抑制しますsys.stdout.write

フリップフロップ変数を使用して、上下のカードの移動を切り替えます。

ゴルフをしていない:

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

だろimport random,time短く?
-FlipTack

@FlipTackええ、6バイト短くなりました、ありがとう!
-busukxuan

@ mbomb007ありがとう、やった:
busukxuan

3

C、290 285バイト

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

ゴルフをしていない:

#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

Swift、288バイト

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

Swiftでのゴルフは、そのセールスポイントの1つが表現力であるため、常に挑戦です。


2

ルビー(138 119バイト)

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}

@PaulPrestidgeほど短くはありませんが、少なくとも私はそれを理解しています。ルビーが素晴らしいものの無限のトンネルのようなものであることを学ぶのも素晴らしいです!



1

Noodel、非競合41 バイト

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

それを試してみてください:)

使い方

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


なぜこれが競合しないのですか?
スティーヴィーグリフィン

@StewieGriffinチャレンジが終わるまで、jsパーサーのリリースを確定しませんでした。それ以前はすべての機能が存在していましたが、Noodelが競争できるようにすることが正しいかどうかはわかりませんでした。だから、私は安全なルートを取りました:)
tkellehe

@ mbomb007、それを修正してくれてありがとう。私はそれが上に置かれたことに気づきませんでした。
tkellehe

0

bash、170バイト

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

ここで '^'(1行目)はctrl-m、コマンドラインでctrl-v enterエディターとして、またはエディターの動作に応じてエディターに入力されたものを表します(エディターの動作を前提としています)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.