Puntajes de dardos imposibles

39

Me sorprendió no encontrar esto ya preguntado, aunque hay una gran pregunta sobre los pagos de dardos: Darts y Codegolf

Su desafío es calcular qué puntajes no son posibles con 'n' dardos por debajo del puntaje máximo para 'n' dardos. Por ejemplo, para n = 3, el puntaje máximo posible es 180, por lo que devolvería [163,166,169,172,173,175,176,178,179]

Para un resumen de la regla básica:

Los puntajes posibles para un solo dardo son:

  • 0 (señorita)
  • 1-20, 25, 50
  • doble o triple de 1-20

Reglas:

  • se aplican reglas de golf de código estándar
  • debe tomar un solo parámetro 'n' de la manera que su idioma lo permita y devolver una lista / conjunto de todos los puntajes únicos por debajo del puntaje máximo que no se puede calificar con n dardos. También puede imprimir estos valores en la consola.
  • el orden de los resultados no es importante
  • el código más corto en bytes gana
beirtipol
fuente
1
¡Disculpas por formatear, escribir en un teléfono!
beirtipol
algo relacionado ; Creo que hubo otro sobre encontrar valores perdidos de un rango, pero parece que no puedo encontrarlo.
Giuseppe
1
Disculpas sinceras, saqué esos resultados de una respuesta a la pregunta básica de 3 dardos, ¡pero no verifiqué! ¡Actualizaré la pregunta!
beirtipol
2
no te preocupes :-) ¡Me parece bien!
Giuseppe

Respuestas:

32

Python 3 , 80 79 59 57 bytes

-1 byte gracias a Arnauld
-20 bytes gracias a ArBo
-2 bytes gracias a siete negativos

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

Pruébalo en línea!

Barra
fuente
26
Yo, errr, ¿qué?
beirtipol
2
@beirtipol hay un patrón en los números después del segundo dardo (bueno, también está en el primer dardo, pero hay otros números), esto calcula los números en función de este patrón.
Rod
44
Ah, bien jugado, bien jugado
beirtipol
8
@EriktheOutgolfer Si está comprimiendo, también podría comprimirlo todo;) 59 bytes
ArBo
2
@negativeseven me ganó a lo 60, iba a intentar eso :) Sin embargo, es un buen hallazgo para mantener las cadenas de bytes separadas, no había pensado en eso.
ArBo
14

Perl 6 , 42 bytes

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

Pruébalo en línea!

Solución de fuerza bruta que resuelve todos los posibles valores de dardos.

Jo King
fuente
9

JavaScript (ES6),  55  54 bytes

Guardado 1 byte gracias a @Shaggy

Basado en el patrón utilizado por Rod .

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

Pruébalo en línea!

Arnauld
fuente
1
s=60*n-> n*=60para guardar un byte.
Shaggy
@ Shaggy Gracias. :) Me perdí esa debido a mi versión inicial (inédita) donde fue reutilizada más tarde. norte
Arnauld
9

Perl 6 , 39 bytes (37 caracteres)

Definitivamente está usando un mazo masivo pero funciona. (No solo lo fuerza por fuerza bruta, lo fuerza brutalmente por fuerza bruta)

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

Pruébalo en línea!

Aquí hay una explicación:

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

El X* ^4multiplicador cruzado genera muchos valores duplicados (habrá más de 20 ceros involucrados y eso es antes de hacer la suma cruzada), pero eso no causa ningún problema ya que usamos la diferencia establecida que funciona con los valores únicos.

Esto falla actualmente $n == 1(lo que debería devolver un conjunto vacío), pero hay un problema archivado y probablemente funcionará en futuras versiones. La versión de JoKing es un poco más larga, pero funciona $n == 1en Rakudo actual.

usuario0721090601
fuente
1
Wow, incómodo ... Mis bytes adicionales son de arreglar el problema n = 1 (aunque puedes usar $ _ en lugar de $ ^ n para -1)
Jo King
1
@JoKing, ja, no creo que haya nada malo en que dos personas obtengan prácticamente la misma respuesta (especialmente porque la tuya funciona en las versiones actuales frente a la mía que actualmente es teórica) Además, gracias por $ _, brainfart total de mi parte
user0721090601
8

