Неможливі забиття дартсу


39

Я був здивований, що вже не знайшов цього запитуваного, хоч у касі дартса виникає велике запитання: Дартс зустрічається з Codegolf

Ваша задача полягає в тому, щоб підрахувати, які бали не можливі, якщо «n» дартс не перевищує максимальний бал за «n» дартс. Наприклад, n = 3, максимально можливий бал - 180, тому ви повернетесь [163,166,169,172,173,175,176,178,179]

Для підсумків правил голих кісток:

Можливі оцінки за один дротик:

  • 0 (пропустити)
  • 1-20, 25, 50
  • подвійний або потрійний 1-20

Правила:

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

1
Вибачення за форматування, написання по телефону!
beirtipol

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

1
Щирі вибачення, я витягнув ці результати з відповіді на основне запитання про 3 дротики, але не перевірив! Я оновлю питання!
beirtipol

2
не хвилюйтесь :-) Мені добре виглядає!
Джузеппе

Відповіді:


32

Python 3 , 80 79 59 57 байт

-1 байт завдяки Arnauld
-20 байт завдяки ArBo
-2 байти завдяки мінус сім

lambda x:[-i-~x*60for i in(x<2)*b'a[YUSOLI'+b'MJGDCA@>=']

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


26
Я, помилка, що ?!
beirtipol

2
@beirtipol є шаблон для чисел після 2-го дартса (ну, його на 1-му дартсі теж є, але є й інші числа), це обчислюють числа, виходячи з цього шаблону.
Род

4
Ах, добре зіграний, добре зіграний справді
beirtipol

8
@EriktheOutgolfer Якщо ти стискаєш, ти можеш так само стиснути все;) 59 байт
ArBo

2
@negativeseven побив мене до 60-ти штук, збирався спробувати це :) Хороша знахідка про те, щоб зберегти відокремлені бійстеринг, хоча не думала про це.
ArBo


9

JavaScript (ES6),  55  54 байти

Збережено 1 байт завдяки @Shaggy

На основі шаблону, використовуваного Родом .

n=>[...1121213+[n-1?33:2121242426]].map(x=>n-=x,n*=60)

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


1
s=60*n-> n*=60щоб зберегти байт.
Кудлатий

@Shaggy Дякую :) Я пропустив це через мою початкову (неопубліковану) версію, де пізніше було використано . н
Арнольд

9

Perl 6 , 39 байт (37 символів)

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

{^60*$_∖[X+] (|(^21 X*^4),25,50)xx$_}

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

Ось пояснення до цього:

{                                   } anonymous block for the 
                                       set difference of
 ^60*$_                                   - 0 .. max score (60 * throwcount)
        [X+]                    xx$_      - the cross addition (throwcount times) of 
             (                 )              all possible score values, being 
              |(    X*  )                       flattened cross multiplication of
                ^21   ^4                          0..20 and 0..3 (for double and triple)
                         ,25,50                 and 25 and 50

X* ^4Крос умножитель генерує багато значень, що повторюються (буде 20+ нулі , що беруть участь і це перед робити перехресне додавання), але це не викликає ніяких проблем , так як ми використовуємо різниця множин , яка працює з унікальними значеннями.

Наразі це не вдається $n == 1(що повинно повернути порожній набір), але існує проблема, яка, ймовірно, працюватиме в наступних версіях. Версія JoKing є трохи більш довгою, але вона працює $n == 1в поточному Rakudo.


1
Вау, незручно ... Мої додаткові байти - це виправлення проблеми n = 1 (хоча ви можете використовувати $ _ замість $ ^ n за -1)
Jo King,

1
@JoKing га, я не думаю , що немає нічого поганого з двома людьми , стає практично один і той же відповідь (особливо з вами працює в поточних версіях по порівнянні з моїм , що в даний час теоретична) Крім того , завдяки на $ _, загальна brainfart з мого боку
user0721090601


8

MATL , 25 23 байти

Дякуємо @Giuseppe , який виправив помилку та провів 2 байти!

25tE3:!21:q*vZ^!stP:wX-

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

Пояснення

Підхід грубої сили.

25      % Push 25
tE      % Duplicate, double: gives 50
3:!     % Push column vector [1;2;3]
21:q    % Push row vector [0 1 ... 20]
*       % Multiply with broadcast. Gives a matrix with all products
v       % Concatenate everything into a column vector
Z^      % Implicit input: n. Cartesian power with exponent n
!s      % Sum of each row
tP      % Duplicate, flip: The first entry is now 60*n
:       % Push row vector [1 2 ... 60*n]
w       % Swap
X-      % Set difference. Implicit display

Ваша версія не працює n=2, тому я виправив її і перейшов на байт для завантаження! Спробуйте в Інтернеті!
Джузеппе

О, знайшов ще один байт, переставивши речі :-) 23 байти
Джузеппе

@Giuseppe Ей, спасибі велике!
Луїс Мендо

7

J , 48 45 байт

