Обчисліть бали у грі «sjoelen»


31

Гаразд, тому вчора був другий день Різдва, і ми (грандіозні) батьки зі мною провели гру «sjoelen», як її називають у Нідерландах. Внутрішній програміст підійшов до мене, але якраз коли я отримав відповідь, я втратив його. Я хочу, щоб ти її переробив.

Правила:

У вас є дерев'яна дошка, sjoelbak , з 4 ящиками, у кожній зі своєю кількістю. Коли schijf (об'єкт, схожий на шайбу), переходить до одного з вікон, ви отримуєте точки над цим полем.

A _sjoelbak_ з _schijven_
Коли у всіх 4 скриньках є schijf , ви не отримуєте 10, але отримуєте 20 балів.

Приклад:

Зліва направо: 3 5 4 3
Кожне поле має принаймні 3 schijven ( Множина schijf ), тобто 20 * 3 = 60 балів.

Отримані значення: 0 2 1 0
0 * 2 + 2 * 3 + 1 * 4 + 0 * 1 = 10 балів.

Що складає в цілому 60 + 10 = 70 балів.

Вхід:
кількість schijven зліва направо, тобто "4 5 4 5", [4,5,4,5], "4 \ n5 \ n4 \ n5", що завгодно.

Вихід:
сума балів, тобто 84, як вихід, змінна, повернення або зверху стека, що завгодно.

Як і в кожному коді гольфу, ви не можете використовувати зовнішні сценарії, і код з найменшими байтами виграє.

PS: Як ви, можливо, вже помітили, я голландка. Сміливо редагуйте можливі граматичні помилки.


Чи має бути висновок stdout чи це може бути повернення функції або залишок, що залишився в стеку (для мови на основі стека)?
глобі

@globby Може бути все
Чарлі

Я думаю, що sjoelen є leuk!
Марк Кнол

1
Чи існує обмеження на кількість схійф у кожному полі?
The_Basset_Hound

@BassetHound Ви отримуєте 30 схійвен за раунд, тому 30 з 4 дорівнює 120 балам. Це можливо, але не найкращий результат (7 усього = 140, + 2 у 4 = 148)
Чарлі

Відповіді:


8

CJam, 23 21 20 байт

q~_$0=f+1m>{X):X*+}*

Мені, можливо, вдасться відіграти пару байтів від цього.

Введення подібне

[3 5 4 3]

Результат - оцінка

70

Як це працює

q~                         "Read the input and evaluate into an array";
  _$0=                     "Copy the array, sort it and get the minimum number";
                           "This minimum is the number of common schijven";
      f+                   "Increment each of the schijven by the common schijven number"; 
        1m>                "Take 1 element from the end of the array and put";
                           "it in the beginning";
           {      }*       "Reduce the elements of the array based on this block";
            X):X           "Increment and update the value of X (initially 1)";
                *          "Multiply the number of schijven with X";
                 +         "Add it to current score";

Алгоритм

  • Оскільки я правильно змінив кількість schijven, тепер стає порядок набрання балів [1 2 3 4].
  • Більше того, використовуючи той факт, що 1 + 2 + 3 + 4 = 10я просто додаю мінімальний загальний schijven до кожного з них, щоб отримати ефект від бонусного 10бала.
  • Тепер, коли я скорочую, я отримую два елементи спочатку на стеці, перший, який я ігнорую, - той, що має оцінку 1кожного, потім я помножую другий на 2і додаю його до першого. У наступній ітерації я отримую поточну суму та бал 3schijven. І так далі.

Спробуйте його онлайн тут


Найменше байтів (поки що), прийнято. Дякую за пояснення.
Чарлі

@Charlie Чому ти так швидко приймаєш відповідь? Краще почекати 1-2 тижні, перш ніж приймати відповідь.
ProgramFOX

8

Піт, 240 (30 * 8) коделів, 138, що містять фактичний код

Розмір 10 коделів для кращої видимості

Піт: підрахунок точки sjoelen

Приклади тесту:

D:\codegolf\npiet-1.3a-win32>npiet sjoelen_point_count_cs10.png
? 3
? 5
? 4
? 3
70
D:\codegolf\npiet-1.3a-win32>npiet sjoelen_point_count_cs10.png
? 4
? 5
? 4
? 5
84

Дисплей потоку:

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

NOP ADD DIV GRT DUP INC END
 0   +   /   >   =   c   ~
