Оцініть рулон на кістки 10 000


18

Вступ

Dice 10,000 - це гра в кубики, в яку можна пограти 6 кубиків і щось написати. Гравці перекидають кістки кілька разів по черзі і отримують рахунок в кінці цього. Гравець, який досяг 10 000 очок, першим виграє гру. Підрахунок балів за один перелік - ваша робота в цьому завданні.
Подивіться тут для повних правил.
Зауважте, що правила (особливо бали) змінюються від регіону до регіону, оскільки гра широко відома. Ми використовуємо правила, описані нижче.

Змагання

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

  • Оні нараховує 100 балів
  • П’ятірки нараховують 50 балів
  • Трійні рахують їх кількість разів 100 балів. Три двійки, наприклад, дають 200 балів. Виняток становлять три, які нараховують 1000 балів.
  • Шість з тієї ж кількості рахуються як дві трійки, як описано вище. Так шість трійців дають 600 балів. Те саме стосується крайового випадку з тими: Шість - це 2000 балів.
  • Один штамб не можна використовувати більше одного разу. Якщо штамп є частиною триплета, він не враховує інших випалів. П’ятірки в трійці не нараховують 50 очок, крім 500 балів, які вони дають.
  • Трійки завжди враховуються першими, щоб отримати максимальну кількість балів. Тож три п’ятірки ніколи не зараховуються як 150 балів. Чотири п’ятірки зараховуються як одна трійка, а одна звичайна п’ять, яка потім дає 550 балів.

Примітки

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

Правила

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

[1, 2, 3, 4, 5, 6] -> 150
[1, 1, 1, 2, 3, 5] -> 1050
[1, 1, 1, 1, 1, 1] -> 2000
[2, 2, 2, 2, 2, 2] -> 400
[6, 6, 1, 5, 5, 6] -> 800
[2, 3, 4, 6, 2, 4] -> 0
[1, 5, 1, 5, 1, 5] -> 1500
[5, 5, 5, 5, 2, 3] -> 550
[1, 1, 1, 1, 1, 5] -> 1250
[3, 3, 4, 4, 3, 4] -> 700

11
Також вмирати - це особлива форма кістки .
mbomb007

5
@ThreeFx "Кістки" досі неправильні. Див english.stackexchange.com/a/167107/125966
mbomb007

3
@ mbomb007 Дивіться це .
ThreeFx

4
@ mbomb007 Німецькою мовою це однаково як для однини та множини, чому англійська мова має бути такою складною? : P Але все-таки спасибі, вмирати звучить насправді краще :)
Денкер

9
@DenkerAffe ах, але це "Der dice", "Die dice" чи "Das dice"?
Дейв

Відповіді:


6

05AB1E , 34 31 30 байт

7G¹N¢O3‰N*2LRN1Q+°*X5‚Nå_i¨}OO

Пояснення

7G                                  # for N in 1..6
  ¹N¢O                              # count number of occurrences of N in input
      3‰                            # divmod 3
        N*                          # multiply by N
          2LRN1Q+°*                 # multiply by 10, 100 or 1000
                   X5‚Nå_i¨}        # if N is not 1 or 5, scrap the singles
                            OO      # sum all triple and single scores so far
                                    # implicitly display total sum

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


4

Python 2, 152 148 125 байт

Досить просте рішення. Можна більше пограти в гольф. L.countтрохи довгий, але я не зміг зняти перший дзвінок, оскільки L оновлюється.

def f(L):s=n=0;exec"n+=1\nwhile L.count(n)>2:s+=[n*100,1e3][n<2];exec'L.remove(n);'*3\n"*6;C=L.count;print s+100*C(1)+50*C(5)

Спробуйте в Інтернеті - (усі тестові випадки)

Безумовно:

def f(L,s=0):
    L.sort()
    for n in range(1,7):
        while L.count(n)>2:
            s+=n*100*((n<2)*9+1) # multiply by 10 if n==1
            i=L.index(n)
            L=L[:i]+L[i+3:]
    s+=100*L.count(1)+50*L.count(5)
    print s

Деякий кредит для гольфу @Copper , використовуючи поради з його коду


4

PowerShell v2 + v3 +, 147 144 137 133 байт

