Trẻ em xáo trộn thẻ


12

Việc xáo trộn một cỗ bài rất khó đối với trẻ em, vì vậy chúng phải tìm ra cách để có được một cỗ bài xáo trộn hợp lý một cách đơn giản nhất có thể.

Một cách để làm điều này mang lại kết quả hợp lý là:

  1. Lấy thẻ trên cùng và chèn nó vào một vị trí ngẫu nhiên trong bộ bài
  2. Lấy thẻ dưới ra và nhét nó vào một vị trí ngẫu nhiên trong bộ bài
  3. Tiếp tục cho đến khi bạn tin rằng nó đủ tốt.

Lưu ý rằng bạn sẽ không bao giờ chèn một thẻ ở vị trí trên cùng hoặc dưới cùng, nó nên được đặt ở đâu đó trong bộ bài.


Thay vì shuffling thẻ, chúng tôi sẽ xáo trộn nhân vật alphanumerical: 0-9, A-J, a-j, q-zQ-Z.

Bắt đầu với chuỗi được hiển thị bên dưới và xáo trộn các ký tự theo cách nó được mô tả ở trên. Bạn có thể chọn nếu bạn muốn tiếp tục xáo trộn vô hạn hoặc xáo trộn các thẻ 100 vòng (100 thẻ từ trên xuống và 100 thẻ từ dưới lên).

0123456789abcdefghijqrstuvwxyzABCDEFGHIJQRSTUVWXYZ

Thách thức là hiển thị các nhân vật bị xáo trộn. Mỗi lần "xáo trộn" (rút và nạp thẻ) sẽ mất từ ​​0,25 đến 0,35 giây.

Ảnh gif dưới đây cho thấy một ví dụ đầu ra:

nhập mô tả hình ảnh ở đây


Đây là vì vậy mã ngắn nhất tính bằng byte sẽ thắng.


"Tại sao bạn không có a-tthay a-j, q-z?" Bởi vì điều này sẽ minh họa phù hợp với thẻ, không chỉ các nhân vật. Và vâng, có 5 bộ quần áo.


Lưu ý: Tôi đã quyết định ngừng sử dụng dấu kiểm trên -challenges. Bài viết meta có liên quan ở đâyở đây .


Làm thế nào có 5 bộ quần áo?
TrojanByAccident

1
@TrojanByAccident Năm bộ là thẻ (các ký tự ASCII) bằng cách phù hợp là 0-9, A-J, a-j, q-zQ-Z, theo câu hỏi.
mbomb007

và có 50 thẻ chứ không phải 52. có lẽ bọn trẻ đã mất một số.
Jasen

@ mbomb007 Tôi đã hỏi làm thế nào có 5 bộ thẻ. Trừ khi tôi thiếu thứ gì đó, chỉ có Spades, Câu lạc bộ, Trái tim và Kim cương. Đó là 4.
TrojanByAccident

2
@TrojanByAccident Điều này không sử dụng thẻ. Nó sử dụng ASCII thay vì thẻ. Đây là năm bộ quần áo của ASCII. Thay vì xáo trộn thẻ, chúng tôi sẽ xáo trộn các ký tự chữ và số
mbomb007

Câu trả lời:


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)

Chỉnh sửa: Đã lưu 4 byte nhờ @ L.Serné. Đã lưu 3 byte nhờ @Arnauld.


Tôi nghĩ bạn có thể lưu một vài byte nếu bạn di chuyển e^=1bên trong các dấu ngoặc rỗng của Math.randomcuộc gọi. Bạn cũng có thể thay đổi textContent thành InternalHTML, vì bạn không chuyển bất kỳ ký tự đặc biệt nào. Bạn cũng có thể đặt ethành 0 trong toLowerCasecuộc gọi.
Lu-ca

Bạn không thực sự cần e. Bạn chỉ có thể sử dụng s. (Bởi vì ('some_string'^1) === 1)
Arnauld

4

MATL, 62 58 56 byte

2 byte được lưu nhờ vào @Luis

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

Phiên bản này sẽ chạy vô thời hạn. Hãy thử bản demo trực tuyến tại MATL Online , một trình thông dịch trực tuyến thử nghiệm hỗ trợ đầu ra động. Điều này sẽ chạy trong 30 giây (giới hạn cứng được áp dụng bởi phiên bản trực tuyến) nếu nó không bị giết trước.

Giải trình

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}

Để chạy nó:

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

Giải thích:
- @F=(0..9,a..j,"q"..z,A..J,Q..Z)tạo bộ bài ban đầu và lưu nó vào @F.
- {...;redo}thi hành ...mãi mãi.
- splice@F,++$|+rand(@F-2),0,++$v%2?shift@F:pop@Fthay vào đó loại bỏ phần tử đầu tiên / cuối cùng khỏi bộ bài và chèn vào một vị trí ngẫu nhiên (trong khi tăng $|, do đó, bản in không được đệm),
- print"\r",@Fin bộ bài,
- select$,,$,,$,,.3ngủ trong 0,3 giây (Perl sleepkhông thể ngủ ít hơn 1 giây),


phạm vi số là 0..9, không 1..9, và bộ bài ban đầu của bạn cũng không theo thứ tự :)
ardew

@ardnew thực sự, cảm ơn. Tôi đã phải mệt mỏi khi tôi viết mã này. Dù sao nó cũng đã được sửa :)
Dada

4

Python 3, 199 196 192 186 byte

Đã lưu 4 byte nhờ TuukkaX và 6 byte nhờ 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

Sử dụng printchức năng của Python 3 để chặn dòng mới, ngắn hơn Python 2 sys.stdout.write.

Sử dụng một biến lật để chuyển giữa việc di chuyển các thẻ trên cùng và dưới cùng.

Ung dung:

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

Sẽ import random,timengắn hơn?
FlipTack

@FlipTack Vâng, ngắn hơn 6 byte, cảm ơn!
busukxuan

@ mbomb007 Cảm ơn, đã hoàn thành :-)
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,>,--)}}

Ung dung:

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

Chơi golf trong Swift luôn là một thách thức, vì một trong những điểm bán hàng của nó là tính biểu cảm.


2

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

Không ngắn như @PaulPrestidge nhưng ít nhất tôi hiểu điều đó .. Cũng thật tuyệt khi biết rằng ruby ​​giống như một đường hầm vô tận tuyệt vời!


1

Hồng ngọc 111 101 ký tự

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}

Vòng lặp vô hạn.


1

Noodel , không biên dịch 41 byte

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

Thử nó:)

Làm thế nào nó hoạt động

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


Tại sao điều này không cạnh tranh?
Stewie Griffin

@StewieGriffin Tôi đã không hoàn thành việc phát hành trình phân tích cú pháp js cho đến sau thử thách. Tất cả các chức năng đã tồn tại trước đó, nhưng tôi không biết liệu có đúng không khi cho phép Noodel cạnh tranh. Vì vậy, tôi đã đi con đường an toàn :)
tkellehe

@ mbomb007, cảm ơn bạn đã sửa nó. Tôi đã không nhận ra nó được đặt lên hàng đầu.
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

ở đây '^' (trên dòng đầu tiên) thể hiện ctrl-m: được nhập trên dòng lệnh dưới dạng ctrl-v enterhoặc trong trình chỉnh sửa theo cách trình soạn thảo của bạn hoạt động (giả sử trình soạn thảo của bạn hoạt động)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.