PSH SUB MOD PTR ROL OUN
 X   -   %   #   @   N
POP MUL NOT SWI INN OUC
 ?   *   !   $   n   C

1X!nnnn=5X2X@=5X2X@=5X2X@=5X1X@**
       0                        *
       0       @+5X1X@1X-4X1X@  !
       0       -             0  !
       0       X1!X1X6+*==X40000#  <--pointer if top of stack=1 (all boxes full,
       0                     0  2      add 20 points, decrement count for all boxes)
       0000-X1@X1X2-X1@X1X3-X1  X  |  pointer if top of stack=0 (not all boxes full,
                                *  V   add 2a+3b+4c+d)
           ~N++++*X4@X2X3*X3@X1X2

Повне пояснення:

      (score=0)  a   b   c   d
      1 PSH NOT INN INN INN INN

      ..... sort and duplicate the numbers .....
**1** DUP 5 PSH 2 PSH ROL DUP 5 PSH 2 PSH ROL DUP 5 PSH 2 PSH ROL DUP 5 PSH 1 PSH ROL

      ( a*b*c*d ) (convert to boolean) 1 if all boxes are full, 0 if at least one box is empty
      MUL MUL MUL NOT NOT

      change direction if 1 (**2**)
      go straight ahead if 0 (**3**)
      PTR

      ( compress 20=4*4+4 )       (0-1=-1/ neg. roll) score+20
**2** 4 PSH DUP DUP MUL ADD 6 PSH 1 PSH NOT 1 PSH SUB ROL ADD

      (put score back to bottom of stack) ... a=a-1, b=b-1, c=c-1, d=d-1 ...
      5 PSH 1 PSH ROL 1 PSH SUB 4 PSH 1 PSH ROL 1 PSH SUB 3 PSH
      1 PSH ROL 1 PSH SUB 2 PSH 1 PSH ROL 1 PSH SUB

      loop to **1**

      (   a*2   )               (   b*3   )               (  c*4  )
**3** 2 PSH MUL 2 PSH 1 PSH ROL 3 PSH MUL 3 PSH 2 PSH ROL 4 PSH MUL

      +2a +3b +d +score
      ADD ADD ADD ADD

      output score
      OUN

Збережіть зображення та спробуйте його в Інтернетному інтерпретаторі Piet:

Інтернет-перекладач PietDev


Відповідь Piet ^. ^
The_Basset_Hound

Звичайно! Я намагаюся додавати відповіді Piet, коли це можна;)
ML


7

Математика, 38 32 23 20 байт

