Scores de fléchettes impossibles


39

J'ai été surpris de ne pas trouver cela déjà demandé, bien qu'il y ait une bonne question sur les caisses de fléchettes: Darts meets Codegolf

Votre défi consiste à calculer quels scores ne sont pas possibles avec "n" fléchettes en dessous du score maximal pour "n" fléchettes. Par exemple, pour n = 3, le score maximal possible est de 180, vous devez donc renvoyer [163,166,169,172,173,175,176,178,179]

Pour un résumé de la règle de base:

Les scores possibles pour une seule fléchette sont:

  • 0 (mademoiselle)
  • 1-20, 25, 50
  • double ou triple de 1-20

Règles:

  • les règles de golf standard s'appliquent
  • vous devez prendre un paramètre 'n' de la manière que votre langue le permet et renvoyer une liste / un tableau de tous les scores uniques en dessous du score maximum qui ne peut pas être marqué avec n fléchettes. Vous pouvez également imprimer ces valeurs sur la console.
  • l'ordre des résultats est sans importance
  • le code le plus court en octets gagne

1
Toutes mes excuses pour le formatage, l'écriture sur un téléphone!
Beirtipol

un peu lié ; Je pense qu'il y en avait un autre sur la recherche des valeurs manquantes dans une plage, mais je n'arrive pas à le trouver.
Giuseppe

1
Toutes mes excuses, j'ai tiré ces résultats d'une réponse à la question de base de 3 fléchettes mais je n'ai pas vérifié! Je vais mettre à jour la question!
Beirtipol

2
pas de soucis :-) Ça me va!
Giuseppe

Réponses:


32

Python 3 , 80 79 59 57 octets

-1 octet grâce à Arnauld
-20 octets grâce à ArBo
-2 octets grâce au négatif sept

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

Essayez-le en ligne!


26
Moi, euh quoi?
Beirtipol

2
@beirtipol il y a un motif sur les nombres après la 2e flèche (bien, c'est aussi sur la 1ère flèche, mais il y a d'autres chiffres), ceci calcule les nombres en fonction de ce motif.
Rod

4
Ah, bien joué, bien joué
beirtipol

8
@EriktheOutgolfer Si vous compressez, vous pouvez également tout compresser;) 59 octets
ArBo

2
@negativeseven m'a battu à la chose 60, allait essayer ça :) Bonne trouvaille sur garder les bytestings séparés cependant, n'avait pas pensé à cela.
ArBo


9

JavaScript (ES6),  55  54 octets

Enregistré 1 octet grâce à @Shaggy

Basé sur le modèle utilisé par Rod .

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

Essayez-le en ligne!


1
s=60*n-> n*=60pour sauvegarder un octet.
Shaggy

@Shaggy Merci. :) J'ai raté celui-ci à cause de ma version initiale (non publiée) où été réutilisé plus tard. n
Arnauld

9

Perl 6 , 39 octets (37 caractères)

Ceci utilise certainement un massue massive, mais cela fonctionne. (Cela ne force pas brutalement, il force brutalement)

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

Essayez-le en ligne!

En voici une explication:

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

Le X* ^4multiplicateur croisé génère beaucoup de valeurs en double (il y aura plus de 20 zéros impliqués et ceci avant d' effectuer l'addition croisée), mais cela ne pose aucun problème puisque nous utilisons la différence définie qui fonctionne avec les valeurs uniques.

Cela échoue actuellement pour $n == 1(ce qui devrait renvoyer un ensemble vide), mais un problème a été enregistré et fonctionnera probablement dans les versions futures. La version de JoKing est un peu plus longue, mais fonctionne pour $n == 1le Rakudo actuel.


1
Wow, maladroit ... Mes octets supplémentaires proviennent de la résolution du problème n = 1 (bien que vous puissiez utiliser $ _ au lieu de $ ^ n pour -1)
Jo King

