マジックカードのトリックを見たいですか?


16

子供の頃に学んだ最初の魔法のカードのトリックは次のとおりです。

  • 裏面のパターンが上下対称ではないカードを1デッキ持っています。
  • すべてのカードを一方向に向けて整理します。
  • 個人に、「カードを選んで、どんなカードでも覚えて、それを返してくれ」と頼みます。
  • (間違った方向で)デッキに入れてください。
  • カードがどこにあるかわからないという錯覚を与えながら、激しくシャッフルします。
  • 彼らのカードを驚かせる。

このトリックは明らかに少し欠乏しており、今日では本質的に光沢がありますが、良い挑戦になります。入力を与えない場合、ランダムにシャッフルされたカードのデッキを出力し、ランダムに選択されたカードの1つを反転して出力するプログラムを作成します。ただし、入力が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のすべてのカードの組み合わせは、同じ確率で出現します。
  • あなたは使用することSHCDshcdスーツのために、しかし、一貫して:
    • 大文字のスーツ(SHCD)を選択する場合も使用する必要がありますTJQKA
    • 小文字のスーツ(shcd)を選択する場合も使用する必要がありますtjqka
  • これは、勝者は最下位バイトです。

2
@ labela--gotoaこのハハのバリエーションが多すぎます。お父さんが上下対称のカードを使って心を吹き飛ばし、別のトリックをやっていたのを覚えていますが、それがこれだと思いました。
魔法のタコ

13
「未来の管を通ってセグウェイに乗って爆発ラマ」 -私はあなたの次のASCII技術の挑戦を楽しみにしています...
レベル川セント

3
デッキ全体を0から51までのランダムなオフセットで回転させると、「すべてのカードがシャッフルされたデッキのどこにでも現れる可能性が等しい」という条件を満たすが、おそらくランダムシャッフルとは見なされない。すべて(52!)の注文がほぼ等しく発生する可能性があるということですか?
アシェプラー

1
@ascheplerが言ったことを拡張するために:多くの言語のデフォルトPRNGの期間の長さで、52のほとんど!シャッフルの可能性は、ゼロに正確に一致する可能性があります(ただし、シャッフルアルゴリズムによっては良くなることも悪くなることもあります)。
アーナウルド

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].

元に戻していないカードをすべて削除します。これにより、裏返されたカードが1枚残るか、カードが残りません。

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

入力が(今)空の場合、カードのパックを作成します。

@V`

1枚のカードをランダムに選択して反転します(反転した1枚のカードの反転を解除します)。

O?`

カードをシャッフルします。


4

05AB1E、29バイト

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

オンラインでお試しください!


。•Āk{?Öw•9LJì# `âは、これら2つを一緒に圧縮するために数バイトを節約します。
魔法のタコ

@MagicOctopusUrn:1と2を削除すると、同じバイト数になりますか?
エミグナ


@MagicOctopusUrn:残念ながらありません。あなたは両方を持っている1し、aそこインチ
エミグナ

誤解する私にそれを残すY9ŸJよう9LJ
マジックタコ壺

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

Python 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...

テストを簡単にするために、入力をカンマ区切りとして、出力を改行区切りとしてとるバージョンを次に示します。

すべてのx0sは、半一様乱数ジェネレーターを作成するための単なる試みです。それらの値が大きいほど、可能な値の範囲が広がり、小さいほど逆になります。それらのうち10個は、私がそれを十分にランダムであると判断した場所です。

以下のルールに従うことに注意してください。

  • すべてのカードは、逆に選択される可能性が等しくあります。
  • すべてのカードは、シャッフルされたデッキのどこにでも現れる可能性があります。

しかし、すべてのシャッフルされた組み合わせが可能な出力であるわけではありません(実際、大多数はそうではありません)。


2

ゼリー、26 バイト

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

キャラクターのリストのリスト(0枚のカードのスタブまたは1枚のカードが反転した52枚のフルデッキ)のリストを受け取り、キャラクターのリストのリスト(1枚の反転したカードのスタブが前方またはフル-1枚のランダムなカードを逆にしたデッキ)。

オンラインでお試しください!(入力と出力の表現を一致させるためのフッター-完全なプログラムJellyコードとしてPythonは引数をPython-evalsし、出力のために文字をスマッシュします)

どうやって?

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

これは常に10の心を逆転させるようです。ランダムなカードではありませんか?
エミグナ

おかげで、ああ、はいバグがある-それは余分で固定することができます前にU...(多分私が代わりにゼロバイトを修正することができます)が、後でそれを行う必要があります
ジョナサン・アランを

これは関数で[[number, suit]]ある[number, suit]ため、入力が空でないときに単一のカードを表す代わりに戻ることができるかどうかはわかりません。
エリックアウトゴルファー

また、いいえ、私はないと思う任意の 0バイトの修正はそのため。
エリックアウトゴルファー

@EriktheOutgolferなぜそうなのかわかりませんが、寂しいカードは結局1枚だけのスタブ(ショートデッキ)です。
ジョナサンアラン

1

Ruby、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]

オンラインでお試しください!

最初の行は標準デッキを生成します。2行目は次のように分類されます。

 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

Javaの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入力に応じて文字列またはaのいずれかです。

説明:

オンラインでお試しください。

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

R177 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本当にランダムであると仮定すると、どのカードもこのリストの最初になる可能性が等しくなります。したがって、最初のものを変更し、再度シャッフルしてリストを返します。

それを逆に、我々は1つで始まるカードを探し、SDHCそれを逆にします。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.