Невозможные очки дартс


39

Я был удивлен, что уже не нашел этот вопрос, хотя есть большой вопрос о проверке дартс: Дартс встречает Codegolf

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

Для краткого изложения правила:

Возможные оценки для одного дротика:

  • 0 (мисс)
  • 1-20, 25, 50
  • двойной или тройной 1-20

Правила:

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

1
Извиняюсь за форматирование, запись на телефон!
бейртиполь

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

1
Искренне извиняюсь, я вытащил эти выводы из ответа на основной вопрос в 3 дротика, но не проверил! Я обновлю вопрос!
бейртиполь

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
Я, че, что ?!
Бейртипол

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

4
Ах, хорошо сыграно, хорошо сыграно действительно
beirtipol

8
@EriktheOutgolfer Если вы сжимаете, вы можете сжимать все;) 59 байт
ArBo

2
@negativeseven побил меня до 60 штук, собирался попробовать :) Хорошая находка, если держать отдельные строки отдельно, хотя и не думал об этом.
АрБо


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 Спасибо. :) Я пропустил это из-за моей начальной (неопубликованной) версии, где использовалось позже. N
Арнаулд

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)
Джо Кинг,

1
@JoKing ха, я не думаю, что есть что-то не так с двумя людьми, получающими практически одинаковый ответ (тем более, что ваша работа в текущих версиях по сравнению с моей, которая в настоящее время теоретическая) Кроме того, спасибо за $ _, общий мозг с моей стороны
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 байта
Джузеппе

@ Джузеппе Эй, спасибо тебе большое!
Луис Мендо

7

J , 48 45 байт

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

Попробуйте онлайн!

-3 байта благодаря FrownyFrog

Попытка решения грубой силы, но не смогла превзойти этот перевод идеи Рода.


tyvm как всегда, @FrownyFrog
Иона

еще короче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дротиков, а затем берет соответствующую разность установок.

Благодарим компанию OrangeCherries за октаву, которая напомнила мне о combn.

Еще 5 байтов благодаря предложению Робина Райдера об использовании %o%.


Очень сожалею об этом, я должен был дважды проверить пример!
бейртиполь

1
Хорошее использование FUNаргумента combn! Вы можете получить 68 байт с %o%вместо x*3,x*2.
Робин Райдер

@RobinRyder Дух. Я даже пытался выяснить, как сделать умножение трансляции на ответе Octave!
Джузеппе


3

Pyth , 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 с обеих сторон декартового произведения. Если я найду еще гольфы или причины для редактирования, я обязательно включу это, спасибо!
Сок

Жаль, что в Pyth нет встроенного диапазона, основанного на 0, я пробовал это -S*60QsM^*MP*S3aU21 25, но пробел между 21и 25немного раздражает. yTВместо 0 можно использовать инклюзивный диапазон, основанный на 0 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.
Гримми

@ Грими Да, игнорируй мою глупость .. Я видел неправильный результат в наборе тестов, но, конечно, я просто ошибся сам. Я не должен играть в гольф вечером после долгого рабочего дня ..>.>
Кевин Круйссен


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

Wolfram Language (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 #) , 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

Wolfram Language (Mathematica) , 81 байт

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

Попробуйте онлайн!

Mathematica имеет несколько связанных встроенных функций, включая 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.