(#+Min@#).{2,3,4,1}&

(За допомогою swish )

Використовуйте, торкнувши вхід до кінця:

(#+Min@#).{2,3,4,1}&@{3,5,4,3}

70

Чергування (36 байт):

20*Min@#+Total[(#-Min@#)*{2,3,4,1}]&

Tr[(# + Min@#) {2, 3, 4, 1}] &
швейцарський

@swish Так розумно!
kukac67

1
Ось і вся функція. Не потрібно додавати 20*Min@#, ви можете позбутися від нього, замінивши мінус на плюс, адже зручно 2+3+4+1==10.
швейцарський

@swish О! Це ще краще. Але я не можу обернути голову, чому це працює?
kukac67

2
@swish Ну, дякую за всю допомогу, але ви повинні були просто опублікувати власну відповідь. : D
kukac67

7

R, 41 40 символів

b=min(a<-scan());sum(5*b+(a-b)*c(2:4,1))

Використання:

> b=min(a<-scan());sum(5*b+(a-b)*c(2:4,1))
1: 4 5 4 5
5: 
Read 4 items
[1] 84
> b=min(a<-scan());sum(5*b+(a-b)*c(2:4,1))
1: 3 5 4 3
5: 
Read 4 items
[1] 70

В останньому прикладі, aє вектор 3 5 4 3, a-bє 0 2 1 0, який ми багато разів з вектор , 2 3 4 1таким чином , даючи , 0 6 4 0який ми додамо з 5*bдаючи 15 21 19 15( 5*bпереробляється для кожного члена доданого вектора, отже , ефективно додаючи 4*5*b), який ми , нарешті , підвести, таким чином даючи 70.


40 байт:b=min(a<-scan());sum(5*b+(a-b)*c(2:4,1))
Алекс А.

5

JavaScript (ES6), 93 47 байт

s=(a,b,c,d)=>10*Math.min(a,b,c,d)+a*2+b*3+c*4+d

Використання: s(1, 2, 3, 4)

Як це працює: функція шукає найменше число в аргументах і помножує це на 10(не з 20) і додає решту балів. 20Для продовження обчислення необов'язково помножувати на підсумки та підсумовувати їх частини на рахунок.

Дякуємо edc65 за те, що поділилися вдосконаленнями!

Без гольфу:

function score(a, b, c, d) {
    return 10 * Math.min(a, b, c, d) + a * 2 + b * 3 + c * 4 + d;
}

1
Використовуйте 10 з min, не потрібно віднімати (функція s (a, b, c, d) {return 10 * Math.min (a, b, c, d) + a * 2 + b * 3 + c * 4 + d;})
edc65

1
А в ES6:S=(a,b,c,d)=>10*Math.min(a,b,c,d)+a*2+b*3+c*4+d
edc65

@ edc65 Дивовижний, дякую!
ProgramFOX

5

Піт , 15

sm*hd+@QtdhSQUQ

Вхід повинен бути заданий комою на STDIN, наприклад

3,5,4,3

Для цього використовується той самий трюк, який використовували багато інших рішень - додавання мінімуму до кожного елемента для врахування бонусу. Мінімум - hSQу наведеному вище коді. Для обліку множення на 2, 3, 4 і 1 я перемалюю d по списку [0,1,2,3] і помножую (dl)-й елемент вводу на d + 1. Таким чином, -1-й елемент множимо на 1, нульовий на 2, перший на 3, а другий на 4. Потім я сумую.


5

J, 23 22 символи

   (+/ .*&2 3 4 1@(+<./))

Приклад:

   test =. 3 5 4 3
   (+/ .*&2 3 4 1@(+<./)) test
70

Спробуйте тут.

(23 довгого явне визначення функції: v=:3 :'+/+/\.3|.y+<./y')


Чому б не просто +/2 3 4 1*(+<./)?
швейцарський

@swish Я вважаю за краще писати повноцінні функції, хоча тут це не було вимогою. Опублікуйте / додайте, якщо хочете.
випадкова

Як щодо 2 3 4 1+/ .×]+<./?
Adám

4

Страус v0.1.0 , 48 41 символів (занадто довгий)

.$0={}/:n;{n-}%)\+1:i;{i*i):i;}%{+}*20n*+

Це просто те саме, що і в старій версії, наведеній нижче, за винятком того, що замість того, щоб використовувати @для обертання всього стека, натомість використовується )\+(правильні значки).

Стара версія:

.$0={}/:n;{n-}%{}/{4@}3*1:i;]{i*i):i;}%{+}*20n*+

