MITの教授は心を読むことができます!


46

タスクはDevadas教授によるMIT講義「You can mind read minds」から取得されます。トリックの詳細な説明は、リンクされたビデオまたはこのドキュメントに記載さています。それをより簡単な言葉で説明しようとします。

これは1930年代に発明されたもので、「フィッチチェイニーの5つのカードトリック」として知られています。


トリックは次のようになります。

  • カードのデッキから5つのランダムなカードが選択されます。観客とあなたのアシスタントはそれらを見ることができますが、あなたは見ません。
  • アシスタント(練習した相手)は、これらのカードのうち4枚を選択し、特定の順序で表示します。非表示のカードは、5枚のカードからランダムに選択されるわけではないことに注意してください。アシスタントは、トリックを機能させるカードを選びます。
  • 4枚のカードから収集できる情報に基づいて、5枚目のカードを推測します。

どうやって?

次の2つの点に注意してください。

  1. 5枚のランダムなカードを選択する場合、少なくとも 2枚のカードが同じスーツを持っていることが保証されます1

  2. 以下の画像は、すべてのランク2の円を示しています。円であるため、J、Q、K、A、2、3(モジュラーカウント)をカウントできます。隠されたカードは、同じスーツ(以下で説明)になるため、最初のカードと同じランクではないことが保証されます。最初のカードと隠しカードは、隠しカードが最初よりも1から6ランク高いように選択することが常に可能です(丸で数える場合)。最初のカードが1の場合、非表示のカードは2,3,4,5,6または7になります。最初のカードがJの場合、非表示のカードはQ、K、A、2、3、または4などになります。

円形に配置されたAからKまでのカードランク


アルゴリズム:

最初のカード:このカードには、隠しカードと同じスーツがあります。このカードは、隠しカードのランクを計算するときに使用する基準点にもなります。

2番目、3番目、および4番目のカードは、1〜6の範囲の値をデコードします。3枚のカードをS、M、L(最小カード、中間カード、最大カード)と呼びます。値は次のようにエンコードされます(辞書式順序):

S M L   -> 1
S L M   -> 2
M S L   -> 3   
M L S   -> 4
L S M   -> 5
L M S   -> 6 

したがって、最初のカードのランクが5で、残りの3つのカードのランクが4 Q 7(それらはSLMに注文されている)である場合、最後のカードのランクは5 + 2 = 7です。です。一貫性がある限り、エースが最高か最低かを選択できます。

複数のカードがランクを共有している場合、スーツが順番を決定します(C <D <H <S)


入力形式:

4枚のカードは、H3(ハートの3つ)、DK(ダイヤモンドの王)などとして与えられます。代わりに、3HおよびKDのように入力を選択することもできます。

