MITの教授にはAPが必要です!


14

5カードの手品には、アシスタントが表示された4枚のカードと隠されたカードをこの順番で与えるマジシャンが関与し、マジシャンは隠されたカードを推測する必要があります。

警告:以下の解決策!今すぐ出発するか、それで甘やかされてしまいます。


ソリューション

ここでのコツは、5枚のカードが特定の順序で与えられることです!

c1,c5は、指定された順序の5枚のカードです。

バツnのカード番号であるで(番号順)。cnNO=[A、2、3、4、5、6、7、8、9、T、J、Q、K]

a+b、カード番号、、整数では、カード番号に等しい右側のステップで最初に、ラッピング必要に応じ。abbaNO

snのスーツであるにおける(スーツオーダー)。cnSO=[,,,]

ab、カード番号とされるスーツでは、カード番号とカードを表し、とスーツ。abab

a<b、及びあればカードですが、本当であるのスーツの左にある s内のスーツ"、またはそのスーツ等しいとのカード番号がの左にあるのカード"番号。ababSOabNO

a>b(とはカード)は、が偽の場合に真になります。aba<b

PI(a,b,c)は、、、およびがカードであり、以下の表で指定される、これらの順序の順列インデックスです:abc
ComparisonPI(a,b,c)a<b<c1a<b>c>a2a>b<c>a3a<b>c<a4a>b<c<a5a>b>c6

5カードの手品の解決策は問題です:

c5=(x1+PI(c2,c3,c4))s1

チャレンジ