2&>(35 44,q:626b66jh)&,60&*-1 4 8 14,q:@13090

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

-3 байти завдяки FrownyFrog

Спроба жорстокого рішення, але не зміг перемогти цей переклад ідеї Рода.


tyvm, як завжди, @FrownyFrog
Jonah

ще коротше626b66jh
FrownyFrog

яка база використовується і як J знає, як її використовувати?
Йона


ах, ти. Я забув, що там bбув "роздільник" і читав його як частину номера ....
Йона

6

R , 64 байти

function(n,`!`=utf8ToInt)c(60*n-!"",(!"#%),/")[n<2])

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

Проводить дивовижну відповідь, знайдений Родом .

R , 85 73 68 байт

function(n)setdiff(0:(60*n),combn(rep(c(0:20%o%1:3,25,50),n),n,sum))

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

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

Кредит на рішення Octave OrangeCherries ' для нагадування мені combn.

Ще 5 байт завдяки пропозиції Робіна Райдера щодо використання %o%.


Дуже шкода з цього приводу, я повинен був ще раз перевірити приклад!
beirtipol

1
Гарне використання FUNаргументу combn! Ви можете отримати 68 байт з %o%замість x*3,x*2.
Робін Райдер

@RobinRyder duh. Я навіть спробував розібратися, як зробити множення мовлення на відповідь Октави!
Джузеппе


3

Піт , 22 байти

-S*60Q+M^+yB25*M*U4U21

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

Час затримки в TIO для входів більше 3.

-S*60Q+M^+yB25*M*U4U21Q   Implicit: Q=eval(input())
                          Trailing Q inferred
                 U4       Range [0-3]
                   U21    Range [0-20]
                *         Cartesian product of the two previous results
              *M          Product of each
          yB25            [25, 50]
         +                Concatenate
        ^             Q   Cartesian product of the above with itself Q times
      +M                  Sum each
                            The result is all the possible results from Q darts, with repeats
  *60Q                    60 * Q
 S                        Range from 1 to the above, inclusive
-                         Setwise difference between the above and the possible results list
                          Implicit print

Чи не менше, але якщо ви міняєте U4на S3продуктивність поліпшується трохи , тому що обидва декартові продукти не повинні мати справу з усіма цими додатковими марними 0s. Введіть 3 виходи за ~ 13 секунд замість ~ 30 в такому випадку (хоча вхід 4 все ще вичерпується, і це код гольфу, тому це не має великого значення; p).
Кевін Крейссен

@KevinCruijssen Дуже добре, я не вважав, що включаю 0 з обох сторін декартового продукту. Якщо я знайду ще якісь гольфи чи причини для редагування, я обов'язково включу це, дякую!
Сок

Шкода , що ні 0 на основі включаючи діапазон вбудованого в Pyth .. Я спробував це -S*60QsM^*MP*S3aU21 25, але це простір між 21і 25трохи дратує .. З інклюзивної діапазоні 0 на основі yTможе бути використаний замість 21, ніби як це: -S*60QsM^*MP*S3a}ZyT25( але потім без Zкурсу, із }заміненим на 0 включеним діапазоном). Можливо, ви бачите щось в гольфі в цьому альтернативному підході, щоб додати його 25до списку та видалити 75після першого декартового продукту?
Кевін Кройсейсен



2

05AB1E , 21 20 18 байт

20Ý25ª3Lδ*˜¨ãOZÝsK

-3 байти завдяки @Grimy .

Час виходить досить швидко, тим більший вхід йде завдяки декартовому продукту ã.

Спробуйте в Інтернеті або перевірте ще кілька тестових випадків .

Пояснення:

20Ý                 # Push a list in the range [0, 20]
   25ª              # Append 25 to this list
      3L            # Push a list [1,2,3]
        δ*          # Multiply the top two lists double-vectorized:
                    #  [[0,0,0],[1,2,3],[2,4,6],[3,6,9],...,[20,40,60],[25,50,75]]
          ˜         # Flatten this list: [0,0,0,1,2,...,40,60,25,50,75]
           ¨        # Remove the last value (the 75)
            ã       # Create all possible combinations of the (implicit) input size,
                    # by using the cartesian power
             O      # Sum each inner list of input amount of values together
              Z     # Get the maximum (without popping the list), which is 60*input
               Ý    # Create a list in the range [0, 60*input]
                s   # Swap so the initially created list is at the top of the stack again
                 K  # And remove them all from the [0, 60*input] ranged list
                    # (then output the result implicitly)

На цій ноті максимум - 60 * inputне 180.
Гріммі

@Grimy Так, ігноруй мою дурість .. Я побачив неправильний результат у тестовому наборі, але, звичайно, я просто помилився. Я не повинен кодувати гольф ввечері після довгого дня на роботі ..>.>
Кевін Круїйсен


1

MathGolf , 26 байт

╟*rJrN▐3╒*mÅ~*╡ak.ε*mÉa─Σ-

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

-2 байти завдяки Кевіну Крейсейну

