MIT'deki profesörün AP'ye ihtiyacı var!


14

5 kart sihir numarası, asistanı bu sırada 4 gösterilen kart ve gizli bir kart veren bir sihirbaz içerir ve sihirbaz gizli olanı tahmin etmelidir.

UYARI: Aşağıdaki çözüm! Şimdi git ya da onunla şımar.


Çözüm

Buradaki hile, beş kartın belirli bir sırada verildiğidir !

c1,...,c5 verilen sırayla 5 karttır.

xn ve kart numarasıcn deNO=[A,2,3,4,5,6,7,8,9,T,J,Q,K] (sayı sırası).

a+ba b b a N O , kart numarası ve , bir tam sayıdır kart numarası eşittir sağındaki adımda de başına, ambalaj gerekirse.abbaNO

snc n S O = [ , , , ] bir giysidir olarak (uygun sırası).cnSO=[,,,]

aba b a b , burada bir kart numarası ve bir takımdır, kart numarası ve takım olan kartı belirtir .abab

a<b , ve kartlardır, bu durum geçerlidir 'nın takım sol etmektir içinde takım elbise s' , veya bunların takım elbise eşittir ve 'nın kart numarası sol etmektir s' kart numarası .ababSOabNO

a>b nerede, ve kartlardır, bu durum geçerlidir yanlıştır.aba<b

PI(a,b,c) , ve kart olduğu , bu sıralamanın aşağıdaki tabloda belirtilen permütasyon dizinidir:abc
ComparisonPI(a,b,c)a<b<c1a<b>c>a2a>b<c>a3a<b>c<a4a>b<c<a5a>b>c6

5 kart sihir numarasının çözümü problemdir:

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

Meydan okuma

Çok uzak çok iyi. Ancak, yukarıda belirtilen hesaplamayı yapmak zaten burada istenmektedir . Bunun yerine, 5 kartın belirli bir sırayla verilmemesi durumunda, meydan okumanız düzgün bir şekilde sipariş vermektir. Bu, çıktıdaki ilk dört kartın beşinci kartı temsil edeceği anlamına gelir. Başka bir deyişle, yardımcı olun. Gereksinimler:

  • s5=s1 .
  • x5=x1+PI(c2,c3,c4) (yani, bu mümkün olmalıdır).

Misal

Seti düşünelim 7H,2D,6D,5C,6C. Her şeyden önce, 25 çiftini alıyoruz:

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

Ardından, aynı kartı içeren 5 çifti iki kez kaldırıyoruz, tek bir destede mevcut değiller:

      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      

Daha sonra, takım elbise aynı olması gerektiğinden, bir çiftteki farklı takımlar hayır-hayırdır:

                             
            2B, 6D            
      6D, 2D                  
                        5C, 6C
                  6C, 5C      

Son olarak, kalan çiftlerin yarısını kaldırarak en fazla 6 ekleyerek ilk karttan ikinciye geçmenin mümkün olup olmadığını kontrol ederiz:

                             
            2B, 6D            

                        5C, 6C
                             

Şimdi geçerli çiftlerimiz var: 2D,6Dve 5C,6C. Her bir çiftin ilk kartı kart 1, son kartı ise kart 5'tir.

5C,6CKolaylık için buraya gideceğiz . Tüm set 7H,2D,6D,5C,6C, bu yüzden, seçtiğimiz çiftteki 2 kartı çıkarmak var 7H,2D,6D. Bu kartlar, 6 - 5 = 1"min, mid, max" gibi sipariş vermeliyiz. 7H > 2D < 6D < 7Hya da basitçe 2D < 6D < 7H, şimdi var 2D,6D,7H.

Son adım, tüm bunları bir araya getirmektir, bu yüzden sonucumuz olacaktır 5C,2D,6D,7H,6C.

Açıklamalar

  • Bunun 10yerine kullanabilirsiniz T.
  • Sen birini kullanabilir ♠♥♦♣, ♤♡♢♧ya da ♠♡♢♣yerine CDHSsırasıyla.
  • Bu , en kısa kod kazanıyor.

Test senaryoları

Her test senaryosu için bir veya daha fazla geçerli çözüm çıktısı alabilirsiniz.

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

Örnek sütun ekleyerek permütasyonları görselleştirmek daha kolay olabilir .
Arnauld


Girdi ne kadar yumuşaktır? Uzunluk-2 dizeleri yerine kart numarası ve ev tuplesleri kabul edilebilir mi?
Οurous

@ Οurous Bu meydan okumada belirtilmemiştir; makul olduğu sürece (sizin durumunuzda, bu yeterince makul görünüyor), izin verilir.
Outgolfer Erik

Yanıtlar:


3

Node.js , 190 186 , 180 bayt

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

Çevrimiçi deneyin!

Nasıl?

Kart numaralarını belirleme ve karşılaştırma

g

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

101022

ab"NS"

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

Girdinin permütasyonlarının oluşturulması

120apABCDE

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

699

Giysileri test etme

İlk bariz test, ilk ve son kartların aynı renkte olduğundan emin olmaktır. Eşit değillerse permütasyonu reddediyoruz.

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

Mesafeyi test etme

İlk kart numarası ile son kart numarası arasındaki mesafeyi şu şekilde hesaplıyoruz:

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

BCD

Bu test sort()Node.js algoritmasının çalışma şekline dayanır .

sort()[A,B,C]

  1. karşılaştırınAB
  2. karşılaştırAC
  3. karşılaştırBC

Aşağıdaki kodu ele alalım:

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

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

Şimdi, eğer yaparsak:

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

k=15

Her permütasyon, benzersiz bir mesafeye eşlenen benzersiz bir bit maskesi oluşturur:

 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

Her şeyi bir araya getirirsek, aşağıdaki testimiz var:

[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

1

Piton 3 , 260 248 232 bayt

N="A23456789TJQK".find
D=lambda x,y="KC":(N(y[0])+~N(x[0]))%13+15*abs(ord(x[1])-ord(y[1]))
def f(l):a,e,b,c,d=[[x,y]+sorted({*l}-{x,y},key=D)for x in l for y in l if D(x,y)<6][0];print(a,*map(eval,"bbccddcdbdbcdcdbcb"[D(a,e)::6]),e)

Çevrimiçi deneyin!

Outgolfer Eric sayesinde -12 bayt
Bir liste kavrama kaldırarak -14 bayt


0

Temiz , 225 220 209 bayt

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

Çevrimiçi deneyin!

Bileşik bir işlev olarak, :: [[Char]] -> [[Char]]bazı yardımcılarla.

Expanded:

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

Yakut , 175 bayt

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

Çevrimiçi deneyin!

Bir dizi kartı dize olarak alan lambda işlevi

Yorumlananlar

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

Jöle , 41 bayt

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

Aynı formattaki tüm geçerli düzenlemelerin bir listesini döndüren karakterlerin listesini kabul eden monadic Link.

Çevrimiçi deneyin! (altbilgi, tam bir program olarak çalıştırıldığında, Bağlantı kodunun gerçekleştirdiği örtük baskıyı önlemek için sonucu bir ızgara olarak biçimlendirir)

Veya bir test takımına bakın .

Sinsi bir şüphem var, başka bir yaklaşım çok daha aldatıcı olacak. Bu mücadeleyi daha sonra tekrar gözden geçirmem gerekecek!

... hmm, başka bir şaka yaptım ve 41 byter daha aldım ( test ):

O¹*@<74$?€€29%⁽:0%⁴UµṪ_Ḣ%13Ḍ⁼Ụ3R¤œ¿Ɗ
Œ!ÇƇ
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.