Вдалий будинок


30

Існує міні-гра в 3D Super World, відома як Lucky House . Він складається з ігрового автомата з 4 блоками.

Lucky House

Кожен блок може бути однією з 5 різних іконок (Квітка, Лист, Дзвоник, Вишня чи Бумеранг), і мета гравця - отримати якомога більше однакових значків ( див. Відео ).

Гравець нагороджений монетами, які, в свою чергу, можуть перетворитись на додаткові життя. Ваше завдання - обчислити кількість виграних додаткових життів.

Залежно від кількості значків, що відповідають, кількість монет, що винагороджуються, така:

  • Немає сірників - 10 монет
  • Одна пара - 100 монет
  • Дві пари - 200 монет
  • Три в своєму роді - 300 монет
  • Чотири в своєму роді - 777 монет

Ви виграєте одне додаткове життя (1UP) кожні 100 монет . Отже, ви гарантовано виграєте рівно 1UP з однією парою , 2UP з двома парами і 3UP з 3-х у своєму роді . Однак кількість виграних життів без збігів або 4-х в своєму роді залежить від початкового запасу монети.

Джерело: Super Mario Wiki

Вхідні дані

Вам надано початковий запас монети 0c<100 та список із чотирьох значень [v1,v2,v3,v4] представляють кінцеві значки на ігровій машині.

Вихід

Кількість виграних додаткових життів: 0 , 1 , 2 , 3 , 7 або 8 .

Правила

  • Ви можете приймати піктограми в будь-якому розумному форматі: наприклад, як список, рядок або як 4 різних параметра.
  • Кожна піктограма може бути представлена ​​або одноцифровим цілим числом, або одним символом . Будь ласка, вкажіть набір піктограм, використаний у вашій відповіді. (Але вам не потрібно пояснювати, як вони відображаються на Квітка, Лист, Дзвоник тощо, тому що це зовсім не має значення.)
  • Вам заборонено перезастосовувати вихідні значення.
  • Це 🎰 🎰.

Тестові справи

У наступних прикладах ми використовуємо список цілих чисел у [1..5] для представлення значків.

coins  icons      output   explanation
-------------------------------------------------------------------------
  0    [1,4,2,5]    0      no matches  ->  0 +  10 =  10 coins -> nothing
 95    [3,1,2,4]    1      no matches  -> 95 +  10 = 105 coins -> 1UP
 25    [2,3,4,3]    1      one pair    -> 25 + 100 = 125 coins -> 1UP
 25    [4,5,5,4]    2      two pairs   -> 25 + 200 = 225 coins -> 2UP
  0    [2,5,2,2]    3      3-of-a-kind ->  0 + 300 = 300 coins -> 3UP
 22    [1,1,1,1]    7      4-of-a-kind -> 22 + 777 = 799 coins -> 7UP
 23    [3,3,3,3]    8      4-of-a-kind -> 23 + 777 = 800 coins -> 8UP
 99    [3,3,3,3]    8      4-of-a-kind -> 99 + 777 = 876 coins -> 8UP

Чи дозволяється нам вводити кількість монет як поплавок від 0 до 0,99? Гадаю, ні, але прошу про всяк випадок.
Гриммі

1
@Grimy Ні, лише ціле число (або рядок, що представляє це ціле число). Вибачте за пізню відповідь.
Арнольд

Відповіді:


9

x86-16 збірка, 56 41 39 байт

Двійковий:

00000000: b103 33ed ac8b fe51 f2ae 7503 45eb f983  ..3....Q..u.E...
00000010: fd03 7504 80c2 4d43 03dd 59e2 e592 7502  ..u...MC..Y...u.
00000020: 040a 3c64 7201 43                        ..<dr.C

Не зібрано:

B1 03           MOV  CL, 3              ; set up loop counter for 3 digits
            DIGIT_LOOP: 
33 ED           XOR  BP, BP             ; clear digit matches counter in BP
AC              LODSB                   ; load next digit char into AL
8B FE           MOV  DI, SI             ; start searching at next char
51              PUSH CX                 ; save outer digit loop counter 
            MATCH_LOOP: 
F2/ AE          REPNZ SCASB             ; search until digit in AL is found 
75 03           JNZ  CHECK_FOUR         ; is end of search?
45              INC  BP                 ; if not, a match was found, increment count
EB F9           JMP  MATCH_LOOP         ; continue looping 
            CHECK_FOUR: 
