매직 카드 트릭을보고 싶으십니까?


16

내가 어렸을 때 배운 첫 번째 마술 카드 트릭은 다음과 같습니다.

  • 뒷면의 패턴이 세로 대칭이 아닌 곳에 1 장의 카드가 있어야합니다.
  • 모든 카드가 한 방향을 향하도록 구성하십시오.
  • 개인에게 "카드 나 카드를 골라 암기 한 후 돌려주십시오"라고 요청하십시오.
  • 갑판에 넣는 방향으로 진행하십시오 (잘못된 방향으로).
  • 카드가 어디에 있는지 모르는 착각을주는 격렬한 셔플.
  • 놀랍게도 카드를 제작하십시오.

이 요령은 요즘에는 자연적으로 약간 부족한 것이지만 좋은 도전입니다. 입력이 없을 때 무작위로 선택된 카드 중 하나를 무작위로 선택하여 뒤집은 무작위로 섞인 카드 덱을 출력하는 프로그램을 작성하십시오. 그러나 입력이 한 장의 카드를 뒤집어 놓은 카드 덱인 경우에는 뒤집은 카드를 올바른 순서로 출력해야합니다.


카드 데크

카드 덱은 다음과 같이 정의됩니다.

[2S,3S,4S,5S,6S,7S,8S,9S,TS,JS,QS,KS,AS,
 2D,3D,4D,5D,6D,7D,8D,9D,TD,JD,QD,KD,AD,
 2H,3H,4H,5H,6H,7H,8H,9H,TH,JH,QH,KH,AH,
 2C,3C,4C,5C,6C,7C,8C,9C,TC,JC,QC,KC,AC]

카드는 숫자로 정의 된 다음 해당 소송의 첫 글자로 정의됩니다. 카드의 뒷면은 정반대이며, 첫 번째 문자와 숫자가 뒤 따릅니다.

그려진 카드

예를 들어, 우리가 무작위로 뒤집기로 선택한 카드가이면 4 of Clubs (4C)결국 셔플 링없이 종료됩니다.

[2S,3S,4S,5S,6S,7S,8S,9S,TS,JS,QS,KS,AS,
 2D,3D,4D,5D,6D,7D,8D,9D,TD,JD,QD,KD,AD,
 2H,3H,4H,5H,6H,7H,8H,9H,TH,JH,QH,KH,AH,
 2C,3C,C4,5C,6C,7C,8C,9C,TC,JC,QC,KC,AC]

셔플 링

그런 다음 셔플 링 후 :

[2H,2C,6S,4D,QH,6C,TD,8C,7H,5H,C4,3D,7S,7C,KC,QD,QC,JS,7D,6D,2S,5C,KD,3C,3S,2D,8H,KH,6H,AH,8S,JH,TS,AD,5D,9H,4H,JD,QS,4S,JC,3H,8D,TC,AS,TH,KS,AC,9C,9S,5S,9D]

이것은 빈 입력이 주어지면 유효한 출력입니다.

데크 입력

그러나 반대로 프로그램이 위의 출력을 입력으로 받으면 출력해야합니다 4C. 즉, 다음과 같은 입력에 대한 것입니다.

[2H,2C,6S,4D,QH,6C,TD,8C,7H,5H,C4,3D,7S,7C,KC,QD,QC,JS,7D,6D,2S,5C,KD,3C,3S,2D,8H,KH,6H,AH,8S,JH,TS,AD,5D,9H,4H,JD,QS,4S,JC,3H,8D,TC,AS,TH,KS,AC,9C,9S,5S,9D]

뒤집힌 카드를 찾을 때까지 반복하고 다시 되돌려 일반 상태로 되돌립니다. 그래서 여기서 우리 C4는 C가 숫자가 아니라는 것을 알고 그것을로 반환 4C합니다.