1
@JoKing ha, je ne pense pas qu'il y ait quelque chose de mal avec deux personnes se pratiquement la même réponse ( d' autant plus que le vôtre fonctionne dans les versions actuelles par rapport à moi qui est actuellement théorique) En outre, grâce à la $ _, brainfart totale de ma part
user0721090601


8

MATL , 25 23 octets

Merci à @ Giuseppe , qui a corrigé une erreur et joué au golf 2 octets!

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

Essayez-le en ligne!

Explication

Approche de la force brute.

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

Votre version ne fonctionne pas n=2, alors je l'ai corrigée et lancé un octet pour démarrer! Essayez-le en ligne!
Giuseppe

Oh, j'ai trouvé un autre octet en réorganisant les choses :-) 23 octets
Giuseppe

@ Giuseppe Hé, merci beaucoup!
Luis Mendo

7

J , 48 45 octets

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

Essayez-le en ligne!

-3 octets grâce à FrownyFrog

Tentative de solution par la force brute, mais n’a pas pu vaincre cette traduction de l’idée de Rod.


tyvm comme toujours, @FrownyFrog
Jonah

encore plus court626b66jh
FrownyFrog le

quelle base est utilisée et comment J sait-il l'utiliser?
Jonah


ah, ty. J'avais oublié le b"délimiteur" et le lisais comme une partie du numéro ....
Jonah

6

R , 64 octets

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

Essayez-le en ligne!

Porte la réponse étonnante trouvée par Rod .

R , 85 73 68 octets

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

Essayez-le en ligne!

La force brute génère tous les scores possibles avec des nfléchettes, puis prend la différence de set appropriée.

Merci à la solution Octave d’ OrangeCherries de m’avoir rappelé combn.

5 octets supplémentaires grâce à la suggestion de Robin Ryder%o% .


Je suis vraiment désolé pour cela, j'aurais dû vérifier l'exemple!
Beirtipol

1
Belle utilisation de l' FUNargument de combn! Vous pouvez obtenir 68 octets avec %o%au lieu de x*3,x*2.
Robin Ryder le

@RobinRyder duh. J'ai même essayé de trouver un moyen de multiplier la diffusion avec la réponse Octave!
Giuseppe

4

Octave , 91 octets 73 octets 71 octets

Une autre méthode de force brute.

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

Réduisez à 73 octets grâce à Giuseppe
Réduisez à 71 octets en remplaçant nchoosek par combnk

Essayez-le en ligne!


3

Pyth , 22 octets

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

Essayez-le en ligne!

Délai d'attente dans TIO pour les entrées supérieures à 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

Pas plus courte, mais si vous changez U4de S3la performance est améliorée un peu parce que les deux produits cartésiens ne doivent pas traiter tous ces inutiles 0s supplémentaires. Dans ce cas, l’entrée 3 est générée en ~ 13 secondes au lieu de ~ 30 (bien que l’entrée 4 soit toujours périmée et qu’il s’agisse d’un code de golf, peu importe; p).
Kevin Cruijssen le

@KevinCruijssen Très bon point, je n'avais pas pensé que j'incluais un 0 des deux côtés du produit cartésien. Si je trouve d'autres golfs ou des raisons d'éditer, je serai sûr de l'inclure, merci!
Sok

Dommage qu'il n'y ait pas de gamme inclusif basée sur 0 dans Pyth .. J'ai essayé ceci -S*60QsM^*MP*S3aU21 25, mais cet espace entre 21et 25est un peu gênant .. Avec une gamme inclusive basée sur 0 yTpourrait être utilisé à la place de 21, un peu comme ceci: -S*60QsM^*MP*S3a}ZyT25( mais alors sans Zbien sûr, avec le }remplacé par la plage inclusive basée sur 0). Peut-être que vous voyez quelque chose au golf dans cette approche alternative d’ajouter le 25à la liste et de supprimer l’ 75après le premier produit cartésien?
Kevin Cruijssen le


2

Python 2 , 125 octets

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*

Essayez-le en ligne!


Python 3 , 126 125 122 octets

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*

Essayez-le en ligne!