83 FD 03        CMP  BP, 3              ; is four of a kind? 
75 04           JNE  SCORE_DIGIT        ; if not, add number of matches to 1UP's
80 C2 4D        ADD  DL, 77             ; add 77 to coin count 
43              INC  BX                 ; +1 1UP extra for four-of-a-kind
            SCORE_DIGIT:
03 DD           ADD  BX, BP             ; Add number of matches to total, set ZF if 0
59              POP  CX                 ; restore outer digit loop position
E2 E5           LOOP DIGIT_LOOP         ; keep looping
92              XCHG DX, AX             ; coin count to AX for shorter compare
75 02           JNZ  FINAL_SCORE        ; if 1UPs > 0, no consolation prize
04 0A           ADD  AL, 10             ; award 10 coins
            FINAL_SCORE:
3C 64           CMP  AL, 100            ; is coin score over 100?
72 01           JB   DONE               ; if not, no extra 1UP
43              INC  BX                 ; otherwise, increment 1UP
            DONE:

Введіть кількість початкових монет у DX, SIвказуючи на початок байтів "значка" (що може бути '1'- '5'або будь-яке значення байтів). Виведіть кількість 1UP у BX.

Пояснення:

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

  • 3 матчі = 4 монети 1UP + 77 монет
  • 2 матчі = 2 1УП
  • 1 матч = 1 1УП

Приклади:

[2, 2, 2, 2] (чотири в своєму роді) = 7 1UP + 77 монет

2 [2, 2, 2] = 3 matches = 4 1UP's + 77 coins
   2 [2, 2] = 2 matches = 2 1UP's
      2 [2] = 1 match   = 1 1UP

[2, 5, 2, 2] (три в своєму роді) = 3 1UP

2 [5, 2, 2] = 2 matches = 2 1UP's
   5 [2, 2] = 0 matches
      2 [2] = 1 match   = 1 1UP

[4, 5, 5, 4] (дві пари) = 2 1UP

4 [5, 5, 4] = 1 match   = 1 1UP
   5 [5, 4] = 1 match   = 1 1UP
      5 [4] = 0 matches

[2, 3, 4, 3] (одна пара) = 1 1УП

2 [3, 4, 3] = 0 matches
   3 [4, 3] = 1 match   = 1 1UP
      4 [3] = 0 matches

Якщо кількість зароблених 1UP в кінці 0, 10 монет присуджуються. Якщо сумарна кількість монет перевищує 100, присуджується додатковий 1UP.

Ось програма тестування для ПК DOS, яка включає додаткові підпрограми для обробки цілого значення вводу / виводу:

enter image description here

Завантажте та випробуйте LUCKY.COM для DOS.


5

Желе ,  23 22 20  19 байт

-1 завдяки Еріку Аутгольферу (використання ³замість ȷ2), який також використовується в новій версії двічі
-1 завдяки Гримі (відніміть один перед підсумовуванням, а не віднімаючи чотири згодом)

Може бути побитним?