入力は任意の便利な形式にすることができますが、ある変数のスーツのリストと別の変数のランクのリストを組み合わせることはできません。'D5', 'H3' ..そして、 [['D',5],['H',3] ...両方OKですが、'DHCH',[5,3,1,5]ではありません。Tを除き、文字の代わりに数字を使用することはできません。

出力

入力と同じ形式の隠しカード。


ウォークスルーをしましょう:

Input:
D3 S6 H3 H9

最初のカードはダイヤモンドなので、隠されたカードはダイヤモンドであることを知っています。また、最初のカードのランクが3であるため、ランクが4,5,6,7,8または9であることもわかっています。ます。

残りのカードは6,3,9 ==> M、S、Lの順序で並べられ、値3をエンコードします。したがって、隠しカードは3 + 3 = 6個のダイヤモンドであるため、出力はD6になります。

テストケース:

C3 H6 C6 S2
C9            # The order is LMS (H6 > C6, and 2 < 6). 3+6=9     

SQ S4 S3 ST   # (ST = S10. Format is optional)
S2            # The order is MSL. 12+3=2

HA CA DA SA
H2            # The order is SML. 14+1=2

これはであるため、各言語で最も短いソリューションが優先されます。説明が奨励されています!


図1は、 4つのスーツ(存在するCの lubs、Dの iamonds、Hの earts及びSの padesを)。

2 13ランク、2,3,4,5,6,7,8,9,10、J、Q、K、Aがあります。10の代わりにTを使用することもできます。

回答:


17

JavaScript(ES6)、130 102バイト

入力を"Rs"形式の文字列の配列として受け取ります。Rはランクで、sはスーツです。期待する「T」 10人のため。エースが低い。

a=>(s='A23456789TJQK')[([[R,[,S]],B,C,D]=a.map(c=>[s.search(c[0])+14,c]),R+=D<C|2*((D<B)+(C<B)))%13]+S

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

どうやって?

我々は最初の配列に各カードを変換[ランク、カード] ランクの数値である[14 ... 26]及びカード元の文字列です。

[[R, [, S]], B, C, D] = a.map(c => ['A23456789TJQK'.search(c[0]) + 14, c])

最初のカードのランクとスーツは、それぞれRSに保存されます。他の三つのカードはに格納されているBC及びD

たとえば、次のように['3c','6h','6c','2s']なります。

[ [ 16, '3c' ], [ 19, '6h' ], [ 19, '6c' ], [ 15, '2s' ] ]
    ^^    ^     <---------->  <---------->  <---------->
    R     S          B             C             D

次に、[B、C、D]の各ペアを比較します。これらの要素は、互いに比較されると暗黙的に文字列に強制されます。

[ 19, '6h' ] --> '19,6h'

ランクカードの両方が正確に2文字で構成されることが保証されているため、辞書順で比較しても安全です。

計算します:

(D < C) | 2 * ((D < B) + (C < B))

以下はすべての可能な組み合わせです。

 B, C, D | v0 = D < B  | v1 = C < B  | v2 = D < C  | v2|2*(v0+v1)
---------+-------------+-------------+-------------+--------------
 S, M, L |    false    |    false    |    false    |      0
 S, L, M |    false    |    false    |    true     |      1
 M, S, L |    false    |    true     |    false    |      2
 M, L, S |    true     |    false    |    true     |      3
 L, S, M |    true     |    true     |    false    |      4
 L, M, S |    true     |    true     |    true     |      5

最後に、RS、および上記の結果を使用して出力カードを作成します。

'A23456789TJQK'[(R += D < C | 2 * ((D < B) + (C < B))) % 13] + S

あなたのバリアントは役に立たないわけではありません、それは単にベースとパワーの間違った選択です!を使用92427**3して変更k+7k+8、1バイトを保存しますa=>(k='A23456789TJQK'+92427**3)[[[r,s],...x]=a.map((c,i)=>[k.search(c[0])+10,c[1],i]),(r-k[x.sort().map(c=>k=k*2|c[2])|k+8])%13]+s
。– asgallant

187**97k+15にも動作しますが、私はかなり確信したものが、このアルゴリズムのために短くなっている2組のみですよ。
18年

@asgallant素敵な発見!
アーナウルド

@asgallant 1/34547k+14も動作します。
アーナウルド

15

パイソン2143 140 138 136 127 125の 124 123 121バイト

lambda(S,V),*l:S+N[F(V)+int(`map(sorted(l,key=lambda(s,v):(F(v),s)).index,l)`[1::3],3)*3/10]
N='23456789TJQKA'*2;F=N.find

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

エースが高い


カードのソートされたリスト(0=smallest, 1=middle, 2=largest)で位置を見つけることにより、3つのカードをエンコードします。

cards:   [SK, C4, H4]
sorted:  [C4, H4, SK]

ranks:   [ 2            index of SK in sorted
ranks:   [ 2,  0        index of C4 in sorted
ranks:   [ 2,  0,  1    index of H4 in sorted
ranks:   [ 2,  0,  1] = L,S,M

これは、基数3の整数に変換され、3で乗算され、10で除算されます。

int('201',3) = 19 -> 19*3//10 = 5

異なるエンコーディングは次のとおりです。

cards            base3    *3   /10
[0, 1, 2]  012     5      15     1
[0, 2, 1]  021     7      21     2
[1, 0, 2]  102     11     33     3
[1, 2, 0]  120     15     45     4
[2, 0, 1]  201     19     57     5
[2, 1, 0]  210     21     63     6

保存済み:

  • -2バイト、ovsのおかげ

チャレンジを書いたとき、3項アプローチを使用してこれをどのように解決できるかを考えましたが、それを行う良い方法がわかりませんでした...乗算3は巧妙でした!いい答え:)
Stewie Griffin

@StewieGriffinありがとう:)今0、最後にaを追加し、10で割ります。
TFeld

1
@アーナウルド。私がやっていることを少しわかりやすくするために、説明を更新しました。
TFeld

10

ゼリー、33バイト

ØDḊḊ;“TJQKA”p“CDHS”
¢iⱮµḊŒ¿×4+Ḣị¢

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

説明

最初の行はniladicです。52枚のカードのリストを生成します

ØDḊḊ;“TJQKA”p“CDHS”
ØD                   Digits: '0123456789'
  ḊḊ                 Dequeue twice: '23456789'
    ;                Append with...
     “TJQKA”         ...the string 'TJQKA': '23456789TJQKA'. These are the ranks
            p        Cartesian product with...
             “CDHS”  ...the suits.
                     This yields the list of all cards in lexicographic order:
                                 ['2C', '2D', '2H', '2S',
                                  '3C', ...         'AS']

メインリンクで、¢カードのリストである最初のリンクの結果を呼び出します。

¢iⱮµḊŒ¿×4+Ḣị¢
¢              List of cards
 iⱮ            Index of each (Ɱ) of the inputs in the list.
   µ           New monadic link. The list of indices become this links argument.
    Ḋ          Remove the first one.
     Œ¿        Index of the permutation of the last three items. Gives a number 1-6
               as described in the problem statement.
       ×4      Multiply this by 4 so that when we add to the index of the first
               card we end up in the same suit.
         +Ḣ    Add the first index.
           ị   Use this number to index into...
            ¢  ...the list of cards.

1
1エースには使えません。
エリックアウトゴルファー

@EriktheOutgolferはAに戻りました
ディルナン

あなたはできるレジスタを使用バイト救うために
ジョナサン・アラン

5

APL(Dyalog Unicode)、49 バイトSBCS

x⌽⍨⊃i-4×2-⌊1.8⊥⍋1i←⎕⍳⍨x←,⍉'CDHS'∘.,2↓⎕D,'TJQKA'

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

概要:'CDHS'∘.,2↓⎕D,'TJQKA'外積を生成するので、を持つ2Dマトリックス(C2 C3 C4 ...), (D2 D3 D4 ...), ...。次に、この行列を転置して取得し(C2 D2 H2 ...), ...、それを平坦化します。

の@ngnに感謝します2-⌊1.8⊥。これは、カードの順序(SML = 1 2 3)を取り、それらを評価します(OPの1から6など)。

コードの説明:

x⌽⍨⊃i-4×2-⌊1.8⊥⍋1i←⎕⍳⍨x←,⍉'CDHS'∘.,2↓⎕D,'TJQKA'
                                       D,'TJQKA'  Concatenate a list of numbers with TJQKA
                                     2            Drop 2 (removes "01")
                                  ∘.,              Generate the outer product of this prefixed with
                            'CDHS'                 The suits
                                                  Invert rows/columns
                          ,                        Flatten (matrix -> array)
                        x                         Store in x
                      ⍳⍨                           Inverted ⍳⍨: find the indices, in our cards,
                                                  of the argument cards
                   i                              Store these indices in i
                 1                                Remove the first index
                                                  Grade: get ordered indices
         2-⌊1.8                                   The magic happens here: get the number from 1 to 6
       4×                                          Multiply by 4 to get the same "back" on the card
    i-                                            Substract the result from our first index (which we had discarded)
x⌽⍨                                               (Modulated) Index into x (our cards) with this value

4

網膜218208バイト

[JQK]
1$&
T`AJQK`1123
*' G0`
\d+
5**
' G, 1,`
T`CD\HS`d
\d
*
/^(_+)¶\1/(/¶(_+)¶\1/(K`1
/^(_+)¶_+¶\1/(K`2
))K`4
/^(_+)¶_+¶\1/(K`3
/¶(_+)¶\1/(K`5
)))K`6
\d
$+3-$&
(\d+)-(\d+)
$1*_$2*
_{13}(_+)|(_{1,13})
$.($1$2

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

説明:

[JQK]
1$&
T`AJQK`1123

Aces、Jacks、Queens、Kingsを1、11、12、13に置き換えます。最初の2行1は文字の前にaを追加し、最後の文字は2番目の数字を音訳します。

*' G0`

*このステージは作業文字列を変更するべきではないことを示しています。これにより、ステージは無意味に見えるかもしれませんが、後で役立ちます。'すべてのスペースで働いて文字列を分割し、G0(それが最初のカードを見つけたので)最初の1を取ります。

\d+
5**
' G, 1,`'

最初の2行はカードの数字に5を掛けてから単項に変換します(たとえば、5は_____として表されます)。これにより、後でスーツに小額を追加できます。最後の行はスペースで分割され、最後の3枚のカードを保持します。

T`CD\HS`d
\d
*

これにより、クラブ、ダイヤモンド、ハート、スペードがそれぞれ0、1、2、3に変換され、数値が単項に変換されます。現在はカードの数字部分に添付されているため、カードに一意の値を与え、その高さを決定します。

/^(_+)¶\1/(/¶(_+)¶\1/(K`1
/^(_+)¶_+¶\1/(K`2
))K`4
/^(_+)¶_+¶\1/(K`3
/¶(_+)¶\1/(K`5
)))K`6

これにより、カードの順序と最初のカードに追加する値が見つかります。たとえば、最初の行では、最初の/^(_+)¶\1_+/(値より大きい中間値を持つ注文に一致します。実行するif-elseループを作成します(この順序は順列1、2、および4と一致するため)。K定数をマークします。

\d
$+3-$&

*ステージが作業文字列に影響を与えないことを示すために使用したときのことを覚えていますか?ここで使用します。この段階は置換段階です。加算する数値を置き換え$+3-$&ます。ステージに$+3アクセスし*、最初のカードのスーツと番号を取得-し、セパレーターとして機能し$&、一致します。そのため、作業文字列は{suit}{original number}-{number to add}

(\d+)-(\d+)
$1*_$2*

これにより、2つの数値が単項になり、それらが加算されます。

_{13}(_+)|(_{1,13})
$.($1$2

一番上の行は、数値または数値-13のいずれかをキャプチャします(そのため、たとえばS16の出力を取得しません)。一番下の行は、キャプチャした数値を基数10に戻し、結果が暗黙的に出力されます。


一定!正規表現を逆にして、13より大きい数を優先するようにしました
lolad

3

64 62バイト

≔⪪⭆⁺⭆⁸⁺²ιTJQKA⭆CDHS⁺λι²δ≔E⟦ηζε⟧⌕διυ§δ⁺⌕δθ×⁴⊕⁺∧⌕υ⌊υ⊗⊕¬⌕υ⌈υ‹⊟υ⊟υ

オンラインでお試しください!リンクは、コードの詳細バージョンです。T10を使用し、A上位に並べ替えます。順列インデックスは簡単にデコードできませんでした。別の並べ替え順序を使用すると、少なくとも3バイト節約できます。説明:

⁺⭆⁸⁺²ιTJQKA

0から7までのすべての整数に2を加算し、それらを連結しTJQKAて、絵カードとエースの接尾辞を付けます。これにより、文字列リテラルよりも2バイト節約されますが、Aいずれにしても文字列の圧縮によって1バイト節約できることがわかります。

≔⪪⭆...⭆CDHS⁺λι²δ

カードとスーツをマップし、2つを連結します。通常、これはネストされた配列を生成するため、結果は代わりに単一の文字列に連結され、その後再び文字のペアに分割されます。

≔E⟦ηζε⟧⌕διυ

2番目、3番目、4番目のカードの位置を見つけます。

⊕⁺∧⌕υ⌊υ⊗⊕¬⌕υ⌈υ‹⊟υ⊟υ

1インデックスの順列インデックスを計算します。最初の2つの順列には、最初に最小のカードがあります。これはを介してテストされ⌕υ⌊υます。他の2組の順列は、最大のカードが最初であるかどうかによって区別されます。これはを介してテストされ⌕υ⌈υます。論理演算と算術演算は、値にこれらのテストをマッピングし02そして4、これは、1を介してテストされた3番目と4番目のカードの比較に応じて増加し‹⊟υ⊟υます。最後に、インデックスがインクリメントされて、目的のエンコーディングが提供されます。

§δ⁺⌕δθ×⁴...

それに同じスーツのカード間の距離を表す4を掛け、最初のカードの位置を加算し、結果に周期的にインデックスを付けて印刷します。






1

T-SQL、211バイト

入力はテーブル変数です。Tを10に使用すると、エースは低くなります

カードのランク/スーツKH、6D、TSの形式

DECLARE @ TABLE(c char(2),i int identity(4,-1))
INSERT @
VALUES('2C'),('AH'),('QS'),('KC')

SELECT
substring(max(h+h),max(charindex(q,h)*w)+power(sum(r)*3,.5)-11,1)+max(right(c,w))
FROM(SELECT*,i%4*power(3,rank()over(order by w,charindex(q,h),c))r
FROM(SELECT*,i/4w,left(c,1)q,'A23456789TJQK'h FROM @)d)y

オンラインで試してみる

SML(12-17)値の計算方法に注意してください。

論理的にS、M、L(1,2,3)は数値に変換されます

最初のカードの値は27 *シーケンス値です

2番目のカードの値は9 *シーケンス値です

3番目のカードは3 * sequenceの値です

3を掛けると、切り捨てられた平方根が適切な連番になります。

Order    27,9,3*order=r   sum(r)*3    floor sqrt
S M L -> 1*27+2*9+3*3  -> 162      -> 12
S L M -> 1*27+3*9+2*3  -> 180      -> 13
M S L -> 2*27+1*9+3*3  -> 216      -> 14 
M L S -> 2*27+3*9+1*3  -> 252      -> 15
L S M -> 3*27+1*9+2*3  -> 288      -> 16
L M S -> 3*27+2*9+1*3  -> 306      -> 17

1

05AB1E、37 バイト

2TŸ.•3u§•S«.•ôì•âíJuDIkćsD{œJsJk>4*+è

Port of @dylnanのJelly answerですが、残念ながら05AB1Eには置換インデックスが組み込まれていません。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

2TŸ                # Push the list [2,3,4,5,6,7,8,9,10]
   .•3u§•S         # Push compressed string "jqka", converted to a list of characters
          «        # Merge the lists together
.•ôì•              # Push compressed string "cdhs"
     â             # Create each possible pair
      í            # Reverse each pair
       Ju          # Join each pair together, and convert to uppercase
D                  # Duplicate the deck
 Ik                # Get the index of the cards of the input-list in the deck
   ć               # Extract head; pop and push remainder and head
    s              # Swap to get the remainder
     D{            # Create a sorted copy
       œ           # Get the permutations of that
        JsJk       # Get the index of the unsorted permutation in this permutations list
            >      # Increase it by 1 (since 05AB1E has 0-based indexing)
             4*    # Multiply it by 4
               +   # Add it to the extracted head
                è  # And index it into the duplicated deck
                   # (after which the result is output implicitly)

この05AB1Eのヒント(辞書に含まれていない文字列を圧縮する方法?を参照して、.•3u§•is "jqka"および.•ôì•is を理解してください"cdhs"

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