Пояснення

╟*r                          push [0, ..., 60*input-1]
   Jr                        push [0, ..., 20]
     N▐                      append 25 to the end of the list
       3╒                    push [1, 2, 3]
         *                   cartesian product
          mÅ                 explicit map
            ~                evaluate string, dump array, negate integer
             *               pop a, b : push(a*b)
              ╡              discard from right of string/array
               a             wrap in array
                k            push input to TOS
                 .           pop a, b : push(b*a) (repeats inner array input times)
                  ε*          reduce list with multiplication (cartesian power)
                    mÉ       explicit map with 3 operators
                      a      wrap in array (needed to handle n=1)
                       ─     flatten array
                        Σ    sum(list), digit sum(int)
                         -   remove possible scores from [0, 60*input-1]

-2 байти, змінивши 3╒*mÅ~*N_∞α+на N▐3╒*mÅ~*╡. (PS: Чому в заголовку пояснення ви згадуєте " для введення 3 "?)
Кевін Круїйсен

Гарна робота, я поміняю її, коли повернусь до свого ноутбука! У мене був 31-байт, коли я почав писати відповідь, що було складніше, тому я хотів додати ґрунтовне пояснення, але потім знайшов рішення у дописі
maxb

1

Мова Вольфрама (Mathematica) , 69 байт

Complement[Range[60#],Tr/@{Array[1##&,{4,21},0,##&],25,50}~Tuples~#]&

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

Виходячи з відповіді ліртосіаста .

ArrayТретій аргумент вказує зміщення (за замовчуванням 1), а його четвертий аргумент визначає голову, яку слід використовувати замість List. ##&еквівалентний Sequence, тому Array[1##&,{4,21},0,##&]повертає (згладжений), Sequenceщо містить члени зовнішнього продукту 0..3та 0..20.


0

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

I⁺E…wvtsqpmjgkhea_[YS⎇⊖θ⁹¦¹⁷℅ι×⁶⁰⁻θ²

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Використовує алгоритм @ Рода; груба сила зайняла б 60 байт. Працює, обрізаючи рядок до 9 символів, якщо вхідний показник більший за 1, потім беремо порядки символів і додаємо відповідне кратне значення 60.


0

C # (Visual C # Interactive Compiler) , 305 байт

(a,b)=>(int)Math.Pow(a,b);f=n=>{var l=new List<int>(new int[21].SelectMany((_,x)=>new[]{x,x*2,x*3})){25,50};int a=l.Count,b,c,d,e=P(a,n),f;var r=new int[e];for(b=e;b>0;b--)for(c=0;c<n;c++){d=b;while(d>P(a,c+1))d-=P(a,c+1);f=(d/P(a,c))-1;r[b-1]+=l[f>0?f:0];}return Enumerable.Range(0,l.Max()*n).Except(r);}

Ну, мабуть, не існує простого способу обчислення всіх можливих комбінацій у C #, тому ця катастрофа коду - це все, що я міг придумати.

Плюс це займає близько 30-х років для завершення ...

Дуже хотів би побачити краще рішення.

P=(a,b)=>(int)Math.Pow(a,b);
F=n=>
{
    var l=new List<int>(new int[21].SelectMany((_,x)=>new[]{x,x*2,x*3})){25,50};
    int a=l.Count,b,c,d,e=P(a,n),f;
    var r=new int[e];
    for(b=e;b>0;b--)
        for(c=0;c<n;c++)
        {
            d=b;
            while(d>P(a,c+1))
                d-=P(a,c+1);
            f=(d/P(a,c))-1;
            r[b-1]+=l[f>0?f:0];
        }
    return Enumerable.Range(0,l.Max()*n).Except(r);
}

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


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

@Veskah добре, я зазвичай розміщую гольф, якщо це зрозуміло, але, оскільки цей був занадто довгим, я не бачив сенсу робити це, оскільки його все одно можна знайти в посиланні tio, але я думаю, ти маєш рацію все-таки
Innat3


0

Perl 5 -n , 96 93 91 байт

$"=',';@b=map{$_,$_*2,$_*3,25,50}0..20;map$r[eval]=1,glob"+{@b}"x$_;map$r[$_]||say,0..$_*60

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

Він був оптимізований для довжини коду, а не часу виконання, так що це повільно. Він генерує багато зайвих записів для свого хешу пошуку. Запуск @bмасиву через uniqйого швидкість значно збільшує, але коштує ще 5 байт, тому я цього не робив.


0

Мова Вольфрама (Mathematica) , 81 байт

Complement[Range[60#-1],Total/@Tuples[Flatten[{Array[Times,{3,20}],0,25,50}],#]]&

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

Математика має кілька споріднених вбудованих FrobeniusSolveелементів IntegerPartitions, включаючи та обмежену форму , але жодна з них не коротша за грубу силу.


Це неправильно - воно повинно повернутися{163,166,169,172,173,175,176,178,179}
attinat

1
@attinat Виправлено.
lirtosiast


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