카드를 섞는 아이들


12

카드 한 장을 섞는 것은 아이들에게는 어려운 일이므로, 합리적이고 잘 섞인 갑판을 가능한 한 간단하게 얻는 방법을 찾아야합니다.

합리적으로 좋은 결과를 제공하는 한 가지 방법은 다음과 같습니다.

  1. 상단 카드를 꺼내서 갑판에 무작위로 넣습니다.
  2. 하단 카드를 꺼내서 갑판의 임의의 장소에 삽입하십시오
  3. 충분하다고 생각 될 때까지 계속하십시오.

당신이 맨 위 또는 맨 아래 자리에 카드를 삽입하지 않을 것이다 것을 참고, 그것은 어딘가에 배치해야 갑판.


대신 카드를 셔플, 우리는 영숫자 문자 셔플 것 : 0-9, A-J, a-j, q-zQ-Z.

아래 표시된 문자열로 시작하여 위에서 설명한 방식으로 문자를 섞습니다. 무한 섞기를 계속하거나 카드를 100 회 셔플합니다 (위에서 100 장, 아래에서 100 장).

0123456789abcdefghijqrstuvwxyzABCDEFGHIJQRSTUVWXYZ

문제는 섞인 문자를 표시하는 것입니다. 각 "셔플"(카드 꺼내기 및 삽입)은 0.25 ~ 0.35 초가 걸립니다.

아래 gif는 출력 예를 보여줍니다.

여기에 이미지 설명을 입력하십시오


이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다.


"왜 당신이하지 않는 a-t대신 a-j, q-z?" 이것은 캐릭터뿐만 아니라 카드의 슈트를 설명해야하기 때문입니다. 그리고 네, 5 벌이 있습니다.


참고 : -challenges 에서 확인 표시 사용을 중단하기로 결정했습니다 . 여기여기 관련 메타 게시물 .


5 벌은 어떻습니까?
TrojanByAccident

1
@TrojanByAccident 다섯 개 세트 소송에 의해 카드 (ASCII 문자)입니다입니다 0-9, A-J, a-j, q-zQ-Z, 질문에 따라.
mbomb007

그리고 52 장이 아닌 50 장의 카드가 있습니다. 아마도 아이들은 일부를 잃었을 것입니다.
Jasen

@ mbomb007 5 장의 카드 한 벌이 어떻게 있는지 묻고있었습니다. 내가 빠진 것이 아니라면 스페이드, 클럽, 하트, 다이아몬드 만 있습니다. 즉 4의
TrojanByAccident

2
@TrojanByAccident 카드를 사용하지 않습니다. 카드 대신 ASCII를 사용합니다. 이것들은 ASCII의 5 가지 슈트입니다. 카드를
섞는

답변:


5

자바 스크립트 (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.
Luke

당신은 정말로 필요하지 않습니다 e. 당신은 그냥 사용할 수 있습니다 s. (원인 ('some_string'^1) === 1)
Arnauld

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

펄, 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 초 동안 대기 펄 sleep미만위한 수없는 수면 1 초),


숫자 범위는 0..9아니고 1..9초기 데크도 순서가
잘못

정말 감사합니다. 이 코드를 작성할 때 피곤했을 것입니다. 어쨌든 수정되었습니다 :)
Dada

4

파이썬 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

스위프트, 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)
}

판매 포인트 중 하나가 표현력이기 때문에 스위프트에서의 골프는 항상 도전입니다.


2

루비 ( 138119 바이트)

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

루비, 111 101 자

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}

무한 루프.


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>


왜 이것이 비경쟁입니까?
Stewie Griffin

@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

여기서 '^'(첫 번째 줄)은 ctrl-m다음을 나타냅니다 . ctrl-v enter편집기 작동 방식에 따라 명령 줄 에 편집기 로 또는 편집기에 입력 (편집기가 작동한다고 가정)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.