Професор з MIT може читати думки!


46

Завдання взято з лекції MIT професора Девадаса під назвою You can read minds . Детальне пояснення хитрощі можна знайти у пов’язаному відео чи в цьому документі . Спробую пояснити це простішими термінами.

Виявляється, це було винайдено в 1930-х роках і відоме як "П'ятикартовий трюк фіт Чейні" .


Хитрість іде так:

  • П’ять випадкових карт вибираються з колоди карт. Глядачі та ваш помічник бачать їх, але ви цього не робите.
  • Ваш помічник (з яким ви проходили практику) вибере чотири з цих карток і покаже їх вам у визначеному порядку. Зауважте, що приховану карту не вибрано випадковим чином із 5-ти карт. Помічник вибирає / картку, яка змусить трюк працювати.
  • Виведете, виходячи з інформації, яку ви можете зібрати з чотирьох карт, що таке п'ята карта.

Як?

Пам'ятайте про наступні два моменти:

  1. Вибираючи 5 випадкових карт, ви гарантуєте, що принаймні дві карти мають однаковий костюм 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 тощо.

картка займає від А до К, розташованих по колу


Алгоритм:

Перша карта: Ця карта матиме такий самий костюм, що і прихована карта. Картка також буде орієнтиром, який ви будете використовувати при з'ясуванні рангу прихованої картки.

2-я, 3-я та 4-а картки декодують значення в діапазоні включення 1 ... 6 . Ми назвемо три карти 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 , а три інші картки мають ранги 4 Q 7 (вони впорядковані SLM ), то остання карта має ранг 5 + 2 = 7 . Ви можете вибрати, чи повинен туз бути найвищою чи найнижчою картою, доки це буде послідовно.

Якщо кілька карток розділяють ранг, то масть визначатиме порядок, де C <D <H <S .


Формат введення:

Чотири картки будуть надані як H3 (три серця), DK (Король алмазів) тощо. Ви можете взяти вхід навпаки, як 3H та KD замість цього.

Вхід може бути у будь-якому зручному форматі, але ви не можете поєднувати список костюмів в одній змінній та список рангів в іншій. 'D5', 'H3' ..і [['D',5],['H',3] ...вони обидва, але 'DHCH',[5,3,1,5]це не так. Ви не можете використовувати цифри замість літер, за винятком Т .

Вихід

Прихована карта, у тому ж форматі, що і вхід.


Приклад

Давайте зробимо покрокову інструкцію:

Input:
D3 S6 H3 H9

Ми знаємо, що прихована карта - алмаз, оскільки перша картка - це алмаз. Ми також знаємо, що ранг становить 4,5,6,7,8 або 9, оскільки ранг першої картки - 3 .

Решта карт упорядковані 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 Є чотири костюми ( C луби, D iamonds, H earts та S pad ).

2 Є 13 рангів, 2,3,4,5,6,7,8,9,10, J, Q, K, A . Ви можете використовувати T замість 10 .

Відповіді:


17

JavaScript (ES6), 130 102 байт

Вважає введення як масив рядків у "Rs"форматі, де R - ранг, а s - масть. Очікує "Т" протягом 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

Спробуйте в Інтернеті!

Як?

Ми спочатку перетворюємо кожну карту в масив [rank, card], де rank є числовим значенням у [14 ... 26], а card є початковим рядком.

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

Ранг і масть першої карти зберігаються в R і S відповідно. Три інші карти зберігаються в B , C і 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'

Оскільки і ранг, і карта гарантовано складаються з точно двох символів, їх можна порівняти в лексикографічному порядку.

Ми обчислюємо:

(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

Нарешті, ми будуємо вихідну карту за допомогою R , S та наведеного вище результату:

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

Ваш варіант не марний, це просто неправильний вибір бази та потужності! Використовуйте 92427**3та змініть, k+7щоб k+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**97а k+15також працює, але я впевнений , що це єдині два безлічі, які коротше для цього алгоритму.
asgallant

@asgallant Приємна знахідка!
Арнольд

@asgallant 1/34547з k+14теж працює.
Арнольд

15

Python 2 , 143 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):

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 байти, завдяки ов

Я думав над тим, як я міг би вирішити це за допомогою потрійного підходу, коли писав виклик, але не знайшов приємного способу це зробити ... Помножувати на 3розумно було! Приємна відповідь :)
Стюі Гріффін

