MIT'de profesör zihin okuyabilir!


46

Görev, MIT konferansından alınan Prof. Devadas tarafından verilen “ Siz zihin okuyabilirsiniz ” dersini aldı . Püf noktasının ayrıntılı bir açıklaması, bağlantılı videoda veya bu belgede bulunabilir . Daha basit bir şekilde açıklamaya çalışacağım.

Bunun 1930'larda icat edildiği ve "Fitch Cheney'in Beş Kartlı Püf Noktası" olarak bilindiği ortaya çıktı .


İşin püf noktası şöyle:

  • Bir kart destesinden beş rastgele kart seçilir. Seyirci ve asistanınız onları görüyor, ama göremiyorsunuz.
  • Asistanınız (birlikte çalıştığınız kişiler) bu kartlardan dördünü seçecek ve size belirli bir sırada gösterecektir. Gizli kartın rastgele 5 karttan seçilmediğini unutmayın. Asistan, numarayı çalıştıracak kartı seçer.
  • Beşinci kartın ne olduğunu dört karttan toplayabileceğiniz bilgilere dayanarak çıkaracaksınız.

Nasıl?

Aşağıdaki iki noktayı aklınızda bulundurun:

  1. 5 rastgele kart seçildiğinde, en az iki kartın aynı takım elbiseye sahip olduğu garantilidir 1 .

  2. Aşağıdaki resimde, tüm basamakları 2 olan bir daire gösterilmektedir . Bir daire olduğu için saymak mümkündür: J, Q, K, A, 2, 3 (yani modüler sayım). Gizli kartın, birincisi ile aynı seviyeye sahip olmadığı garantilidir, çünkü aynı takımdan olacaktır (aşağıda açıklanmaktadır). İlk kartı ve gizli kartları her zaman seçmek mümkündür, öyle ki gizli kart 1'den 6'ya kadardır (daire şeklinde sayılırken). İlk kart 1 ise , gizli kart 2,3,4,5,6 veya 7 olacaktır . İlk kart J ise , gizli kart Q, K, A, 2,3 veya 4 vb. Olacaktır .

Bir daire şeklinde düzenlenmiş A'dan K'ya kadar olan kartlar


Algoritması:

İlk kart: Bu kart gizli kartla aynı renkte olacaktır. Kart ayrıca gizli kartın rütbesini çözerken kullanacağınız referans noktası olacaktır.

2., 3. ve 4. kartlar , 1 ... 6 aralığındaki bir değerin kodunu çözer . Üç kart S, M, L (en küçük kart, orta kart, en büyük kart) olarak adlandırılır. Değerler şu şekilde kodlanacaktır (sözlük bilgisi sırası):

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

Bu nedenle, ilk kartın sırası 5 ise ve kalan üç kart 4 Q 7'ye ( SLM siparişi verilir ) sahipse, son kartın değeri 5 + 2 = 7'dir . Asın tutarlı olduğu sürece en yüksek veya en düşük kart olmasını mı tercih edebilirsiniz.

Birkaç kart rütbeyi paylaşırsa, takım sırasını belirleyecektir, burada C <D <H <S .


Giriş formatı:

Dört kart H3 (üç kupa), DK (elmas kralı) vb. Giriş yerine bunun yerine 3H ve KD olarak seçmeyi seçebilirsiniz .