규칙

  • 외부 소스에서 데크를로드 할 수 없습니다.
  • 비어있는 입력은 무작위 카드 1 장을 뒤집어 무작위 섞은 카드를 만듭니다.
  • 1 장의 카드를 입력으로 뒤집은 카드 덱은 뒤집힌 카드가됩니다.
  • 다른 입력 장치는 미래의 튜브를 통해 폭발하는 라마가 세그웨이를 타고 올라갈 수 있습니다.
    • 또는 그 문제에 대한 다른 것.
  • 선택한 카드와 셔플 순서는 모두 균일해야합니다.
    • IE의 모든 카드는 뒤집어 질 가능성이 동일합니다.
    • IE는 모든 카드 조합이 나타날 확률이 동일합니다.
  • 당신은 SHCD또는 shcd정장을 사용할 수 있지만 일관성이 있습니다.
    • 대문자를 선택하면 ( SHCD)도 사용해야 TJQKA합니다.
    • 소문자를 선택하면 ( shcd)도 사용해야 tjqka합니다.
  • 이것은 이며 우승자는 가장 낮은 바이트입니다.

2
@ labela--gotoa이 haha의 FAR 변형이 너무 많습니다. 나는 아빠가 수직 대칭 카드를 사용하고 다른 속임수를 쓰면서 내 마음을 불렀다는 것을 기억하지만, 이것이 내가 생각한 것 같아요.
매직 문어 Urn

13
"미래의 튜브를 통해 세그웨이를 타고 폭발적인 라마"-나는 당신의 다음 아스키 예술 도전을 기대하고 있습니다 ...
Level River St

3
전체 데크를 0에서 51까지 임의의 오프셋으로 회전 시키면 "모든 카드가 셔플 된 데크의 어느 곳에 나 나타날 가능성이 동일합니다"라는 조건을 만족하지만, 임의 셔플 링으로 간주해서는 안됩니다. 모든 (52!) 주문이 거의 동일 할 가능성이 있습니까?
aschepler

1
@aschepler가 말한 것을 확장하기 위해 : 많은 언어에서 기본 PRNG의 기간 길이 를 사용하여 52 개 중 대부분 ! 가능한 셔플은 정확히 0 과 동일하게 나타날 가능성이 있습니다 (셔플 링 알고리즘에 따라 더 좋거나 나쁠 수도 있음).
Arnauld

1
달라이 라마가 돌리에서 라마를 타는 것도 가능합니까? 나는 세그웨이와 폭발물이 없지만 사탕 벌레가 있습니다 ... i.imgur.com/gEkVR5P.gif
Tschallacka

답변:


7

망막 , 61 60 59 바이트

G`[HCDS].
^$
23456789TJQK
/^2/&L$`.
$&H¶$&D¶$&C¶$&S
@V`
O?`

온라인으로 사용해보십시오! 편집 : @MartinEnder 덕분에 1 2 바이트가 절약되었습니다. 설명:

G`[HCDS].

되 돌리지 않은 카드를 모두 삭제하십시오. 이렇게하면 뒤집힌 카드 하나 또는 카드가 없어야합니다.

^$
23456789TJQK
/^2/&L$`.
$&H¶$&D¶$&C¶$&S

입력이 비어 있으면 카드 팩을 만드십시오.

@V`

한 장의 카드를 무작위로 선택하고 뒤집습니다 (반전 된 단일 카드와 반대).

O?`

카드를 섞습니다.


4

05AB1E , 29 바이트

Y9ŸJ.•§®т•«.•öB•âsKDgiëDΩÂ:.r

온라인으로 사용해보십시오!