MATL , 25 23 bytes

¡Gracias a @Giuseppe , que corrigió un error y jugó 2 bytes!

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

Pruébalo en línea!

Explicación

Enfoque de fuerza 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
Luis Mendo
fuente
¡Su versión no funciona n=2, así que la arreglé y jugué un byte para arrancar! Pruébalo en línea!
Giuseppe
Oh, encontré otro byte reorganizando cosas :-) 23 bytes
Giuseppe
@Giuseppe Hola, muchas gracias!
Luis Mendo
7

J , 48 45 bytes

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

Pruébalo en línea!

-3 bytes gracias a FrownyFrog

Intenté una solución de fuerza bruta, pero no pude superar esta traducción de la idea de Rod.

Jonah
fuente
tyvm as always, @FrownyFrog
Jonah
even shorter 626b66jh
FrownyFrog
what base is being used and how does J know to use it?
Jonah
ah, ty. i'd forgotten the b was the "delimiter" there and was reading it as part of the number....
Jonás
6

R , 64 bytes

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

Pruébalo en línea!

Ports la increíble respuesta 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))

Pruébalo en línea!

La fuerza bruta genera todos los puntajes posibles con los ndardos, luego toma la diferencia de conjunto adecuada.

Crédito para la solución de octava OrangeCherries' por recordarme combn.

5 bytes más gracias a la sugerencia de Robin Ryder de usar %o%.

Giuseppe
fuente
Lo siento mucho por eso, ¡debería haber verificado el ejemplo!
beirtipol
1
Buen uso del FUNargumento de combn! Puede obtener 68 bytes con en %o%lugar de x*3,x*2.
Robin Ryder
@RobinRyder duh. ¡Incluso intenté descubrir cómo multiplicar la transmisión en la respuesta Octave!
Giuseppe
4

Octava , 91 bytes 73 bytes 71 Bytes

Otro método de fuerza bruta.

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

Bajar a 73 Bytes gracias a Giuseppe
Bajar a 71 Bytes reemplazando nchoosek por combnk

Pruébalo en línea!

Cerezas Naranjas
fuente
3

Pyth , 22 bytes

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

Pruébalo en línea!

Se agota el tiempo de espera en TIO para entradas mayores de 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
Sok
fuente
No es más corto, pero si cambia U4a S3la actuación se mejora un poco porque ambos productos cartesianos no tienen que hacer frente a todos esos inútiles 0s adicionales. La entrada 3 sale en ~ 13 segundos en lugar de ~ 30 en ese caso (aunque la entrada 4 todavía agota el tiempo, y este es el código de golf, por lo que no importa mucho; p).
Kevin Cruijssen
@KevinCruijssen Muy buen punto, no había considerado que estaba incluyendo un 0 en ambos lados del producto cartesiano. Si encuentro más campos de golf o razones para editar, me aseguraré de incluir eso, ¡gracias!
Sok
Lástima que no haya un rango inclusivo basado en 0 incorporado en Pyth ... Intenté esto -S*60QsM^*MP*S3aU21 25, pero ese espacio entre 21y 25es un poco molesto. Con un rango inclusivo basado en 0 yTpodría usarse en lugar de 21algo así: -S*60QsM^*MP*S3a}ZyT25( pero luego Z, por supuesto, con el }reemplazado por el rango inclusivo basado en 0). ¿Quizás vea algo en el golf en este enfoque alternativo de agregar el 25a la lista y eliminar el 75producto cartesiano después del primer?
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*

Pruébalo en línea!


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*

Pruébalo en línea!

-3 bytes, gracias a Rod

TFeld
fuente
@rod Gracias, :)
TFeld
2

05AB1E , 21 20 18 bytes

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

-3 bytes gracias a @Grimy .

El tiempo de espera se agota rápidamente cuanto mayor sea la entrada debido al producto cartesiano incorporado ã.