ċⱮ`’SṚḌH׳«777»⁵+:³

Діадальна посилання, що приймає список і ціле число, яке дає ціле число.

Спробуйте в Інтернеті! Або подивіться тестовий набір .

Як?

ċⱮ`’SṚḌH׳«777»⁵+:³ - Link: list a, integer n   e.g. [x,x,x,x], 22
 Ɱ`                 - map across a with:
ċ                   -   count occurrences in a       [4,4,4,4]
   ’                - decrement                      [3,3,3,3]
    S               - sum (call this s)              12
     Ṛ              - reverse (implicit toDigits)    [2,1]
      Ḍ             - un-decimal                     21
       H            - halve                          10.5
         ³          - 100                           100
        ×           - multiply                     1050
           777      - 777                           777
          «         - minimum                       777
               ⁵    - 10                             10
              »     - maximum                       777  (handles 0 -> 10)
                +   - add (n)                       799
                  ³ - 100                           100
                 :  - integer division                7

Як працює оцінка рук для кожного типу руки:

           Hand:    no-pair     pair        2-pair      trips       4-of-a-kind
(sorted) counts:    [1,1,1,1]   [1,1,2,2]   [2,2,2,2]   [1,3,3,3]   [4,4,4,4]
      decrement:    [0,0,0,0]   [0,0,1,1]   [1,1,1,1]   [0,2,2,2]   [3,3,3,3]
            sum:    0           2           4           6           12
       reversed:    [0]         [2]         [4]         [6]         [2,1]
     un-decimal:    0           2           4           6           21
         halved:    0           1           2           3           10.5
      times 100:    0           100         200         300         1050
    min(x, 777):    0           100         200         300         777
     max(x, 10):    10          100         200         300         777

Альтернатива 20: ĠẈị“¡ıKĖ‘S×4+E{»⁵+:³


Ви можете замінити ȷ2з ³припустивши програми є функція в не приймає аргументи командного рядка , хоча це не те , що я думаю , що ви маєте в виду під «побивають». : P
Ерік Аутгольфер

Дякую Еріку, і так, це не так, як я думав, що це буде побито ^^
Джонатан Аллан

-1 байт ( завдяки Гримі в моєму порті 05AB1E ), спочатку зменшивши підрахунки на 1, перш ніж підбивати підсумки . Замість першого підсумовування та зменшення на 4:ċⱮ`’SṚḌH׳«777»⁵+:³
Кевін Кройсейсен

Дякуємо @KevinCruijssen оновиться пізніше (приємна робота ще раз Grimy!)
Джонатан Аллан

4

Зш , 117 ... 60 байт

-13 , використовуючи інший критерій диференціації, -9 комбінуючи випадки, -28 шляхом зміни caseзаяви на вкладений арифметичний потрійний, -4 завдяки @JonathanAllan, -1 шляхом оптимізації терміналів, -2 тому що я випадково використовувавecho при додаванні Оптимізація Джонатана.

Приймає рахунок монет на stdin і блокує введення як аргументи. Аргументи можуть бути числами, символами або навіть рядками:./foo.zsh flower leaf flower boomerang

read c
for i;for j;((a+=i<j))
<<<$[!a?7+(c>22):a-6?6-a:c>89]

Спробуйте в Інтернеті: 117 104 95 67 63 62 60

Ось магія відповіді на 67 байт:

read coins
for block                  # for each element
  (( a+=${#${@:#$block}} ))
#          ${@:#$block}      remove all elements which don't match
#       ${#            }     count the remaining elements
# (( a+=                 ))  add that number to the total
<<<$[a?(a-12?6-a/2:coins>89):7+(coins>22)]
#    a?                     :7+(coins>22)  4*0 (all elements match all elements)
#      (a-12?     :coins>89)               4*3 (all elements match exactly one)
#      (a-12?6-a/2         )               3*1 + 1*3 ->  6, 6 -  6/2 -> 3
#                                          2*2 + 2*2 ->  8, 6 -  8/2 -> 2
#                                          2*3 + 2*2 -> 10, 6 - 10/2 -> 1


3

Python 2 , 63 байти

lambda x,l:int([3,1,7.77,2,.1][sum(map(l.count,l))%14%5]+x/1e2)

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

У мене була та сама ідея, що і GammaFunction використовувати sum(map(l.count,l))як "відбиток пальця". Але, замість того, щоб використовувати арифметичну формулу для результату, я використовую таблицю пошуку, спершу стиснувши значення від 0 до 4, використовуючи модний ланцюг %14%5. Ділення всіх точкових значень на 100 зберегло кілька байт.



або 61 байт з одним модом.
Арнольд

(Ага ... Не помітив, що насправді це те, чим займається Втілення Невідомості .)
Арнольд

3

Python 3 , 68 байт

def f(c,a):x=sum(map(a.count,a))//2;return[c//90,x-2,7+(c>22)][x//3]

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

Порт Python мого порта C мого порту Bash моєї відповіді Zsh, повторно гольф за допомогою сторінки "Поради щодо гольфу в Python". Останній порт, клянусь ... Мені не вистачає мов, в яких мені зручно займатися гольфом. Мені було цікаво, як ця стратегія порівняно з іншими відповідями Python. Знову, мабуть, є якийсь спосіб це перемогти.

Цей виявився напрочуд гарним, тому я додав таблицю нижче, у якій підсумовується те, що відбувається, щоб інші могли перенести або покращити це.

Type          Example  map(a.count,a)  sum(__)   x=__//2  x//3   array lookup
----------------------------------------------------------------------------
none         [1,2,3,4]    [1,1,1,1]        4       2       0      c//90
pair         [1,1,2,3]    [2,2,1,1]        6       3       1      x-2 -> 1
two pair     [1,3,1,3]    [2,2,2,2]        8       4       1      x-2 -> 2
3-of-a-kind  [1,3,1,1]    [3,1,3,3]       10       5       1      x-2 -> 3
4-of-a-kind  [3,3,3,3]    [4,4,4,4]       16       8       2      7+(c>22)

Python 3.8 (попередній випуск) , 63 байти

Хваліть :=морж!

lambda c,a:[2+c//90,x:=sum(map(a.count,a))//2,9+(c>22)][x//3]-2

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




3

PHP, 153 127 байт

@ 640KB вніс кілька дійсно розумних змін, щоб скоротити їх далі:

function($c,$s){for(;++$x<6;$n+=$m>3?777:($m>2?300:($m>1)*100))for($m=!$y=-1;++$y<5;$m+=$s[$y]==$x);return($c+($n?:10))/100|0;}

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


1
Привіт @XMark, ласкаво просимо до CGCC! Приємного подання! Я пограв у нього трохи більше і отримав у вас -26 байт 127 байт, TIO . Продовжуйте їх!
640 Кб



2

Perl 5 -pF , 46 байт

map$q+=$$_++,@F;$_=0|<>/100+($q>5?7.77:$q||.1)

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

Перший вхід - це результат спіну, використовуючи будь-які 5 унікальних літер ASCII, за винятком q(я пропонуюabcde ). Другий рядок введення - це кількість поточних монет.

Як?

-F     # CLI option splits the input into individual characters in @F
map
   $q+=   # $q holds the result of the calculation here
          # possible values are 0,1,2,3,6
   $$_    # This interprets $_ as a variable reference, thus if $_ is 'a', this variable is $a
   ++     # increment after adding it to $q
,@F;      # iterate over the elements of @F
$_=0|     # force the result to be an integer
   <>/100 # divide the current coin count by 100
   +($q>5?7.77  # if $q is over 5, then there must have been 4 of a kind
   :$q||.1)     # otherwise, use $q, unless it is 0, then use .1
-p        # CLI option implicitly outputs $_

Усі залучені числа поділяються на 100, тому програма підраховує кількість зароблених на даний момент життя (включаючи часткові). Хитрість цього рішення полягає в map. Якщо можливі записи abcde, то кожен з $a, $b, $c, $dі $eпровести підрахунок кількості раз цей персонажем раніше бачили. Це додається до загальної кількості ( $q) кожного разу, коли ви бачите персонаж. Загальний обсяг збігається, якщо є чотири подібних (фактично бонус 177 монет).


1
Чи можете ви включити пояснення, як це працює, будь ласка?
msh210

@ msh210 Я намагався додати його якнайкраще. Будь ласка, не соромтесь задавати питання про це.
Xcali

2

JavaScript (Node.js) , 64 байти

c=>a=>[,7.77,a.sort()[1]-a[2]?2:3,1,.1][new Set(a).size]+c*.01|0

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

Я подумав, що повинен бути хоча б один відповідь JavaScript на виклик Arnauld!

Концепція тут полягає в основному у використанні кількості чітко виражених елементів як ключа пошуку.

  • 1 унікальний => 4 роду
  • 2 унікальних => 2 пари або 3 роду
  • 3 унікальних => 1 пара
  • 4 унікальних => немає відповідностей

Для того, щоб розрізнити 2 пари і 3 в роді, вхідний масив сортується і середні 2 елементи порівнюються.



1

Стакс , 23 байти

¿^∩û:¶á☺ⁿ£z⌐└≤♂EM¥t(,5╓

Запустіть і налагоджуйте його

Ця програма використовує будь-який довільний набір з 5 цілих чисел для піктограм.

Порядок:

  1. Додайте кількість зустрічей кожного елемента.
  2. Розділіть на 2, а потім мод 7.
  3. Результат - число від 1..5. Використовуйте це, щоб шукати приз монети у фіксованому масиві.
  4. Додати до початкової кількості монет.
  5. Розділіть на 100.

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

c               input:[2, 3, 4, 3] 25 main:[2, 3, 4, 3] 
{[#m            input:[2, 3, 4, 3] 25 main:[1, 2, 1, 2] 
|+              input:[2, 3, 4, 3] 25 main:6 
h7%             input:[2, 3, 4, 3] 25 main:3 
":QctI*12A"!    input:[2, 3, 4, 3] 25 main:[300, 777, 10, 100, 200] 3 
@               input:[2, 3, 4, 3] 25 main:100 
a+              main:125 [2, 3, 4, 3] 
AJ/             main:1 [2, 3, 4, 3] 

Виконати цей


1

Сітківка 0,8,2 , 72 байти

O`\D
(\D)\1{3}
777¶
(\D)\1\1
300¶
(\D)\1
100¶
\D{4}
10¶
\d+\D*
$*
1{100}

Спробуйте в Інтернеті! Посилання включає тестові випадки. Вводиться як 4 друковані нецифрові номери ASCII з наступною початковою кількістю монет у цифрах. Пояснення:

O`\D

Сортуйте нецифрові цифри так, щоб однакові символи були згруповані разом.

(\D)\1{3}
777¶

Четверо у своєму роді балів 777.

(\D)\1\1
300¶

Три натурні бали 300.

(\D)\1
100¶

Кожна пара набирає 100, тому дві пари набирають 200.

\D{4}
10¶

Якщо не було матчів, то все одно виграєте!

\d+\D*
$*

Перетворіть значення в одинакові та візьміть суму.

1{100}

Ціле число ділимо суму на 100 і перетворюємо назад у десятковий.


1

Сітківка , 56 байт

(\D)\1{3}
777¶
w`(\D).*\1
100¶
\D{4}
10¶
\d+\D*
*
_{100}

Спробуйте в Інтернеті! Посилання включає тестові випадки. Вводиться як 4 друковані нецифрові номери ASCII з наступною початковою кількістю монет у цифрах. Пояснення:

(\D)\1{3}
777¶

Четверо у своєму роді балів 777.

w`(\D).*\1
100¶

Кожна пара набирає 100 балів. Ураховує wвсі пари, щоб їх можна було переплетети, а також три в своєму роді можна розкласти на три пари, таким чином автоматично зарахувавши 300.

\D{4}
10¶

Якщо не було матчів, то все одно виграєте!

\d+\D*
*

Перетворіть значення в одинакові та візьміть суму.

_{100}

Ціле число ділимо суму на 100 і перетворюємо назад у десятковий.



1

Баш , 76 75 71 70 байт

-4 завдяки @JonathanAllan, -1 , переставивши потрійну.

read c
for i;{ for j;{ ((a+=i<j));};}
echo $[!a?7+(c>22):a-6?6-a:c>89]

Порт Bash моєї відповіді Zsh. Спробуйте в Інтернеті! Спробуйте в Інтернеті! Спробуйте в Інтернеті! Спробуйте в Інтернеті!


1
Збережіть 4, використовуючи менше, ніж замість нерівного тут.
Джонатан Аллан

1
@JonathanAllan Це навіть заощаджує 4 на моїй відповіді Zsh, дякую.
GammaFunction

1

C (gcc) , 92 84 82 81 79 78 байт

-1 на x+=(..!=..) -5 , повернувшись через завдання , -4 завдяки Джонатану Аллану заміною !=на <, що зберігає байти в іншому місці, -1 переставляючи потрійну.

Від @ceilingcat: -2 шляхом оголошення iта xза межами функції, -1 шляхом встановлення x=iта декрементування xзамість цього.

i,x;f(c,a)int*a;{for(i=x=16;i--;)x-=a[i/4]>=a[i%4];c=x?x-6?6-x:c>89:7+(c>22);}

Ще один порт моєї відповіді Zsh. Мені незнайомий гольф на C, мабуть, є ще одна хитрість десь тут, щоб зменшити його ще більше. 92 84 82 81 79 Спробуйте онлайн!


1
Збережіть 4, використовуючи менше, ніж на місці, що не дорівнює:x+=a[i/4]<a[i%4];c=x?(x-6?6-x:c>89):7+(c>22);
Джонатан Аллан

1

05AB1E , 20 19 18 байт

D¢<OR;т*777T)Åm+т÷

Порт @JonathanAllan «s Jelly відповідь , тому переконайтеся , що upvote його !!
-2 байти завдяки @Grimy .

Перелік піктограм приймає як перший вхід (істоту [1,2,3,4,5]), а кількість монет - другий.

Спробуйте в Інтернеті або перевірте всі тестові випадки . (Тестовий набір використовує T‚à+замість TMI+, що є альтернативою рівним байтам.)

Пояснення:

D                   # Duplicate the first (implicit) input-list
 ¢                  # Count the amount of occurrences in itself
  <                 # Decrease each count by 1
   O                # Sum these
    R               # Reverse it
     ;              # Halve it
      т*            # Multiply by 100
        777         # Push 777
           T        # Push 10
            )       # Wrap all three values into a list
             Åm     # Get the median of these three values
               +    # Add the second (implicit) input to it
                т÷  # And integer-divide it by 100
                    # (after which the result is output implicitly)

@Grimy Ах, звичайно. Спасибі! Я запропонував той самий гольф у відповіді Джеллі (я, звичайно, припускаю). :)
Кевін Круїссен

1
Також 777‚ßTMIможе бути 777T)Åm.
Гриммі

Cheaty 17 (вважає, що монета вважається плаваючою, що, я впевнений, не дозволено)
Grimmy

@Grimy Так 0.90є 90монети в цьому випадку? Оскільки вхід монети гарантовано знаходиться в діапазоні [0,99], ви можете запитати ОП, дозволив він це чи ні.
Кевін Кройсейсен

Так, 0,90 означає 90 монет. Я запитав ОП про це. У будь-якому випадку, ось ще одна нехитра 18 .
Grimmy


1

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

≔⊘ΣEη№ηιηI⌊⁺∕θ¹⁰⁰∨⁻η∕²∨›⁸η⁹∕¹χ

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Вводиться як кількість монет і масив будь-яких порівняних значень Python як піктограми. Пояснення:

≔⊘ΣEη№ηιη

Безсоромно вкрасти трюк @ GammaFunction обчислити половину суми рахунків.

⁻η∕²∨›⁸η⁹

Віднімання 2з суми, таким чином , приводячи до значень 0, 1, 2, 3належним чином , але для 4-в своєму роді, розділити 2на 9перший, в результаті чого 7.777....

∨...∕¹χ

Але якщо результат дорівнює 0, то матчів не було, тому замініть його на 0.1. (Використання літералу мені тут не допомагає, тому що мені знадобиться роздільник.)

I⌊⁺∕θ¹⁰⁰...

Розділіть початкові монети на 100 і додайте виграш, а потім підсуньте результат і перейдіть на рядок для неявного виведення.


1

Pyth , 32 байти

AQ-@[+K2/G90J/sm/HdH2+9>G22)/J3K

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

Натхненний рішенням GammaFunction. Вводиться як " [coins, [icons]].

AQ                               # Q is the input. Set G := Q[0], H := Q[1]
    [                      )     # Construct a list from the following entries:
     +K2/G90                     # [0] (K:=2) + G/90 (/ is integer division)
            J                    # [1] J:=
              s                  #        reduce on + (
               m   H             #          map entries of H as d on (
                /Hd              #            number of occurences of d in H ) )
             /      2            #                                               / 2
                     +9>G22      # [2] 9 + (G > 22)
   @                        /J3  # Take element at position J/3
  -                            K # Subtract K (=2)

1

PowerShell , 94 байти

param($n,$l)$r=@{2=100;3=300;4=777}[($l|group|% c*t)]|?{$_;$n+=$_}
+(($n+10*!$r)-replace'..$')

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

Розгорнуто:

param($nowCoins,$values)
$groupCounts=$values|group|% count
$rewardedCoins=@{2=100;3=300;4=777}[$groupCounts]|?{
    $_                          # output matched only
    $nowCoins+=$_               # and accumulate
}
$nowCoins+=10*!$rewardedCoins   # add 10 coins if no rewarded conis
+($nowCoins-replace'..$')       # truncate last two digits

1

PowerShell , 114 107 байт

-7 байт завдяки маззі

param($n,$l)((((0,.1,1)[+($x=($l|group|% c*t|sort))[2]],2,3)[$x[1]-1],7.77)[$x[0]-eq4]+".$n")-replace'\..*'

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

Велика потрійна операція з ароматом PowerShell, побудована після групування та сортування підрахунків вхідного списку. Сортування потрібне, оскільки ми використовуємо той факт, що згрупований список стає коротшим, чим більше повторень. Насправді, ось усі можливі значення:

(1,1,1,1)
(1,1,2)
(2,2)
(1,3)
(4)

Звернення до int все ще дороге.

Розгорнуто:

param($n,$l)
$x=$l|group|% c*t|sort
(((                      #Start building a list...
   (0,.1,1)[+$x[2]],     #where spot 0 holds dummy data or handles no match and 1 pair
    2,3)[$x[1]-1],       #Overwrite the dummy data with 2-pair or 3-o-k
   7.77)[$x[0]-eq4]      #OR ignore all that and use spot 1 because it's a 4-o-k
   +".$n"                #Use that value and add CoinCnt via int-to-string-to-decimal
)-replace'\..*'          #Snip off the decimal part

1
чи дозволено замість цього порожній рядок 0? Спробуйте в Інтернеті!
маззи



1

R, 102 , 91 , 81 байт

f=function(b,v,s=table(v))(477*any(s>3)+b+10*all(s<2))%/%100+sum(s==2)+3*any(s>2)

Завдяки @Giuseppe вдалося скинути 11 байт (і виправити помилку). Керував ще 10 натхненниками ідеї @ 10 Джузеппе / 10.

Безумовно

f=function(b,v){
  s = table(v)          #included in fn inputs
  a = b+10*all(s<2)     #covers all different case
  a = a+477*any(s>3)    #Covers 4 of a kind
  d = sum(s==2)+3*any(s>2) #covers 1 and 2 pair, 3 of a kind.
  a%/%100+d         #sum appropriate values
}

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



1
але якщо ви можете розібратися, чому це, ви можете вилучити as.factor()та f=додати його до 88 байт.
Джузеппе

Ah -- good catch, I seem to have done my math wrong. And top tip on table -- i'm not as familiar with it as I ought to be -- I started with summary(as.factor(v)). I prefer to leave the f=. I don't feel like the code is complete without it, but I realize thats a style choice.
user5957401

Якщо ти так кажеш. Це 87 байт , включаючи f=; не соромтеся вкласти посилання TIO у відповідь :-)
Джузеппе

Мені подобається розкол. Коли я грав із цим, я зрозумів, що дуже sum(s==2)допомагає. Але це вимагало переписати все інше, і / 10 більше не економив місце (я не думаю)
user5957401

0

8051 Асамблея (компілюється до 158 байт)

Це наївне схвалення VEEEEEEEEERRY, це все ще не перевірено і неперевершено, але я впевнений, що це працює. Що слід врахувати:

1) 8051 - це акумуляторна машина, тобто. йому потрібні Mov інструкції, які іншим архітектурам можуть взагалі не знадобитися.

2) 8051 - це 8-ти бітна машина для цього, потрібно зробити кілька хитрощів для чисел> 255, що забезпечує більше коду і є для цього недоліком платформи порівняно з іншими.