$n=$args[0]|sort;while($n){if(($x=$n[0])-eq$n[2]){$s+=100*$x+900*($x-eq1);$a,$b,$n=$n}else{$s+=50*($x-in1,5)+50*($x-eq1)}$a,$n=$n};$s

Перекреслена 144 схожа на 144?

Бере вхід $args[0]і sortзберігає його $n. Потім whileзалишилися елементи, ми оцінюємо if/ else.

Якщо перший елемент (темп, збережений у $xзбереженні деяких байтів) відповідає третьому, у нас є трійка. Додайте до $sгм результат деякого множення 100*$xплюс булеву основу, 900лише якщо $xце -eqнереально 1. Це дає нам реквізити 1000для трьох. Потім перші два елементи очистіть від $a, а $b, а решта $n- видалення третього елемента трійки обробляється пізніше.

В іншому випадку у нас немає трійки, тому додайте до $sгм результат ще одного булевого додавання. Додаємо, 50якщо $xє або, 1або 5додаємо інший, 50якщо це -eqнереально 1. Цей розділ тепер потребує -inоператора v3 + .

У будь-якому випадку у нас ще є елемент, який ще потрібно вийняти, тому зніміть перший елемент $aі залиште інший $n.

Нарешті, як тільки петля виконана, розмістіть $sна трубопроводі. Вихід - неявний Write-Outputв кінці виконання.

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

PS C:\Tools\Scripts\golfing> (1,2,3,4,5,6),(1,1,1,2,3,5),(1,1,1,1,1,1),(2,2,2,2,2,2),(6,6,1,5,5,6),(2,3,4,6,2,4),(1,5,1,5,1,5),(5,5,5,5,2,3),(1,1,1,1,1,5),(3,3,4,4,3,4)|%{($_-join',')+" -> "+(.\evaluate-dice-1000.ps1 $_)}
1,2,3,4,5,6 -> 150
1,1,1,2,3,5 -> 1050
1,1,1,1,1,1 -> 2000
2,2,2,2,2,2 -> 400
6,6,1,5,5,6 -> 800
2,3,4,6,2,4 -> 0
1,5,1,5,1,5 -> 1500
5,5,5,5,2,3 -> 550
1,1,1,1,1,5 -> 1250
3,3,4,4,3,4 -> 700

in re: 'перекреслений 144': сміливий ваш закреслювач, це буде більш очевидним.
Стек

3

JavaScript (ES6), 87 86 байт

a=>a.sort().join``.replace(/(.)\1\1|1|5/g,s=>r+=s>>7?s/1.11:s>5?1e3:s>1?50:100,r=0)&&r

Сортує та впорядкує вхід, щоб поєднання балів можна було ідентифікувати за допомогою повторного виведення. Редагувати: Збережено 1 байт завдяки @Arnauld.


s>>7замість того, щоб s>111зберегти один байт у першій версії
Арнольд

3

Python 2 або 3, 123 122 121 116 109 108 104 102 100 97 байт

Python 2, 97 байт

lambda r:100*sum(c/3*((v<2)*9+v)+c%3*(v<2or(v==5)/2.)for v,c in enumerate(map(r.count,range(7))))

Тестові справи є на ideone

Python 3, 97 байт