-3 octets, merci à Rod


@rod Merci, :)
TFeld le

2

05AB1E , 21 20 18 octets

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

-3 octets grâce à @Grimy .

Plus le temps d'entrée est long, plus le temps d'entrée est long, plus le résultat est dû au produit cartésien intégré ã.

Essayez-le en ligne ou vérifiez quelques autres cas de test .

Explication:

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)

Sur cette note, maximum est 60 * input, pas 180.
Grimmy

@ Grimy Ouais, ignore ma stupidité .. J'ai vu le résultat incorrect dans la suite de tests, mais bien sûr, je viens de commettre une erreur moi-même. Je ne devrais pas coder le golf le soir après une longue journée de travail ..>.>
Kevin Cruijssen


1

MathGolf , 26 octets

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

Essayez-le en ligne!

-2 octets grâce à Kevin Cruijssen

Explication

╟*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 octets en passant 3╒*mÅ~*N_∞α+à N▐3╒*mÅ~*╡. (PS: Pourquoi mentionnez-vous " pour l’entrée 3 " dans votre en-tête d’explication?)
Kevin Cruijssen le

Bon travail, je le changerai quand je serai de retour sur mon ordinateur portable! J’ai eu 31 points au début de la rédaction de la réponse, ce qui était plus compliqué; j’ai donc voulu ajouter une explication détaillée, mais j’ai trouvé la solution dans le message
maxb le

1

Wolfram Language (Mathematica) , 69 octets

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

Essayez-le en ligne!

Basé sur la réponse de lirtosiast .

ArrayLe troisième argument de 'spécifie le décalage (1 par défaut) et son quatrième argument spécifie la tête à utiliser à la place de List. ##&est équivalent à Sequence, Array[1##&,{4,21},0,##&]retourne donc un membre (aplati) Sequencedu produit extérieur de 0..3et 0..20.


0

Charbon de bois , 36 octets

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

Essayez-le en ligne! Le lien est vers la version verbeuse du code. Utilise l'algorithme de @ Rod; la force brute aurait pris 60 octets. Fonctionne en tronquant la chaîne à 9 caractères si l'entrée est supérieure à 1, puis en prenant les ordinaux des caractères et en ajoutant le multiple approprié de 60.


0

C # (compilateur interactif Visual C #) , 305 octets

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

Eh bien, il ne semble pas y avoir de moyen facile de calculer toutes les combinaisons possibles en C #, alors ce désastre de code est tout ce que je pourrais trouver.

De plus, il faut environ 30 ans pour compléter ...

J'aimerais voir une meilleure solution.

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

Essayez-le en ligne!


On dirait que vous avez oublié de poster votre réponse golfée réelle. Habituellement, les gens placent la forme déroulée de celle-ci en dessous de celle du golf.
Veskah

@Veskah et bien, je poste généralement la version golfée si elle est compréhensible, mais comme celle-ci était un peu trop longue, je ne voyais pas l'intérêt de la faire car elle se trouve de toute façon dans le lien tio, mais je suppose que vous avez néanmoins raison
Innat3


0

Perl 5 -n , 96 93 91 octets

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

Essayez-le en ligne!

Il a été optimisé pour la longueur du code plutôt que pour l'exécution, il est donc plutôt lent. Il génère beaucoup d'entrées redondantes pour son hachage de recherche. Utiliser le @btableau le uniqrend beaucoup plus rapide, mais coûte 5 octets supplémentaires, donc je ne l'ai pas fait.


0

Wolfram Language (Mathematica) , 81 octets

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

Essayez-le en ligne!

Mathematica possède quelques fonctions intégrées, notamment FrobeniusSolvela forme restreinte de IntegerPartitions, mais aucune d’entre elles n’est plus courte que la force brute.


Ceci est incorrect - il devrait revenir{163,166,169,172,173,175,176,178,179}
attinat

1
@attinat Fixe.
lirtosiast


@attinat Postez-le vous-même.
lirtosiast
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.