CSEG AT 0000H

coinStackOnes equ 0xf3
coinStackTens equ 0xf4
coinStackHundreds equ 0xf5 ; leave one byte as guard so that if that gets corrupted it doesnt really matter

values1 equ 0xf7
values2 equ 0xf8
values3 equ 0xf9
values4 equ 0xfa

numOfFlowers equ 0xfb
numOfLeaf equ 0xfc
numOfBell equ 0xfd
numOfCherry equ 0xfe
numOfBoomerang equ 0xff

flower equ 1
leaf equ 2 
bell equ 3
cherry equ 4
boomerang equ 5

numOfHeartsReceived equ 0xf1

mov r1, #4
mov r0, numOfFlowers
clearNumOfRegs: mov @r0, #0d
        inc r0
        djnz r1, clearNumOfRegs
;if you reach this all numOfXXXX registers are zeroed

mov r0, #values1 
mov r1, #flower

mov a, #6 ; innercounter
mov b, #5 ; outercounter
checkfornextpossibleitem:   mov r2, a; backup countervar
                mov a, @r0 ; store given value in a
                xrl a, @r1 ; xor a with item
                jnz nextItem ; if value!=item -> nextitem
                mov a, #numOfFlowers ;if you end up here a=0 (ie value == item) --> generate addr for numOfReg <-- load a with addr for numOfFlowers
                add a, r1 ; since items are only numbers you can add the item to get the addr for numOfReg a=addr(numOfReg)
                xch a, r1 ; change the item with the addr as r1 is indirect register
                inc @r1 ; increment numOfRegister
                xch a, r1; r1 = item
                ;next item              
                nextItem:   inc r1 ; increment item
                        mov a, r2 ; restore counter
                        dec a; decrement counter
                        cjne a, #0, checkfornextpossibleitem 
                        ;if you reach this you have successfully tested one value against all items and therefor the next value must be tested
                        mov a, #6; reset the innercounter
                        dec b; decrement the outercounter
                        inc r0; increment the register that points to the value-under-test
                        xch a,b; cjne works with a but not with b therefor exchange them
                        cjne a, #0, here ; do the comparison; if you dont jump here you have tested all values 
                        jmp howManyPairsDoIHave; if you didnt jump above you have the now the number of flowers and so on
                        here:   xch a,b ; and change back
                            jmp checkfornextpossibleitem ; check the next value