Girdi, uygun herhangi bir biçimde olabilir, ancak takım elbise listesini bir değişkende ve bir diğerindeki sıralama listesini birleştiremezsiniz. 'D5', 'H3' ..ve [['D',5],['H',3] ...ikisi de iyi, ama 'DHCH',[5,3,1,5]değil. T dışında harf yerine rakam kullanamazsınız .

Çıktı

Gizli kart, girişle aynı formatta.


Örnek

Hadi bir adım atalım:

Input:
D3 S6 H3 H9

Gizli kartın bir elmas olduğunu biliyoruz, çünkü ilk kart bir elmas. Ayrıca birinci kartın sırası 3 olduğu için sıralamanın 4,5,6,7,8 veya 9 olduğunu biliyoruz .

Kalan kartlar, 3 değerini kodlayan 6,3,9 ==> M, S, L şeklinde sıralanır . Bu yüzden gizli kart 3 + 3 = 6 pırlantadır, bu nedenle çıktının D6 olması gerekir .

Test durumları:

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

Bu , yani her dilde en kısa çözüm kazanıyor. Açıklamalar teşvik edilir!


1 dört takım bulunmaktadır ( Lubs, D iamonds, H earts ve S kürekler).

2 13 basamak, 2,3,4,5,6,7,8,9,10, J, Q, K, A vardır . 10 yerine T kullanmayı seçebilirsiniz .

Yanıtlar:


17

JavaScript (ES6), 130 102 bayt

Girdiyi "Rs", R'nin rütbe ve s'nin uygun olduğu dizge olarak alır . 10'lar için "T" bekler . Aslar düşük.

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

Çevrimiçi deneyin!

Nasıl?

İlk önce her kartı bir diziye [rank, card] dönüştürürüz , burada rank [14 ... 26] ' da sayısal bir değerdir ve kart orijinal dizedir.

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

İlk kartın sırası ve rütbesi sırasıyla R ve S'de saklanır . Diğer üç kart B , C ve D' de saklanır .

Örneğin, ['3c','6h','6c','2s']olur:

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

Daha sonra her çifti [B, C, D] cinsinden karşılaştırırız . Bu öğeler, birbirleriyle karşılaştırıldıklarında, dizgelere dolaylı olarak zorlanır:

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

Hem Çünkü rütbe ve kart tam olarak iki karakterden oluşmalı garanti, sözlük sırasını karşılaştırmak güvenlidir.

Biz hesaplıyoruz:

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

Olası tüm kombinasyonlar aşağıdadır:

 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

Son olarak, çıkış kartını R , S ve yukarıdaki sonucu kullanarak oluşturuyoruz:

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

Varyantınız işe yaramaz değil, sadece temel üs ve gücün seçimi! 1 byte tasarruf etmek için kullanın 92427**3ve değiştirin :k+7k+8a=>(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**97ve k+15aynı zamanda çalışır, ancak eminim ki bu algoritma için daha kısa olan sadece iki set bunlar.
Asgallant

@asgallant Güzel bul!
Arnauld

@ asgallant 1/34547ile k+14de çalışır.
Arnauld

15

Python 2 , 143 140 138 136 127 125 124 123 121 bayt

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

Çevrimiçi deneyin!

Aslar yüksek


Sıralanan kartlar listesindeki (:) konumlarını bularak üç kartı kodlar 0=smallest, 1=middle, 2=largest:

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

Bu, taban 3'teki bir tam sayıya dönüştürülür ve 3 ile çarpılır ve 10'a bölünür:

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

Farklı kodlamalar:

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

Kaydedilen:

  • -2 bayt, ovs sayesinde

Meydan yazarken bunu üçlü bir yaklaşım kullanarak nasıl çözebileceğimi düşündüm, ama bunu yapmanın iyi bir yolunu bulamadım ... Çarpma 3zekice! Güzel cevap :)
Stewie Griffin

@StewieGriffin Teşekkürler :) Şimdi 0sonuna bir ekledim ve eşdeğer gibi görünen 10'a bölün.
TFeld

1
@Arnauld. Açıklamayı, umarım ne yaptığımı biraz daha net hale getirmek için güncelleştirdim.
TFeld

10

Jöle , 33 bayt

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

Çevrimiçi deneyin!

açıklama

İlk satır niladik. 52 kartın bir listesini verir

Ø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']

Ana linkte, ¢kartların listesi olan ilk linkin sonucunu çağırır.

¢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
1As için kullanamazsın .
Outgolfer Erik,

@EriktheOutgolfer,
14'te

Şunları yapabilirsiniz kayıt kullanmak bir byte kaydetmek
Jonathan Allan

5

APL (Dyalog Unicode) , 49 bayt SBCS

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

Çevrimiçi deneyin!

Genel bakış: 'CDHS'∘.,2↓⎕D,'TJQKA'dış ürünü oluşturur, böylece bir 2d matris ile (C2 C3 C4 ...), (D2 D3 D4 ...), .... Daha sonra, bu matrisi elde etmek (C2 D2 H2 ...), ...ve daha sonra düzleştirmek için değiştiriyoruz.

