Pontuações impossíveis de dardos


39

Fiquei surpreso ao não encontrar isso já solicitado, embora haja uma grande pergunta sobre os dardos: Dardos encontra Codegolf

Seu desafio é calcular quais pontuações não são possíveis com dardos 'n' abaixo da pontuação máxima para dardos 'n'. Por exemplo, para n = 3, a pontuação máxima possível é 180, então você retornaria [163,166,169,172,173,175,176,178,179]

Para um resumo da regra do bare bones:

As pontuações possíveis para um único dardo são:

  • 0 (falta)
  • 1-20, 25, 50
  • duplo ou triplo de 1-20

Regras:

  • aplicam-se regras de golfe de código padrão
  • você deve usar um único parâmetro 'n' da maneira que seu idioma permitir e retornar uma lista / matriz de todas as pontuações únicas abaixo da pontuação máxima que não pode ser pontuada com n dardos. Você também pode imprimir esses valores no console.
  • ordem dos resultados não é importante
  • o menor código em bytes ganha

1
Desculpas por formatar, escrever em um telefone!
beirtipol 19/06

um pouco relacionado ; Acho que havia outra sobre encontrar valores ausentes de um intervalo, mas não consigo encontrá-lo.
Giuseppe

1
Desculpas sinceras, tirei essas saídas de uma resposta à pergunta básica de 3 dardos, mas não verifiquei! Vou atualizar a pergunta!
beirtipol 19/06

2
não se preocupe :-) Parece bom para mim!
Giuseppe

Respostas:


32

Python 3 , 80 79 59 57 bytes

-1 byte graças a Arnauld
-20 bytes graças a ArBo
-2 bytes graças a sete negativos

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

Experimente online!


26
Eu, errado, o que ?!
beirtipol 19/06

2
@beirtipol existe um padrão nos números após o segundo dardo (bem, também no primeiro dardo, mas há outros números), calcula os números com base nesse padrão.
Rod

4
Ah, bem jogado, bem jogado de fato
beirtipol 19/06

8
@EriktheOutgolfer Se você estiver compactando, também poderá compactar tudo;) 59 bytes
ArBo

2
@negativeseven me derrotou na coisa dos 60, ia tentar isso :) Bom achado em manter os bytestrings separados, porém, não tinha pensado nisso.
ArBo 20/06


9

JavaScript (ES6),  55  54 bytes

Guardado 1 byte graças a @Shaggy

Baseado no padrão usado por Rod .

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

Experimente online!


1
s=60*n-> n*=60para salvar um byte.
Shaggy

@ Obrigado Shaggy. :) Eu perdi essa por causa da minha versão inicial (não publicada) em que foi reutilizado mais tarde. n
Arnauld

9

Perl 6 , 39 bytes (37 caracteres)

Definitivamente, isso está usando uma marreta enorme, mas funciona. (Ele não apenas força bruta, mas brutalmente força)

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

Experimente online!

Aqui está uma explicação:

{                                   } 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

O X* ^4multiplicador cruzado gera muitos valores duplicados (haverá mais de 20 zeros envolvidos e isso é antes de fazer a adição cruzada), mas isso não causa problemas, pois usamos a diferença de conjunto que funciona com os valores exclusivos.

Isso atualmente falha $n == 1(o que deve retornar um conjunto vazio), mas há um problema arquivado e provavelmente funcionará em versões futuras. A versão de JoKing é um pouquinho mais longa, mas funciona para$n == 1 no atual Rakudo.


1
Uau, estranho ... Meus bytes extras são para corrigir o problema n = 1 (embora você possa usar $ _ em vez de $ ^ n para -1)
Jo King

1
@JoKing ha, eu não acho que haja algo de errado com duas pessoas ficando praticamente a mesma resposta (especialmente desde o seu funciona em versões atuais contra o meu que está atualmente teórica) Além disso, graças no $ _, brainfart total da minha parte
user0721090601


8

MATL , 25 23 bytes

Graças a @ Giuseppe , que corrigiu um erro e colocou 2 bytes de golfe !

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

Experimente online!

Explicação

Abordagem de força bruta.

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

Sua versão não funciona n=2, então eu a corrigi e joguei um byte para inicializar! Experimente online!
Giuseppe

Ah, encontrei outro byte reorganizando as coisas :-) 23 bytes
Giuseppe

@ Giuseppe Ei, muito obrigado!
Luis Mendo

7

J , 48 45 bytes

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

Experimente online!

-3 bytes graças ao FrownyFrog

Tentou uma solução de força bruta, mas não conseguiu vencer essa tradução da idéia de Rod.


tyvm como sempre, @FrownyFrog
Jonah

ainda mais curto626b66jh
FrownyFrog

qual base está sendo usada e como J sabe usá-la?
Jonah


ah, ty. eu tinha esquecido que bera o "delimitador" lá e estava lendo como parte do número ....
Jonah

6

R , 64 bytes

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

Experimente online!

Portos a resposta surpreendente encontrada por Rod .

R , 85 73 68 bytes

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

Experimente online!

A força bruta gera todas as pontuações possíveis com ndardos e leva a diferença de set apropriada.

Crédito para solução Octave da OrangeCherries por me lembrar combn.

Mais 5 bytes graças à sugestão de uso de Robin Ryder%o% .


Sinto muito por isso, eu deveria ter verificado o exemplo!
beirtipol 19/06

1
Bom uso do FUNargumento de combn! Você pode obter 68 bytes em %o%vez de x*3,x*2.
Robin Ryder

@RobinRyder duh. Eu até tentei descobrir como fazer a multiplicação de transmissão na resposta da oitava!
Giuseppe

4

Oitava , 91 bytes 73 bytes 71 Bytes

Outro método de força bruta.