howManyPairsDoIHave:    mov r0,#0; store numOfPairsHere initialize with zeros
            mov r1, numOfFlowers; 
            mov b, #6; use as counter to know when you went through all numOfRegisters
analyseNumOfRegister:   mov a, @r1 ; load the numOfregister for some math
            xrl a, #2; a will contain zero if numOfXXX = 2
            jnz numOfXXXWasNot2; if you do not jump here you have 2 XXX therefor 
            inc r0; increment the number of pairs
            jmp nextNumOfRegister; continiue with the next one
            numOfXXXWasNot2:    mov a, @r1; restore the number of XXX and try the next magic value
                        xrl a, #3; will contain zero if you have a three of a kind                      
                        jnz no3XXX; if you dont jump here however you have a three of a kind
                        jz add300Coins
                        no3XXX:     mov a, @r1; restore number of XXX
                                xrl a, #4; a will contain zero if 4 of a kind
                                jnz nextNumOfRegister; if you numOfXXX!=4 you can only continiue trying to find something in the next numof register
                                jz add777Coins; if you didnt jump above how ever you will have to add the 777 coins as you detected a 4 of a kind
nextNumOfRegister:  inc r0; move pointer to the next numofregister
            djnz b, analyseNumOfRegister; if you havent already analysed all numofregisters then continue
            ; if you have however you end up here so you will have to take a look at the numOfPairs
            cjne r0, #1, tryIf2Pairs; test if you have 1 pair if not try if you have 2
            jmp add100Coins; if you have 1 pair however add the 100 coins
            tryIf2Pairs:    cjne r0, #2, youMustHave0Pairs; test if you have 2 pairs if not you can be sure to have 0 of them
                    jmp add200Coins; if you have 2 pairs however add them
