Діти перетасовують картки


12

Переміщення колоди карт важко для дітей, тому вони повинні знайти способи отримати розумну та зручну колоду якомога простіше.

Один із способів зробити це, що дає досить хороші результати:

  1. Вийміть верхню карту і вставіть її довільно в колоду
  2. Вийміть нижню карту і вставіть її в випадкове місце в колоду
  3. Продовжуйте, поки ви не повірите, що це досить добре.

Зверніть увагу, що ви ніколи не вставляйте карту в верхнє або нижнє місце, вона повинна бути розміщена десь у колоді.


Замість перетасовки карт, ми будемо тасувати буквено - цифрові знаки: 0-9, A-J, a-j, q-zі Q-Z.

Почніть з рядка, показаного нижче, і перетасуйте символи так, як це описано вище. Ви можете вибрати, чи хочете ви продовжувати перетасовувати нескінченно або перемішувати картки 100 раундів (100 карт зверху та 100 карт знизу).

0123456789abcdefghijqrstuvwxyzABCDEFGHIJQRSTUVWXYZ

Завдання полягає у відображенні перетасованих персонажів. Кожна «перетасовка» (виймання та вставлення картки) займає від 0,25 до 0,35 секунди.

Наведений нижче графік показує приклад виводу:

введіть тут опис зображення


Це тому найкоротший код у байтах виграє.


«Чому б вам не a-tзамість a-j, q-zТому що це має ілюструвати костюми карток, а не лише символи. І так, є 5 костюмів.


Примітка. Я вирішив припинити використання галочки на викликах. Відповідні мета-повідомлення тут і тут .


Як там 5 костюмів?
TrojanByAccident

1
@TrojanByAccident П'ять набори карт (ASCII символів) по масті 0-9, A-J, a-j, q-zі Q-Z, з цього питання.
mbomb007

і є 50 карток, а не 52. можливо діти втратили дещо.
Ясен

@ mbomb007 Я питав, як було 5 мастей карт. Якщо я чогось не пропускаю, є тільки лопати, клуби, серця та діаманти. Ось 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)
Арнальд

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)створює початкову колоду і зберігає її в @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 байт

Збережено 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

Використовує printфункцію Python 3 для придушення нового рядка, коротшого, ніж 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

Рубін ( 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

Локшина , не конкуруючий 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

баш, 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або в редактор відповідно до того, як працює ваш редактор (якщо припустити, що редактор працює)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.