ここまでは順調ですね。ただし、上記で指定した計算を実行することは、すでにここで求められています。代わりに、5枚のカードを特定の順序で指定せずに適切に注文することが課題です。これは、出力の最初の4枚のカードが5枚目を表すことを意味します。言い換えれば、アシスタントになります。要件:

  • s5=s1
  • x5=x1+PI(c2,c3,c4(つまり、これは可能でなければならない)。

setを考えてみましょう7H,2D,6D,5C,6C。まず、25ペアを取得します。

7H,7H 7H,2D 7H,6D 7H,5C 7H,6C
2D,7H 2D,2D 2D,6D 2D,5C 2D,6C
6D,7H 6D,2D 6D,6D 6D,5C 6D,6C
5C,7H 5C,2D 5C,6D 5C,5C 5C,6C
6C,7H 6C,2D 6C,6D 6C,5C 6C,6C

次に、同じカードを2回含む5つのペアを明らかに削除します。これらは1つのデッキには存在しません。

      7H,2D 7H,6D 7H,5C 7H,6C
2D,7H       2D,6D 2D,5C 2D,6C
6D,7H 6D,2D       6D,5C 6D,6C
5C,7H 5C,2D 5C,6D       5C,6C
6C,7H 6C,2D 6C,6D 6C,5C      

その後、スーツは同じでなければならないので、ペアの異なるスーツはノーです:

                             
            2D、6D            
      6D、2D                  
                        5C、6C
                  6C、5C      

最後に、最大6を追加して残りのペアの半分を削除することで、最初のカードから2番目のカードに到達できるかどうかを確認します。

                             
            2D、6D            

                        5C、6C
                             

これで、有効なペア:2D,6Dとができました5C,6C。各ペアの最初のカードはカード1で、最後のカードはカード5です。

5C,6C簡単にするためにここに行きます。セット全体がな7H,2D,6D,5C,6Cので、選択したペアの2枚のカードを削除します7H,2D,6D。これらのカードはを表す6 - 5 = 1ため、「最小、中、最大」のように注文する必要があります。7H > 2D < 6D < 7H、または単に2D < 6D < 7H、だから私たちは今持ってい2D,6D,7Hます。

最後のステップは、これらすべてをまとめること5C,2D,6D,7H,6Cです。したがって、結果はになります。

明確化

  • 10代わりに使用できますT
  • のいずれか♠♥♦♣♤♡♢♧またはの♠♡♢♣代わりに使用できますCDHS
  • これはで、最短のコードが勝ちます。

テストケース

各テストケースに含まれる1つ以上の有効なソリューションを出力できます。

8S,TD,5C,QS,TS -> 8S,5C,QS,TD,TS
              ... 8S,TD,TS,5C,QS
              ... TS,5C,8S,TD,QS

JD,KH,4S,9D,8S -> 9D,KH,8S,4S,JD
              ... 4S,JD,KH,9D,8S

4H,4D,TH,KH,2C -> 4H,KH,4D,2C,TH
              ... TH,4D,2C,4H,KH
              ... KH,4D,TH,2C,4H

3S,KS,8S,KH,9H -> 9H,8S,KS,3S,KH
              ... 3S,KS,9H,KH,8S
              ... 8S,3S,9H,KH,KS
              ... KS,KH,9H,8S,3S

KH,TS,3C,7H,JD -> 7H,TS,JD,3C,KH

4C,KC,TD,JD,QS -> KC,JD,QS,TD,4C
              ... TD,4C,KC,QS,JD

AC,5H,8D,6D,8S -> 6D,AC,8S,5H,8D

AS,TC,3S,2H,9C -> 9C,2H,AS,3S,TC
              ... AS,9C,2H,TC,3S

4C,JS,AS,8H,JC -> JC,JS,AS,8H,4C
              ... JS,JC,4C,8H,AS

4H,QS,TH,QC,AC -> QC,4H,QS,TH,AC
              ... 4H,QS,QC,AC,TH

Example列を追加すると、順列を視覚化する方が簡単かもしれません。
アーナウルド


入力はどれくらい寛大ですか?長さ2のストリングではなく、カード番号とハウスのタプルは受け入れられますか?
18年

@Οurousチャレンジでは指定されていません。それが合理的である限り(あなたの場合、それは十分に合理的と思われます)、許可されています。
エリックアウトゴルファー

回答:


3

Node.jsの190の 186 180バイト

f=(a,p,g=c=>"A23456789TJQK".search(c[0])+10,[A,B,C,D,E]=a.sort(_=>p>>i++&1,i=0))=>A[k=1]!=E[1]|[B,C,D].sort((a,b)=>k=k*2|a[1]+g(a)>b[1]+g(b))|(k^4)%6+1-(g(E)-g(A)+13)%13?f(a,-~p):a

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

どうやって?

カード番号の特定と比較

g

g = c => "A23456789TJQK".search(c[0]) + 10

101022

ab"NS"

a[1] + g(a) > b[1] + g(b)

入力の順列を生成する

120apABCDE

[A, B, C, D, E] = a.sort(_ => p >> i++ & 1, i = 0)

699

スーツのテスト

最初の明白なテストは、最初と最後のカードが同じスーツであることを確認することです。それらが等しくない場合、順列を拒否します。

A[k = 1] != E[1] // we also initialize k, which is used right after that

距離をテストする

最初のカード番号と最後のカード番号の間の距離を計算します:

(g(E) - g(A) + 13) % 13

BCD

このテストはsort()、Node.js のアルゴリズムの動作に依存しています。

sort()[ABC]

  1. AB
  2. AC
  3. 比較するBC

次のコードを考えてみましょう。

[1, 2, 3].sort((a, b) => k = k * 2 | (a > b), k = 1)

A<B1<2A<C1<3B<C2<3k23k=8

今、私たちがするなら:

[3, 2, 1].sort((a, b) => k = k * 2 | (a > b), k = 1)

k=15

各順列は、一意の距離にマッピングされる一意のビットマスクを生成します。

 A, B, C | A>B | A>C | B>C | k  | distance
---------+-----+-----+-----+----+----------
 1, 2, 3 |  0  |  0  |  0  |  8 |    1
 1, 3, 2 |  0  |  0  |  1  |  9 |    2
 2, 1, 3 |  1  |  0  |  0  | 12 |    3
 2, 3, 1 |  0  |  1  |  1  | 11 |    4
 3, 1, 2 |  1  |  1  |  0  | 14 |    5
 3, 2, 1 |  1  |  1  |  1  | 15 |    6

k

d=((kxor4)mod6)+1

  k | xor 4 | mod 6 | +1
----+-------+-------+----
  8 |   12  |   0   |  1
  9 |   13  |   1   |  2
 12 |    8  |   2   |  3
 11 |   15  |   3   |  4
 14 |   10  |   4   |  5
 15 |   11  |   5   |  6

すべてをまとめると、次のテストがあります。

[B, C, D]
.sort((a, b) =>
  k = k * 2 | a[1] + g(a) > b[1] + g(b)
)
| (k ^ 4) % 6 + 1
- (g(E) - g(A) + 13) % 13


0

クリーン225 220 209バイト

import StdEnv,Data.List
n=['A23456789TJQK':n]

filter(\[[x,s],b,c,d,e]#[p,q,r:_]=map snd(sort(zip2[(elemIndices a n,b)\\[a,b]<-[b,c,d]][1..]))
=[snd(span((<>)x)n)!!(p+if(p>q)0if(q<r)(q+r)q),s]==e)o permutations

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

合成関数として、:: [[Char]] -> [[Char]]いくつかのヘルパーがあります。

拡張:

n = ['A23456789TJQK': n] // infinitely repeating card number list

filter (...) o permutations // filter the permutations of the argument by ...
  \[[x, s], b, c, d, e] // deconstruct each permutation via pattern matching
    #[p, q, r: _] = ... // define p, q, r as ...
      map snd (...) // the second component of every element in ...
      sort (...) // the sorted list of ...
      zip2 ... [1..] // pairs of ... and the numbers 1, 2, 3, ..
      [... \\ [a, b] <- [b, c, d]] // ... for every pair of number a and house b in [b, c, d]
      (elemIndices a n, b) // pair of the value of that card number and the house
    = ... == e // check ... for equality against the last card
      [..., s] // ..., paired with house s
      snd (span ((<>) x) n) !! (...) // the card number ... places from x
      p + ... // this is kinda obvious
      if(p > q) 0 ... // if p is greater than q, zero, else ...
      if(q < r) (q + r) q // if q is less than r, q + r, else q

0

ルビー、175バイト

->a{g=->j{j.tr('ATJQKCHS','1:;<=)_z').sum}
e=b=a.sort_by{|i|g[i]}
4.times{|i|(d=g[b[i+1]]-g[b[i]])<13&&(a=b[i,2];e=d)}
[a[e/7],*(b-a).permutation.to_a[e<7?e-1:12-e],a[e/7-1]]}

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

文字列としてカードの配列を取るラムダ関数

コメント済み

->a{g=->j{j.tr('ATJQKCHS','1:;<=)_z').sum}
#helper function converts card to integer, ATJQK to 1:;<= and CHS to )_z then sum ascii values 

e=b=a.sort_by{|i|g[i]}  
#sort according to g. we declare 2 variables here in order to avoid undefined variable error at pre-interpretation check stage.

4.times{|i|(d=g[b[i+1]]-g[b[i]])<13&&(a=b[i,2];e=d)}
#compare each pair of values. if in same suit, store the pair of cards to a
#and the value difference to e. Loop exits with the last suitable pair stored

[a[e/7],*(b-a).permutation.to_a[e<7?e-1:12-e],a[e/7-1]]}
#return array containing the two cards of the same suit in the correct order
#with the correct permutation of the remaining cards (b-a) in the middle

0

ゼリー、41 バイト

ØD;“TJQK”¤io2)1¦€µUḊỤ3R¤œ¿+""Om4%13E
Œ!ÇƇ

同じ形式ですべての有効な配置のリストを返す文字のリストのリストを受け入れるモナドリンク。

オンラインでお試しください!(フッターは結果をグリッドとしてフォーマットし、完全なプログラムとして実行されたときにリンクのコードによって実行される暗黙のスマッシング印刷を回避します)

または、テストスイートを参照してください。

私はこっそり疑いを持っています。別のアプローチはもっと簡潔になるでしょう。後でこの課題を再確認する必要があります!

...うーん、私は別の周りを突いて別の41バイトを得ました(テスト):

O¹*@<74$?€€29%⁽:0%⁴UµṪ_Ḣ%13Ḍ⁼Ụ3R¤œ¿Ɗ
Œ!ÇƇ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.