Детские тасовки карт

12

Перетасовать колоду карт сложно для детей, поэтому они должны найти способы получить разумно хорошо перетасованную колоду как можно проще.

Один из способов сделать это, который дает достаточно хорошие результаты:

  1. Выньте верхнюю карту и вставьте ее случайным образом в колоду.
  2. Выньте нижнюю карту и вставьте ее в случайное место в колоде.
  3. Продолжайте, пока не поверите, что это достаточно хорошо.

Обратите внимание, что вы никогда не должны вставлять карту в верхнем или нижнем месте, она должна быть помещена где-то в колоде.


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

Начните со строки, показанной ниже, и перетасуйте символы так, как описано выше. Вы можете выбрать, хотите ли вы продолжать перетасовку бесконечно или перемешать карты 100 раундов (100 карт сверху и 100 карт снизу).

0123456789abcdefghijqrstuvwxyzABCDEFGHIJQRSTUVWXYZ

Задача состоит в том, чтобы отобразить перетасовываемых персонажей. Каждое «перемешивание» (извлечение и вставка карты) занимает от 0,25 до 0,35 секунды.

GIF ниже показывает пример вывода:

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


Это поэтому выигрывает самый короткий код в байтах.


«Почему бы вам не 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. возможно, дети потеряли некоторые.
Jasen
@ 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
Suever
источник
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.

Использует переменную триггера для переключения между перемещением верхней и нижней карт.

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
busukxuan
источник
Будет 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, но, по крайней мере, я это понимаю. Также здорово узнать, что ruby ​​- это бесконечный туннель удивительного!

pottedmeat7
источник
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>

tkellehe
источник
Почему это не конкурирует?
Стьюи Гриффин
@ StewieGriffin Я не завершил выпуск js-парсера до окончания соревнования. Вся функциональность существовала до этого, но я не знал, правильно ли для меня было позволять Noodel конкурировать. Итак, я
выбрал
@ 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или в редакторе в зависимости от того, как работает ваш редактор (при условии, что ваш редактор работает)

Jasen
источник