lambda r:100*sum(c//3*((v<2)*9+v)+c%3*(v<2or(v==5)/2)for v,c in enumerate(map(r.count,range(7))))

3

Рубі, 80 78 байт

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

-2 байт від @ezrast.

->d{s=0;7.times{|i|c=d.count i;i<2&&i=10;s+=c>2?c/3*i*100:1>i%5?c%3*i*10:0};s}

1
Це дає мені SyntaxError. Я думаю, що вам потрібно пробіл після першої кишки.
Йорданія

@Jordan Незважаючи на те, що він добре працював на repl.it, він все одно ламається ... це нормально, я змінив логіку, щоб більше не вимагати цього
Value Ink

i<2&&i=10економить 2 байти.
ezrast

2

Haskell, 130 123 байт

Це не є викликом для Haskell. Також я займаюся цим в гольф.

Завдяки @nimi.

import Data.List
f=g.sort
g(x:a@(y:z:b))|x>z=j x+g a|0<1=100*h x+g b
g(x:y)=j x+g a
g _=0
h 1=10
h x=x
j 1=100
j 5=50
j _=0

2

Javascript (ES6), 85 84 байт

x=>x.map(v=>s+=v*(((z+=1<<v*3)>>v*3&7)%3?v-5?v-1?0:10:1:v-5?v-1?10:80:8),s=z=0)|10*s

Тестові приклади:

let F =
x=>x.map(v=>s+=v*(((z+=1<<v*3)>>v*3&7)%3?v-5?v-1?0:10:1:v-5?v-1?10:80:8),s=z=0)|10*s

console.log(F([1, 2, 3, 4, 5, 6])); // 150
console.log(F([1, 1, 1, 2, 3, 5])); // 1050
console.log(F([1, 1, 1, 1, 1, 1])); // 2000
console.log(F([2, 2, 2, 2, 2, 2])); // 400
console.log(F([6, 6, 1, 5, 5, 6])); // 800
console.log(F([2, 3, 4, 6, 2, 4])); // 0
console.log(F([1, 5, 1, 5, 1, 5])); // 1500
console.log(F([5, 5, 5, 5, 2, 3])); // 550
console.log(F([1, 1, 1, 1, 1, 5])); // 1250
console.log(F([3, 3, 4, 4, 3, 4])); // 700


1

Python 3, 131 байт

lambda r,C=list.count:sum([x%7*100,1e3][x%7<2]*(C(r,x%7)>2and not exec('r.remove(x%7);'*3))for x in range(14))+50*C(r,5)+100*C(r,1)

Це лямбда-вираз; щоб використовувати його, призначте його заздалегідьf= .

Ми спочатку двічі перевіряємо наявність трійки (використовуючи модуль), видаляючи трійки під час руху; тоді ми просто додаємо підрахунки до 5та 1рахунок та повертаємо його.

Спробуйте це на Ideone! (з усіма тестовими випадками)

Ось моє старе подання Python 2:

Пітон 2, 176 172 171 145 136 134 133 байт

def e(r):s=x=0;exec'x+=1;a=x%7;\nif r.count(a)>2:exec"r.remove(a);"*3;s+=[a*100,1e3][a<2]\n'*14;C=r.count;s+=50*C(5)+100*C(1);print s

Збережено байт на розчині Python 2 завдяки @ mbomb007!


print sкоротший у Python 2.
mbomb007

@ mbomb007 Дякую! Я відредагую це.
Мідь

1

БАШ (sed + bc) 161

sed -re's/([1-6])(.*)\1(.*)\1/\100\2\3/g;s/([1-6])( .*)\1( .*)\1/\100\2\3/g;s/10/1/g; s/1/100/g;s/5( |$)/50 /g;s/[1-6][^0]//g;s/ +/+/g;s/(^\+|\+$)//g;s/^$/0/'|bc

Я хотів зробити це все в sed, але додаток дійсно важкий ...

Пояснення:

  1. Знайдіть трійку, додайте 00до першого числа та видаліть інший,
    наприклад 1 2 1 3 1 4->100 2 3 4
  2. Повторіть крок 1, якщо є дві трійки
  3. Замінити 10з 1потім 1з , 100
    наприклад , 100-> 10-> 1000або 1-> 1->100
  4. Замінити кожен 5годі було 0з50
  5. Видаліть будь-яке число, яке не закінчується 0
  6. Замініть групи пробілів на +
  7. Видаліть провідні та кінцеві + с
  8. Якщо рядок порожній, додайте a 0
  9. Нарешті, труба, щоб bcвсе додати.

1

Perl, 69 байт

Включає +2 для -ap

Запустити з введенням STDIN:

dice10000.pl <<< "5 1 1 1 1 1"

dice10000.pl:

#!/usr/bin/perl -ap
$_=join 0,sort@F,A;print;s%(10|\d)\1\1|10|5%$n+=$1.0||$&%eg;$_=$n.0

Здається, це не працює для введення типу "2 2 2 2 2 2"
Xcali

0

C # (.NET Core) , 228 227 байт

class A{static void Main(string[] a){int[] x=new int[7];int i=0,s=0;for(;i<6;i++)x[int.Parse(a[i])]++;while(i>0){while(x[i]>2){s+=i>1?10*i:100;x[i]-=3;}i--;}while(x[1]-->0)s+=10;while(x[5]-->0)s+=5;System.Console.Write(s*10);}}

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

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


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