2-⌊1.8⊥Kartların sırasını alan (SML = 1 2 3) @ngn için teşekkürler ve puanları (OP'deki 1 ila 6 gibi).

Kod açıklaması:

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

Retina , 218 208 bayt

[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

Çevrimiçi deneyin!

Açıklama:

[JQK]
1$&
T`AJQK`1123

Asları, Vale'leri, Kraliçeleri ve Kralları 1, 11, 12 ve 13 ile değiştirir. İlk iki satır 1, harften önce bir tane hazırlar ve sonuncusu, ikinci rakamı çevirir.

*' G0`

*Bu aşama çalışma dizeyi değiştirmek gerektiğini gösterir. Bu, sahneyi anlamsız gösterebilir, ancak daha sonra faydalı olacaktır. 'Her alanda çalışan dize böler ve G0(ilk kart bulur böylece) ilkini alıyor.

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

İlk iki satır kartlardaki sayıları 5 ile çarptıktan sonra onları tek parça haline getirir (örneğin, 5 _____ olarak gösterilir), böylece daha sonra takım elbise için daha küçük miktarlar ekleyebiliriz. Son satır boşluklara bölünür ve son üç kartı saklar.

T`CD\HS`d
\d
*

Bu, Kulüpleri, Elmasları, Kalpleri ve Maçaları sırasıyla 0, 1, 2 ve 3'e dönüştürür ve sayıyı birliğe çevirir. Şimdi kartın numara kısmına eklendiğinden, kartın ne kadar yüksek olduğunu belirleyen benzersiz bir değer verecektir.

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

Bu, kartların sırasını ve ilk karta eklenecek değeri bulur. Örneğin, ilk satırda /^(_+)¶\1_+/(orta değeri ilk değerden daha büyük olan siparişlerle eşleşir. Ne yapılması gerektiğine ilişkin bir if-else döngüsü yaratır (bu sıra 1, 2 ve 4 numaralı permütasyonlarla eşleşir). Kbir sabit işaretler.

\d
$+3-$&

Daha önce *bir sahnenin çalışma dizesini etkilemeyeceğini belirttiğimizi hatırlıyor musunuz? Kullandığımız yer burası. Bu aşama bir değiştirme aşamasıdır; eklenecek sayıyı değiştirir $+3-$&. sahneye $+3erişir ve *ilk kartın takımını ve numarasını alır, -ayırıcı olarak işlev görür $&ve eşleşme olur. Yani çalışma dizesi şimdi{suit}{original number}-{number to add}

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

Bu, iki sayıyı bir araya getirir ve bunları birlikte ekler.

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

Üst satır, sayı veya - 13 sayılarını yakalar (böylelikle S16'nın çıktılarını alamayız). Alt çizgi yakalanan sayıyı tekrar 10 tabanına döndürür ve sonuç örtük olarak basılır.



3

Kömür , 64 62 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. T10 için kullanır ve Ayüksek sıralar . Permütasyon indeksi çok kolay bir şekilde çözülmedi; farklı bir permütasyon emri beni en az üç bayt kurtarırdı. Açıklama:

⁺⭆⁸⁺²ιTJQKA

0 ila 7 arasındaki tüm sayılara 2 ekleyin, sonra bunları birleştirin ve TJQKAresim kartları ve as için son eki ekleyin . Bu, bir dize değişmezine 2 bayt kazandırır, bununla birlikte, Ayüksek olanın yine de bir bayt sıkıştırması aracılığıyla bir bayt kaydetmiş olabileceği ortaya çıkar .

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

İkisini bir araya getirerek kartları ve elbiseleri haritalayın. Bu normalde iç içe bir dizi üreteceğinden, sonuçlar bunun yerine tek bir dizgide birleştirilir ve ardından tekrar karakter çiftlerine ayrılır.

≔E⟦ηζε⟧⌕διυ

İkinci, üçüncü ve dördüncü kartların yerlerini bulun.

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

1 indeksli permütasyon indeksini hesaplayın. İlk iki permütasyon önce en küçük karta sahip; bu yoluyla test edilir ⌕υ⌊υ. Diğer iki permütasyon çifti en büyük kartın ilk olup olmadığına göre ayrılır; bu yoluyla test edilir ⌕υ⌈υ. Mantıksal ve aritmetik işlemler daha sonra değerlere bu testleri harita 0, 2ve 4; Bu daha sonra 1, test edilen üçüncü ve dördüncü kartlar arasındaki karşılaştırmaya bağlı olarak arttırılır ‹⊟υ⊟υ. Sonunda, istenen şifrelemeyi vermek için indeks arttırılır.

§δ⁺⌕δθ×⁴...

Aynı takımdaki kartlar arasındaki mesafeyi 4 vererek, ilk kartın pozisyonunu ekleyin ve döngüsel olarak sonucu endeksleyin ve yazdırın.




2

J , 68 bayt

r=.'23456789TJQKA'
{:@{.,~0{r|.~1+(r i.0{{.)+(>,{r;'CDHS')A.@/:@i.}.

Çevrimiçi deneyin!

Not: -3 kapalı TIO baytı, çünkü f=.sayılmaz. Daha fazla golf oynamaya ve yarın bir açıklama eklemeye çalışacağız.



1

T-SQL, 211 bayt

Giriş bir tablo değişkenidir. 10 için T kullanıldığında, as düşük

Kart sıralaması / takım KH, 6D, TS formatı

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

Çevrimiçi deneyin ungolfed

SML (12-17) değerinin nasıl hesaplandığına dikkat edin:

Mantıksal olarak S, M, L (1,2,3) sayısal bir değere dönüştürülür

ilk karta 27 * değer verilir

ikinci kart 9 * sıra değerine sahiptir

üçüncü kartın değeri 3 * sıra değeridir

3 ile çarparak, aşağı yuvarlanmış kare kök güzel bir sıra numarası haline gelir.

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 bayt

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

Port @dylnan 'ın Jelly cevap , ama ne yazık ki 05AB1E permütasyon endeksi yerleşiğini yok ..

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

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)

Bu 05AB1E madenin ucu bakın (bölüm kompres dizeleri sözlükte parçası olmayan nasıl? ) Anlamak için .•3u§•ise "jqka"ve .•ôì•olup "cdhs".

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.