. • Āk {? Öw • 9LJì #`â는 몇 바이트를 절약하여이 두 파일을 함께 압축합니다.
Magic Octopus Urn

@MagicOctopusUrn : 1과 2를 제거한 후에는 같은 바이트 수로 끝나지 않습니까?
Emigna


@MagicOctopusUrn : 불행히도. 둘 다 1있고 a거기에 있습니다.
Emigna

다음 Y9ŸJ과 같이 잘못 해석해주세요.9LJ
Magic Octopus Urn

3

PowerShell v2 이상 (175 바이트)

%{$s=[char[]]'SDHC';if($_){$_|?{$s-contains$_[0]}|%{$_[1]+$_[0]}}else{$d=$s|%{$e=$_;[char[]]'23456789TJQKA'|%{$_+$e}}|random -c 52;$r=random 52;$d[$r]=$d[$r][1]+$d[$r][0];$d}}

긴 버전 :

ForEach-Object {
    $s = [char[]]'SDHC'                         # Create a character array with the suits
    if ($_) {                                   # If there's pipeline input ...
        $_ |                                    # ... write it to the output pipeline ...
            Where-Object {$s -contains $_[0]} | # ... but let only those input elements pass where the first letter appears in the suits ...
            ForEach-Object {$_[1] + $_[0]}      # ... and swap the two elements
    } else {
        $d = $s | ForEach-Object {              # Assign $d to the output of the suits, processing each element first.
                $e = $_                         # Store the current suit element for use in the inner loop
                [char[]]'23456789TJQKA' | ForEach-Object {$_ + $e}  # Process each of the numbers, joining it with the current suit, ...
            } | Get-Random -Count 52            # ... and the resulting 2-char-strings goes back into the output to be shuffled
        $r = Get-Random -Maximum 52
        $d[$r] = $d[$r][1] + $d[$r][0]          # Swap the two chars of a random array element in $d
        $d                                      # Write $d to the output pipeline
    }
}

용법:

뒤섞인 데크를 만들고 변수에 저장하십시오.

$Deck = %{$s=[char[]]'SDHC';if($_){$_|?{$s-contains$_[0]}|%{$_[1]+$_[0]}}else{$d=$s|%{$e=$_;[char[]]'23456789TJQKA'|%{$_+$e}}|random -c 52;$r=random 52;$d[$r]=$d[$r][1]+$d[$r][0];$d}}

예를 들어 변수를 검사하십시오.

$Deck -join ','

데크를 스크립트로 다시 파이프하십시오.

$Deck | %{$s=[char[]]'SDHC';if($_){$_|?{$s-contains$_[0]}|%{$_[1]+$_[0]}}else{$d=$s|%{$e=$_;[char[]]'23456789TJQKA'|%{$_+$e}}|random -c 52;$r=random 52;$d[$r]=$d[$r][1]+$d[$r][0];$d}}

2

파이썬 2 , 175 바이트

from random import*
s='SHCD';c='23456789TJQKA'
d=input()
if d:print[b+a for a,b in d if a in s];q
k=sample
r=k(c,1)+k(s,1)
print k([(a+b,b+a)[r==a+b]for a in c for b in s],52)

온라인으로 사용해보십시오! 빈 입력은 다음과 같이 표시됩니다[]


2

> <> , 215 193 바이트

i:0)?\~"CHSD":"2"$:"3"$:"4"$:"5"$:"6"$:"7"$:"8"$:"9"$:"T"$:"J"$:"Q"$:"K"$:"A"$&105&"S"=?.~~~{c0.
=+i$?\i$:::"B")$"I"(*$"S"
_oo$~/;
x0
x0
x0
x0
x0
x0
x0
x0
x0
x0
\l&>?!<
>&"3"%:?\~$>o<
\  }}&-1/

온라인으로 사용해보십시오!

분리되지 않은 카드로 입력을 받고 동일한 것으로 출력합니다 (예 : KCAC5C6S... )

테스트하기 쉽도록 다음 버전이 있습니다. 입력을 쉼표로 구분하고 출력을 줄 바꿈으로 구분 이 있습니다.

