เด็ก ๆ สับไพ่


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-zและQ-Zตามคำถาม
mbomb007

และมีไพ่ 50 ใบไม่ใช่ 52 บางทีเด็ก ๆ ก็แพ้บ้าง
Jasen

@ mbomb007 ฉันถามว่าไพ่มี 5 ชุดอย่างไร นอกจากว่าฉันจะพลาดบางสิ่งมี Spades, Clubs, Hearts และ Diamonds เท่านั้น นั่นคือ 4
TrojanByAccident

2
@TrojanByAccident สิ่งนี้ไม่ได้ใช้การ์ด มันใช้ ASCII แทนการ์ด นี่คือห้าชุดของ ASCII แทนที่จะสับไพ่เราจะสลับตัวอักษรและตัวเลข
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)

แก้ไข: บันทึกแล้ว 4 ไบต์ด้วย @ L.Serné บันทึกแล้ว 3 ไบต์ขอบคุณ @Arnauld


ฉันคิดว่าคุณสามารถบันทึกไม่กี่ไบต์ถ้าคุณย้ายe^=1ภายในวงเล็บว่างของการMath.randomโทร คุณยังสามารถเปลี่ยน textContent เป็น innerHTML เนื่องจากคุณไม่ได้ผ่านตัวอักษรพิเศษใด ๆ คุณสามารถตั้งค่าeเป็น 0 ในการtoLowerCaseโทร
ลูกา

eคุณไม่จำเป็นจริงๆ sคุณก็สามารถใช้ (เพราะ('some_string'^1) === 1)
Arnauld

4

MATL, 62 58 56 ไบต์

บันทึก 2 ไบต์ด้วย @Luis

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) - ดำเนินการตลอดไป - อีกทางเลือกหนึ่งลบองค์ประกอบแรก / สุดท้ายจากดาดฟ้าและแทรกในตำแหน่งสุ่ม (ในขณะที่เพิ่มขึ้นเพื่อให้พิมพ์ไม่ได้บัฟเฟอร์) - พิมพ์สำรับ - นอนหลับเป็นเวลา 0.3 วินาที (Perl ไม่สามารถนอนหลับน้อยกว่า 1 วินาที), @F
{...;redo}...
splice@F,++$|+rand(@F-2),0,++$v%2?shift@F:pop@F$|
print"\r",@F
select$,,$,,$,,.3sleep


ช่วงที่เป็นตัวเลขคือ0..9ไม่1..9และเด็คแรกของคุณก็ไม่เป็นระเบียบเช่นกัน :)
ardnew

@ มาใหม่แน่นอนขอบคุณ ฉันต้องเหนื่อยเมื่อเขียนรหัสนี้ มันได้รับการแก้ไขแล้ว :)
Dada

4

Python 3, 199 196 192 186 ไบต์

บันทึก 4 ไบต์ด้วย TuukkaX และขอบคุณ 6 ไบต์สำหรับ 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

ใช้งูใหญ่ 3 printฟังก์ชั่นการขึ้นบรรทัดใหม่ปราบสั้นกว่างูหลาม sys.stdout.write2

ใช้ตัวแปร flip-flop เพื่อสลับระหว่างการเลื่อนไพ่ด้านบนและล่าง

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

จะ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,>,--)}}

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

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

การเล่นกอล์ฟในสวิฟต์เป็นสิ่งที่ท้าทายอยู่เสมอ


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

ทับทิม, 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 parser จนกว่าจะเสร็จสิ้น มีฟังก์ชั่นทั้งหมดก่อนหน้านั้น แต่ฉันไม่รู้ว่ามันถูกต้องหรือไม่ที่ฉันจะอนุญาตให้Noodelแข่งขัน ดังนั้นฉันจึงใช้เส้นทางที่ปลอดภัย :)
tkellehe

@ mbomb007 ขอบคุณสำหรับการแก้ไข ฉันไม่ได้ตระหนักว่ามันถูกวางไว้ด้านบน
tkellehe

0

ทุบตี, 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.