youMustHave0Pairs:  ; add 10 coins
            inc coinStackTens
            mov a, coinStackTens
            cjne a, #10d, howManyHearts ; if your tens digit isnt outta range continue with the calculation of the number of hearts
            inc coinStackHundreds; if it is outta range do correct that
            mov coinStackTens, #0
            jmp howManyHearts;
add100Coins:    inc coinStackHundreds; here the digit can not possibly have an invalid value...
        jmp howManyHearts
add200Coins:    mov a, coinStackHundreds
        add a, #2
        mov coinStackHundreds, a
        jmp howManyHearts ; also here no invalid values possible
add300Coins:    mov a, coinStackHundreds
        add a, #3
        mov coinStackHundreds, a
        jmp howManyHearts ; same again
add777Coins:    mov r0, #coinStackOnes
        mov r2, #3
add7:       mov a, r0
        mov r1, a
        mov a, @r0
        add a, #7
        mov b, a; b contains the possibly invalid version of the ones digit     
        da a; if you have an invalid value its lower nibble gets corrected this way
        anl a, 0x0f; and the higher one gets corrected this way
        xch a,b; a and b must be swapped in order to make subb work ie b contains now the corrected value and a has the maybe faulty value
        subb a,b; returns zero if all the corrections had no effect therefor the next digit can be increased by 7
        jz nextDigit
        inc r1
        inc @r1
        nextDigit:  inc r0
                djnz r2, add7;

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