모든 x0것은 반-균일 난수 생성기를 만들기위한 시도 일뿐입니다. 이들 중 많은 것이 가능한 값의 범위를 증가시키고 그 반대의 경우는 더 적습니다. 그들 중 10 명은 내가 무작위로 판단한 곳입니다.

다음의 규칙을 따릅니다.

  • 모든 카드를 뒤집을 확률은 동일합니다.
  • 모든 카드는 셔플 데크의 어느 곳에 나 나타날 확률이 동일합니다.

그러나 모든 셔플 조합이 가능한 출력은 아닙니다 (실제로 대다수는 그렇지 않습니다).


2

젤리 , 26 바이트

9ḊṾ€;“AJKQT”p“CDHS”ḟ⁸ẊU-¦Ẋ

문자 목록 (0 개의 카드의 스터브 또는 1 개의 카드가 뒤집힌 52 개의 카드로 구성된 전체 덱)을 수락하고 문자 목록 (1 개의 뒤집힌 카드의 스터브이지만 앞 또는 전체)을 반환하는 모나드 링크 -임의의 카드 1 개가 뒤집힌 데크).

온라인으로 사용해보십시오! (입력 및 출력 표현이 일치하도록 바닥 글-전체 프로그램 젤리 코드로 파이썬은 인수를 평가하고 출력을 위해 문자를 함께 스매시합니다)

어떻게?

9ḊṾ€;“AJKQT”p“CDHS”ḟ⁸ẊU-¦Ẋ - Link: list of lists of characters, Z
9Ḋ                         - nine dequeued = [2,3,4,5,6,7,8,9]
  Ṿ€                       - unevaluate €ach = ['2','3','4','5','6','7','8','9']
     “AJKQT”               - literal list of characters = ['A','J','K','Q','T']
    ;                      - concatenate = ['2','3','4','5','6','7','8','9','A','J','K','Q','T']
             “CDHS”        - literal list of characters = ['C','D','H','S']
            p              - Cartesian product = [['2','C'],['2','D'],...,['T','S']]
                           -   a full deck of forward cards
                    ⁸      - chain's left argument, Z
                   ḟ       - filter discard
                           -   leaving either that deck or the 1 reversed card in the input
                     Ẋ     - shuffle
                        ¦  - sparse application...
                       -   - ...to index: -1 (which doesn't exist when the length is only 1)
                      U    - ...do: upend (reverses the penultimate card of the deck)
                         Ẋ - shuffle

이것은 항상 마음의 열을 뒤집는 것 같습니다. 임의의 카드가 아니어야합니까?
Emigna

아, 고마워, 그래, 버그가있다-그것은 전에 여분으로 수정 될 수 있습니다 U(아마도 0 바이트를 고칠 수는 있지만) 나중에해야 할 것입니다 ...
Jonathan Allan

이것은 함수이기 때문에 입력이 비어 있지 않은 경우 단일 카드를 나타내지 [[number, suit]]않고 돌아올 수 있는지 확실하지 않습니다 [number, suit].
Outgolfer Erik

또한, 아니, 내가 생각하지 않는 모든 0 바이트 수정이를 위해.
Outgolfer Erik

@EriktheOutgolfer 왜 안 그렇습니까, 외로운 카드는 결국 단지 하나의 카드의 스텁 (짧은 데크)입니다.
Jonathan Allan

1

루비 , 95 (또는 100) 바이트

->n{s=(0..51).map{|i|"A23456789TJQK"[i/4]+"HCDS"[i%4]}
n[0]?s-n:s[rand 52].reverse!&&s.shuffle}

빈 배열을 입력으로 받으면 데크를 문자열 배열로 반환합니다. 비어 있지 않은 배열을 입력으로 지정하면 뒤집힌 카드를 단일 문자열을 포함하는 배열로 반환합니다. 뒤집힌 카드가 문자열을 포함하는 단일 요소 배열이 아닌 문자열로 필요한 경우 5 바이트가 추가됩니다.s-n 행을(s-n)[0]

온라인으로 사용해보십시오!

첫 번째 줄은 표준 데크를 생성합니다. 두 번째 줄은 다음과 같이 분류됩니다.

 n[0]?                  #If the input array is not empty (contains a truthy first element)
  s-n:                  #Find the contents of s with the contents of n removed. The only card remaining from the standard deck corresponds to the flipped card in the input.
                        #ELSE 
  s[rand 52].reverse!&& #Flip one card in place in the array s. As the result is truthy, whatever is next will be returned.
 s.shuffle              #shuffle the deck and return the shuffled deck with one element flipped
}