Я фактично виявив два помилки в моїй нещодавно реалізованій мові, зазначається в описі нижче. (Мова на даний момент дуже-дуже схожа на Golfscript, тому якщо ви знаєте Гольфскрипт, її читати досить легко.

.$0=   get min value (for the *20 thingy)
{}/    *actually* get min value (BUG: `array number =' returns a single-element array...)
:n;    store as n
{n-}%  subtract this value from all array elements
{}/    dump array onto stack
{4@}3* rotate stack so that instead of 2 3 4 1, multipliers are 1 2 3 4
       (BUG: negative rotations don't work)
1:i;   set i (the multiplier) to 1
]{i*   multiply each array element by i
i):i;  increment i
}%     (do the previous 2 lines over each array element)
{+}*   add up all the array elements
20n*+  add 20*n (the min value we got in line 1)

Очікує введення як масив на STDIN, тому що я дверна ручка і забув реалізувати введення / виведення в v0.1.0.

Вирішення актуальної проблеми в страусі - це приємно, тому що воно точно показує мені, скільки ще мені потрібно додати до мови: D


Удачі вашій мові, це добре виглядає поки що;)
Чарлі

4

Python 2, 43 байти

lambda i:i[1]-i[3]+2*(sum(i)+i[2]+5*min(i))

Натхненний відповіддю @ user2487951


Гарний алгоритм! Для повної програми вам потрібні також дані для введення та друку.
user2487951

1
@ user2487951 Одним із допустимих засобів виведення було "повернення", тому, хоча це не повна програма, це правильна відповідь.
isaacg

3

Jagl Alpha 1,2 - 20 байт

Вхід у форматі stdin (3 4 5 6), вихід залишається на стеці:

T~dqZ*S1 5r]%{U*}/b+

Чекаємо відповіді з оригінального плаката про вихідний формат. Оскільки введення вказано як "що завгодно" , я припускаю, що моє введення може бути масивом у верхній частині стека. Тепер бере вклад на stdin.

Пояснення:

T~                            Get input from stdin and evaluate
  dqZ*                      Duplicate, get minimum, and multiply that by 10
      S1 5r]                Swap (so array is on top), push range 1-5 exclusive, and rotate
            %{U*}/          Zip arrays together, and multiply each pair
                  b+P       Get the sum of that, add the common minimum, and print

Перша відповідь прийнята, відредагована публікація, щоб було зрозуміло
Чарлі

@ Оптимізатор прийнято. Відредаговано.
глобі

3

Хаскелл, 40

g l@[a,b,c,d]=2*a+3*b+4*c+d+10*minimum l

замість видалення мінімальної кількості з решти та додавання додаткових 20s, це додає додаткових 10для мінімальної кількості.


Приємне рішення. Ви все-таки змішали замовлення, воно повинно бути..4*c+d..

3

Матлаб, 27

Зайняв час, щоб зрозуміти, що це одиночна гра. За допомогою анонімної функції

f=@(N)N*[2;3;4;1]+10*min(N)

який викликається векторним рядком

f([3 5 4 3]) == 70
f([7 7 9 7]) == 148

1
Я думаю, що загальноприйнято навколо цих частин скидати на f=2 менші байти. ansЗамість цього функція зберігається у змінній.
BrainSteel

1
[2:4,1]буде голити 2 байти, якщо вхід є векторним стовпцем.
Санчіз

2

Java, 84 байти

int A(int[]a){int m=9;for(int i:a)m=i<m?i:m;return 10*m+a[3]+2*a[0]+3*a[1]+4*a[2];}

Я маю ідею, що це можна пограти далі в гольф, але це наразі.

Виклик за допомогою A(new int[]{3,5,4,3}), вихід повертається як int (Тому System.out.println()що подвоїв би байт)

Безумовно

int getScore(int[] input){
    int min=9;

    for(int x:input) {
        if(x<min){
            min=x;
        }
    }

    return 10*min + 2*input[0] + 3*input[1] + 4*input[2] + 1*input[3];
}

2

GolfScript, 22 байти

~3,{1$>~;}%+$(11*+{+}*

Читає вхід із stdin у форматі [3 5 4 3]. Виводить вихід у stdout. (Якщо дозволено приймати вхід як масив на стеку, ведучий ~може бути опущений на загальну суму 21 байт.)

Тут використовується дещо інша стратегія, ніж рішення CJam / Pyth / etc.: Я спочатку будую масив з 2-х копій першого вхідного значення, 3 другого, 4 третього і одного четвертого. Потім я сортую цей масив, витягаю найменший елемент, помножую його на 11 і підсумовую його з іншими елементами.


2

Пітон 2, 51

Не натхненний, але короткий:

l=input()
print l[0]*2+l[1]*3+l[2]*4+l[3]+10*min(l)

Більш пітонічні:

l=input()
print sum(map(lambda x,y:x*y,l,[2,3,4,1]))+10*min(l)

Якщо вхід буде [3,5,4,3], це поверне 70?
Чарлі

Так, це відбувається в обох випадках. І повертає 84 за [4,5,4,5].
користувач2487951

2

Юлія, 48 35 символів

function p(m);sum([2 3 4 1].*m)+10minimum(m);end

у компактній формі призначення:

p(m)=sum([2 3 4 1].*m)+10minimum(m)

Приклад:

julia> p([3 5 4 3])
70

2

Javascript, 97 байт

a=prompt().split(" "),b=Math.min.apply(1,a);alert(20*b+2*(a[0]-b)+3*(a[1]-b)+4*(a[2]-b)+(a[3]-b))

1

Javascript, ES6, 57

f=(a,b,c,d)=>a*b*c*d?20+f(--a,--b,--c,--d):a*2+b*3+c*4+d

Я хотів побачити, як вийде рекурсія, і хоча це, безумовно, не найкоротша відповідь, я відчув, що це добре вийшло.

a*b*c*d: Він приймає вхідні значення і знаходить добуток усіх них, і оцінює це як булевий вираз для вбудованого оператора if. Це поверне помилковим, якщо одне або більше значень дорівнює 0, а для будь-якого іншого значення вірно.

20+f(--a,--b,--c,--d): Якщо вона повертає true, функція повертає 20 (для набору schijven ) плюс рекурсивний виклик функції для всіх значень мінус одне (Щоб видалити цей набір schijven ). Таким чином він буде рекурсивно циклічно проходити до тих пір, поки щонайменше одне з полів не буде порожнім.

a*2+b*3+c*4+dПісля того, як принаймні одне поле буде порожнім, інша частина вбудованого файлу, якщо оператор запуститься. Він просто повертає бали за решту schijven у полях.

Таким чином, наприкінці всі 20 точкових наборів schijven , а решта балів підсумовуються та повертаються з функції, даючи відповідь.



1

HPPPL (основна мова програмування HP), 58 57 байт

* Від 10 до хв. Не потрібен, тому я його видалив.

EXPORT s(m)
BEGIN
return sum([2,3,4,1].*m)+10min(m);
END;

HPPPL - це мова програмування для калькулятора кольорового графіку HP Prime / CAS.

Приклад виконання:

Знімання екрану програми HPPPL програми підрахунку точок sjoelen

Якщо це не обов'язково має бути програмою, то це реалізується в 40 39-байт однолінійний:

m:=[3,5,4,3];sum([2,3,4,1].*m)+10min(m)

1

Staq, 72 символи

't't't't{aii*XX}$&iia$&ia$&a+XX+XX+|{mxx}{lxX}{k>?m!l}kkk&iiqi&ii*s*t|+:

Приклад виконання:

Executing D:\codegolf\Staq\sjoelen codegolf.txt

3
5
4
3
70

Execution complete.
>

Staq має дві стеки, одну активну, одну пасивну. |Команда перемикає активний стек пасивних і навпаки.

Все між фігурними дужками визначає функцію, перша буква після відкриваючої дужки - це назва функції, решта - до фіксуючої дужки - сама функція. Можливі переосмислення функцій, рекурсія та вкладені функції. {aii}визначив би функцію a, яка збільшувала б верхню частину стека в два рази. Кожен наступний екземпляр aкоду буде замінений на ii.

Коментарі всередині Staq proračuna: &додає нуль у верхній частині стека, [вказує вказівнику перейти до відповідного, ]якщо верхня частина стека дорівнює нулю, xвидаляє найвище значення в стеку. Отже, коментарі можуть бути записані в код у вигляді&[here is a comment]x

Пояснення (також виконується):

'                                      &[input number]x
 t                                     &[copy top of active stack to passive stack]x
  t't't                                &[input next three numbers and copy them to the passive stack]x
       {aii*XX}                        &[define function a (increment twice, multiply the two topmost values, then delete the second value on the stack twice)]x
               $                       &[move top value to the bottom of the stack]x
                &ii                    &[put zero on top of the stack, incremment twice]x
                   a                   &[function a]x
                    $&ia$&a
                           +           &[put sum of the two topmost values on top of the stack]x
                            XX         &[delete second stack value, twice]x
                              +XX+
                                  |    &[switch active/passive stack]x
{mxx}                                  &[define function m: delete two topmost stack values]x
     {lxX}                             &[define function l: delete topmost stack value, then delete second value of remaining stack]x
          {k>?m!l}                     &[define function k: boolean top > second value? put result on top of the stack, if top>0 then execute m, if top = 0 then execute l]x
                  kkk&ii
                        q              &[put square of top value on top of the stack]x
                         i&ii
                             *         &[multiply two topmost values and put result on top of the stack]x
                              s        &[move bottom stack value to the top]x
                               *t|+
                                   :   &[output result]x

https://esolangs.org/wiki/Staq

Програма використовує один стек (спочатку активний) для обчислення 2a + 3b + 4c + d, а другий стек (спочатку пасивний) для обчислення в 10 разів мінімальних вхідних значень. Потім обидва результати підсумовуються та відображаються.


1

PowerShell для Windows , 48 47 байт

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

$args|%{$a+=++$i%4*$_+$_}
$a+10*($args|sort)[0]

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


1
Спробуйте в Інтернеті! . Чи слід вказувати, Powershell for Windowsколи ми використовуємо sortпсевдонім? дивіться meta
mazzy

1
@mazzy Так, напевно, слід. Я просто забуваю про це, оскільки TIO технічно працює на Linux, але використовує псевдоніми Windows
Veskah
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.