Pruébalo en línea o verifique algunos casos de prueba más .

Explicación:

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)
Kevin Cruijssen
fuente
En esa nota, el máximo es 60 * input, no 180.
Grimmy
@ Grimy Sí, ignora mi estupidez ... Vi el resultado incorrecto en el conjunto de pruebas, pero por supuesto, yo mismo cometí un error. No debería codegolf en la noche después de un largo día de trabajo ..>.>
Kevin Cruijssen
1

MathGolf , 26 bytes

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

Pruébalo en línea!

-2 bytes gracias a Kevin Cruijssen

Explicación

╟*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]
maxb
fuente
-2 bytes cambiando 3╒*mÅ~*N_∞α+a N▐3╒*mÅ~*╡. (PD: ¿Por qué mencionas " para la entrada 3 " en el encabezado de tu explicación?)
Kevin Cruijssen
Buen trabajo, ¡lo cambiaré cuando vuelva a mi computadora portátil! Tuve un byte de 31 bytes cuando comencé a escribir la respuesta, lo cual era más complicado, así que quería agregar una explicación completa, pero luego encontré la solución en la publicación
maxb
1

Wolfram Language (Mathematica) , 69 bytes

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

Pruébalo en línea!

Basado en la respuesta de lirtosiast .

ArrayEl tercer argumento especifica el desplazamiento (por defecto 1), y su cuarto argumento especifica la cabeza a usar en lugar de List.##&es equivalente a Sequence, por lo que Array[1##&,{4,21},0,##&]devuelve un (aplanado) que Sequencecontiene miembros del producto externo de 0..3y 0..20.

attinat
fuente
0

Carbón , 36 bytes

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

Pruébalo en línea!El enlace es a la versión detallada del código. Utiliza el algoritmo de @ Rod; la fuerza bruta habría tomado 60 bytes. Funciona truncando la cadena a 9 caracteres si la entrada es mayor que 1, luego toma los ordinales de los caracteres y agrega el múltiplo apropiado de 60.

Neil
fuente
0

C # (compilador interactivo de 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);}

Bueno, no parece haber una manera fácil de calcular todas las combinaciones posibles en C #, por lo que este desastre de código es todo lo que se me ocurrió.

Además, tarda unos 30 segundos en completarse ...

Me encantaría ver una mejor solución.

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

Pruébalo en línea!

Innat3
fuente
Parece que olvidó publicar su respuesta real de golf. Por lo general, las personas colocan la forma desenrollada debajo del campo de golf.
Veskah
@Veskah, bueno, generalmente publico el campo de golf si es comprensible, pero dado que este fue un poco largo, no vi ningún motivo para hacerlo, ya que de todos modos se puede encontrar en el enlace de tio, pero supongo que tienes razón de todos modos
Innat3
0

Kotlin , 118 bytes

{n:Int->val i=if(n<2)listOf(23,24,31,25,37,41,44,47)
else
List(0){0}
i+List(9){n*60-listOf(17,14,11,8,7,5,4,2,1)[it]}}

Pruébalo en línea!

JohnWells
fuente
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

Pruébalo en línea!

Fue optimizado para la longitud del código en lugar del tiempo de ejecución, por lo que es un poco lento. Genera muchas entradas redundantes para su hash de búsqueda. Ejecutar la @bmatriz a través de uniqél lo acelera enormemente, pero cuesta 5 bytes más, por lo que no lo hice.

Xcali
fuente
0

Wolfram Language (Mathematica) , 81 bytes

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

Pruébalo en línea!

Mathematica tiene algunos componentes internos relacionados, incluida FrobeniusSolvela forma restringida IntegerPartitions, pero ninguno de ellos es más corto que la fuerza bruta.

lirtosiast
fuente
Esto es incorrecto - debería volver{163,166,169,172,173,175,176,178,179}
attinat
1
@attinat Fijo.
lirtosiast
69 bytes
attinat
@attinat Publíquelo usted mismo.
lirtosiast