@StewieGriffin Спасибі :) Тепер я додаю 0до кінця і ділю на 10, що виглядає рівнозначно.
TFeld

1
@Arnauld. Я оновив опис, сподіваюся зробити трохи зрозумілішим, що я роблю.
TFeld

10

Желе , 33 байти

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

Спробуйте в Інтернеті!

Пояснення

Перший рядок - ніладичний. Він дає список із 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
dylnan

Ви можете використовувати реєстр, щоб зберегти байт
Джонатан Аллан,

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) та класифікує їх (наприклад, від 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

Сітківка , 218 208 байт

[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

Замінює тузів, валетів, королев та королів на 1, 11, 12 та 13. Перші два рядки є а 1перед буквою, а останній транслітерує другу цифру.

*' G0`

*Вказує на те, що цей етап не слід змінювати робочу рядок. Це може зробити сцену безглуздою, але вона стане в нагоді пізніше. 'Ділить робочу рядок в кожному просторі, і G0займає першу (так він знаходить першу карту).

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

Перші два рядки помножують цифри на картках на 5, потім перетворюють їх на одинакові (наприклад, 5 представлено як _____), щоб ми могли потім додати менші суми до костюмів. Заключний рядок розбивається на пробіли і зберігає три останні картки.

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*

Це перетворює два числа в одинакові та додає їх разом.

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

Верхній рядок фіксує або число, або число - 13 (так що ми не отримуємо результатів, наприклад, S16). Нижній рядок перетворює захоплене число назад в базу 10, а результат друкується неявно.


Виправлено! Я перевернув регулярний вираз, щоб він
надавав

3

Вугілля деревне , 64 62 байт

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Використовує Tдля 10 і сортування Aвисокий. Індекс перестановки було не дуже легко розшифрувати; інший порядок перестановки врятував би мені щонайменше три байти. Пояснення:

⁺⭆⁸⁺²ιTJQKA

Додайте 2 до всіх цілих чисел від 0 до 7, потім зменшіть їх і суфікс TJQKAдля картинок карти та туз. Це економить 2 байти на рядковому букве, хоча виявляється, що Aвисокий би врятував байт шляхом стиснення рядка.

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

Зробіть карту над картами та костюмами, утримуючи їх разом. Оскільки це, як правило, створює вкладений масив, результати замість цього об'єднуються в одну рядок, який потім знову розбивається на пари символів.

≔E⟦ηζε⟧⌕διυ

Знайдіть позиції другої, третьої та четвертої карт.

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

Обчисліть 1-індексуючий індекс перестановки. У перших двох перестановок спочатку є найменша карта; це перевірено через ⌕υ⌊υ. Інші дві пари перестановок диференційовані щодо того, чи є першою найбільша карта; це перевірено через ⌕υ⌈υ. Логічні та арифметичні операції потім прирівнюють ці тести до значень 0, 2і 4; Потім це збільшується 1залежно від порівняння третьої та четвертої карт, протестованих через ‹⊟υ⊟υ. Нарешті індекс збільшується для отримання потрібного кодування.

§δ⁺⌕δθ×⁴...

Помножте на 4 повторення відстані між картками одного і того ж костюма, додайте позицію першої картки та циклічно індексуйте та друкуйте результат.




2

J , 68 байт

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

Спробуйте в Інтернеті!

Примітка: від 3 байтів TIO, оскільки f=.не враховується. Спробуємо пограти в гольф далі і додамо пояснення завтра.



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 послідовностей

друга картка оцінюється значенням 9 послідовностей

третя карта оцінюється 3 * значенням послідовності

Помноживши на 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*+è

Порт @dylnan 's Jelly відповідь , але, на жаль, 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§•є "jqka"і .•ôì•є "cdhs".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.