@(n)setdiff(0:60*n,sum(combnk(repmat([x=0:20,x*2,x*3,25,50],1,n),n),2))

Até 73 bytes graças a Giuseppe
Até 71 bytes, substituindo nchoosek por combnk

Experimente online!


3

Pitão , 22 bytes

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

Experimente online!

Tempo limite excedido no TIO para entradas maiores que 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

Não é mais curto, mas se você mudar U4para S3o desempenho é um pouco melhor, porque os dois produtos cartesianos não precisam lidar com todos os 0s adicionais inúteis. A entrada 3 produz em ~ 13 segundos em vez de ~ 30 nesse caso (embora a entrada 4 ainda atinja o tempo limite, e este seja um código de golfe, então não importa muito; p).
Kevin Cruijssen 20/06

@KevinCruijssen Muito bom ponto, eu não tinha considerado que estava incluindo um 0 em ambos os lados do produto cartesiano. Se eu encontrar mais campos de golfe ou motivos para editar, incluirei isso, obrigado!
Sok

Pena que não é um builtin gama inclusiva baseada em 0 na Pyth .. Eu tentei isso -S*60QsM^*MP*S3aU21 25, mas que o espaço entre 21e 25é um pouco chato .. Com uma gama inclusiva, baseada-0 yTpode ser usado em vez de 21, mais ou menos assim: -S*60QsM^*MP*S3a}ZyT25( mas, sem o Zcurso, com o }substituído pelo intervalo inclusivo baseado em 0). Talvez você veja algo para jogar golfe nessa abordagem alternativa de adicionar 25a lista e remover o 75após o primeiro produto cartesiano?
Kevin Cruijssen


2

Python 2 , 125 bytes

lambda n:set(range(60*n))-set(map(sum,product(sum([range(0,21*j,j)for j in 1,2,3],[25,50]),repeat=n)))
from itertools import*

Experimente online!


Python 3 , 126 125 122 bytes

lambda n:{*range(60*n)}-{*map(sum,product(sum([[i,i*2,i*3]for i in range(21)],[25,50]),repeat=n))} 
from itertools import*

Experimente online!

-3 bytes, graças a Rod


@rod Obrigado, :)
TFeld

2

05AB1E , 21 20 18 bytes

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

-3 bytes graças a @Grimy .

O tempo limite excede rapidamente, quanto mais alta a entrada, devido ao produto cartesiano incorporado ã .

Experimente online ou verifique mais alguns casos de teste .

Explicação:

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)

Na mesma nota, o máximo é 60 * input, não 180.
Grimmy

@ Grimy Sim, ignore minha estupidez .. Eu vi o resultado incorreto na suíte de testes, mas é claro que eu mesmo cometi um erro. Eu não deveria codegolf à noite depois de um longo dia de trabalho ..>.>
Kevin Cruijssen


1

MathGolf , 26 bytes

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

Experimente online!

-2 bytes graças a Kevin Cruijssen

Explicação

╟*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 bytes, alterando 3╒*mÅ~*N_∞α+para N▐3╒*mÅ~*╡. (PS: Por que você menciona " para a entrada 3 " no cabeçalho de explicação?)
Kevin Cruijssen

Bom trabalho, vou mudar quando voltar ao meu laptop! Eu tinha 31 byter quando comecei a escrever a resposta, o que era mais complicado, então eu queria adicionar uma explicação completa, mas depois encontrei a solução no post
maxb

1

Wolfram Language (Mathematica) , 69 bytes

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

Experimente online!

Baseado na resposta do lirtosiast .

ArrayO terceiro argumento especifica o deslocamento (padrão 1) e seu quarto argumento especifica o cabeçalho a ser usado em vez de List. ##&é equivalente a Sequence, então Array[1##&,{4,21},0,##&]retorna um (achatado) Sequencecontendo membros do produto externo de 0..3e 0..20.


0

Carvão , 36 bytes

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

Experimente online! Link é a versão detalhada do código. Usa o algoritmo de @ Rod; força bruta precisaria de 60 bytes. Funciona truncando a string para 9 caracteres se a entrada for maior que 1, pegando os ordinais dos caracteres e adicionando o múltiplo apropriado de 60.


0

C # (compilador interativo do Visual C #) , 305 bytes

(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);}

Bem, não parece haver uma maneira fácil de calcular todas as combinações possíveis em C #, então esse desastre de código é tudo o que eu poderia criar.

Além disso, leva cerca de 30s para concluir ...

Gostaria de ver uma solução melhor.

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);
}

Experimente online!


Parece que você esqueceu de postar sua resposta real. Geralmente, as pessoas colocam a forma desenrolada abaixo da forma do golfe.
Veskah 20/06

@Veskah bem, eu costumo postar o golfe se for compreensível, mas como esse foi um pouco longo demais, não fazia sentido fazê-lo, pois ele pode ser encontrado no link tio de qualquer maneira, mas acho que você está certo
Innat3 21/06


0

Perl 5 -n , 96 93 91 bytes

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

Experimente online!

Foi otimizado para o tamanho do código, em vez do tempo de execução, por isso é meio lento. Ele gera muitas entradas redundantes para seu hash de pesquisa. A execução do @barray uniqacelera bastante, mas custa mais 5 bytes, por isso não o fiz.


0

Wolfram Language (Mathematica) , 81 bytes

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

Experimente online!

O Mathematica possui alguns recursos internos relacionados, incluindo FrobeniusSolvee a forma restrita de IntegerPartitions, mas nenhum deles é mais curto que a força bruta.


Isso está incorreto - ele deve retornar{163,166,169,172,173,175,176,178,179}
attinat 30/07

1
@attinat Fixed.
lirtosiast 30/07


@attinat Publique você mesmo.
lirtosiast 30/07
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.