1

자바 8, 275 274 259 바이트

import java.util.*;s->{if(s==null){List l=new Stack();char i=52,r=i,x,y;for(r*=Math.random();i-->0;y="23456789TJQKA".charAt(i%13),l.add(i==r?x+""+y:y+""+x))x="HSDC".charAt(i&3);Collections.shuffle(l);return l;}return s.replaceAll(".*,(.)([^HSDC]).*","$2$1");}

입력은 문자열이고 출력은 문자열 또는 java.util.List 입력에 따라 다릅니다.

설명:

온라인으로 사용해보십시오.

import java.util.*;          // Required import for List, Stack and Collections
s->{                         // Method with String parameter and Object return-type
  if(s==null){               //  If the input is `null`:
    char i=52,               //   Index-integer
         r=i,                //   Random-integer
         x,y;                //   Temp characters
    List l=new Stack();      //   Create a List
    for(r*=Math.random();    //   Determine the random integer in the range (0;52]
        i-->0                //   Loop `i` 52 times:
        ;                    //     After every iteration:
         y="23456789TJQKA".charAt(i%13)
                             //      Set `y` to one of 23456789TJQKA based on `i` modulo-13
         ,l.add(i==r?        //      If the random integer equals the current `i`
                 x+""+y      //       Add the current card reversed
                :            //      Else:
                 y+""+x))    //       Add the current card as is
      x="HSDC".charAt(i&3);  //    Set `x` to one of HSDC based on `i` bitwise-AND 3
    Collections.shuffle(l);  //   Shuffle the generated Deck
    return l;}               //   And return this Deck as result
                             //  If the input was a Deck instead:
  return s.replaceAll(".*,(.)([^HSDC]).*",
                             //   Get the reversed card from the Deck,
            "$2$1");}        //   and output it non-reversed

1

Pyth, 45 바이트

J"CDHS"KO52=NsM.S*+c"AKQJT"1S9J|f}hTJQXNK_@NK

빈 입력을 위해 빈 목록을 가져옵니다.
온라인으로 사용해보십시오

설명

J"CDHS"KO52=NsM.S*+c"AKQJT"1S9J|f}hTJQXNK_@NK
J"CDHS"                                        Save the suits as J.
       KO52                                    Save a random index as K.
           =NsM.S*+c"AKQJT"1S9J                Save a shuffled deck as N.
                                f}hTJQ         Find all cards with suit first.
                               |      XNK_@NK  If there aren't any, flip a card.

1

R , 177 171 바이트

function(l=1,F="(.)(.)",R="\\2\\1",S=sample)if(l>1)sub(F,R,grep("^[SDHC]",l,v=T))else{m=S(outer(c(2:9,"T","J","Q","K"),c("S","D","H","C"),paste0))
m[1]=sub(F,R,m[1])
S(m)}

온라인으로 사용해보십시오!

빈 입력 (입력 f이없는 호출) 이 주어지면 기본적으로 갑판 l=1의 무작위 순열을 만듭니다 m. 가정sample무작위로 모든 카드가이 목록에서 첫 번째 일 확률은 같습니다. 따라서 첫 번째 항목을 수정 한 다음 다시 섞어 목록을 반환합니다.

그것을 SDHC뒤집 으면, 우리는 카드 중 하나에서 시작하여 뒤집습니다.


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