Unmögliche Abnähergebnisse

39

Ich war überrascht, dass dies nicht bereits gestellt wurde, obwohl es eine gute Frage zu Dart-Kassen gibt: Darts meets Codegolf

Ihre Herausforderung besteht darin, zu berechnen, welche Punkte mit "n" Pfeilen unterhalb der Maximalpunktzahl für "n" Pfeile nicht möglich sind. ZB für n = 3 ist die maximal mögliche Punktzahl 180, so dass Sie zurückkehren würden [163,166,169,172,173,175,176,178,179]

Für eine Zusammenfassung der Bare-Bones-Regeln:

Mögliche Punkte für einen einzelnen Pfeil sind:

  • 0 (Fräulein)
  • 1-20, 25, 50
  • doppelt oder dreifach von 1-20

Regeln:

  • Es gelten die Standard-Code-Golfregeln
  • Sie müssen einen einzelnen Parameter 'n' so verwenden, wie es Ihre Sprache zulässt, und eine Liste / ein Array aller eindeutigen Punkte unter dem Maximalwert zurückgeben, der nicht mit n Pfeilen erzielt werden kann. Sie können diese Werte auch auf der Konsole ausdrucken.
  • Reihenfolge der Ergebnisse ist unwichtig
  • kürzester Code in Bytes gewinnt
beirtipol
quelle
1
Entschuldigung für das Formatieren, Schreiben auf einem Telefon!
Beirtipol
etwas verwandt ; Ich glaube, es gab noch eine andere Möglichkeit, fehlende Werte aus einem Bereich zu finden, aber ich kann sie anscheinend nicht finden.
Giuseppe
1
Aufrichtige Entschuldigung, ich habe diese Ergebnisse aus einer Antwort auf die Grundfrage von 3 Darts gezogen, aber nicht überprüft! Ich werde die Frage aktualisieren!
Beirtipol
2
Keine Sorge :-) Sieht für mich gut aus!
Giuseppe

Antworten:

32

Python 3 , 80 79 59 57 Bytes

-1 Byte dank Arnauld
-20 Byte dank ArBo
-2 Byte dank negativer Sieben

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

Probieren Sie es online!

Stange
quelle
26
Ich, ähm, was ?!
Beirtipol
2
@beirtipol es gibt ein Muster auf den Zahlen nach dem 2. Pfeil (nun, es ist auch auf dem 1. Pfeil, aber es gibt andere Zahlen), dies berechnet die Zahlen basierend auf diesem Muster.
Rod
4
Ah, gut gespielt, gut gespielt in der Tat
Beirtipol
8
@EriktheOutgolfer Wenn Sie komprimieren, können Sie auch alles komprimieren;) 59 Bytes
ArBo
2
@negativeseven schlug mich auf die 60 Sache, wollte das versuchen :) Gute Entdeckung, die Bytestrings getrennt zu halten, hatte aber nicht daran gedacht.
ArBo
14

Perl 6 , 42 Bytes

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

Probieren Sie es online!

Brute-Force-Lösung, die alle möglichen Dart-Werte ermittelt.

Scherzen
quelle
9

JavaScript (ES6),  55  54 Byte

1 Byte dank @Shaggy gespeichert

Basierend auf dem von Rod verwendeten Muster .

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

Probieren Sie es online!

Arnauld
quelle
1
s=60*n-> n*=60um ein Byte zu speichern.
Shaggy
n
9

Perl 6 , 39 Bytes (37 Zeichen)

Dies ist definitiv ein massiver Vorschlaghammer, aber es funktioniert. (Es zwingt nicht nur brutal, es zwingt brutal)

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

Probieren Sie es online!

Hier ist eine Erklärung dafür:

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

Der X* ^4Kreuzmultiplikator generiert viele doppelte Werte (es sind mehr als 20 Nullen erforderlich , bevor die Kreuzaddition durchgeführt wird), dies ist jedoch unproblematisch, da wir die festgelegte Differenz verwenden, die mit den eindeutigen Werten funktioniert.

Dies schlägt derzeit fehl $n == 1(was einen leeren Satz zurückgeben sollte), aber es liegt ein Problem vor, das wahrscheinlich in zukünftigen Versionen funktionieren wird. JoKings Version ist etwas länger, funktioniert aber $n == 1im aktuellen Rakudo.

user0721090601
quelle
1
Wow, peinlich ... Meine zusätzlichen Bytes stammen aus der Behebung des Problems mit n = 1 (obwohl Sie $ _ anstelle von $ ^ n für -1 verwenden können)
Jo King,
1
@JoKing ha, ich glaube nicht , dass es etwas falsch ist mit zwei Leuten praktisch die gleiche Antwort zu bekommen (vor allem , weil bei Sie in der aktuellen Versionen im Vergleich zu mir arbeiten , die derzeit theoretisch ist) Auch dank auf den $ _, total Brainfart meinerseits
user0721090601
8

MATL , 25 23 Bytes

Vielen Dank an @ Giuseppe , der einen Fehler behoben und 2 Bytes golfen hat!

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

Probieren Sie es online!

Erläuterung

Brute-Force-Ansatz.

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
quelle
Ihre Version funktioniert nicht für n=2, also habe ich es behoben und ein Byte entfernt, um zu booten! Probieren Sie es online!
Giuseppe
Oh, ich habe ein weiteres Byte gefunden, indem ich die Dinge neu arrangiert habe :-) 23 Bytes
Giuseppe
@ Giuseppe Hey, vielen Dank!
Luis Mendo
7

J , 48-45 Bytes

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

Probieren Sie es online!

-3 Bytes dank FrownyFrog

Versuchte eine Brute-Force-Lösung, war aber nicht in der Lage, diese Übersetzung von Rods Idee zu übertreffen.

Jona
quelle
tyvm wie immer @FrownyFrog
Jonah
noch kürzer626b66jh
FrownyFrog
Welche Basis wird verwendet und woher weiß ich, wie ich sie verwenden soll?
Jonah,
ah, ty. Ich hatte vergessen, dass das b"Trennzeichen" dort war und las es als Teil der Zahl ...
Jonah
6

R , 64 Bytes

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

Probieren Sie es online!

Ports die erstaunliche Antwort von Rod gefunden .

R , 85 73 68 Byte

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

Probieren Sie es online!

Brute Force generiert alle möglichen Punkte mit nDarts und nimmt dann die entsprechende Differenz.

Dank an die Octave-Lösung von OrangeCherries, die mich daran erinnert hat combn.

5 weitere Bytes dank Robin Ryders Vorschlag zur Verwendung %o%.

Giuseppe
quelle
Es tut mir sehr leid, ich hätte das Beispiel noch einmal überprüfen sollen!
Beirtipol
1
Gute Verwendung des FUNArguments von combn! Sie können mit statt 68 Bytes erhalten . %o%x*3,x*2
Robin Ryder
@RobinRyder duh. Ich habe sogar versucht herauszufinden, wie die Rundfunkvervielfachung mit der Oktavantwort durchgeführt werden kann!
Giuseppe
4

Oktave , 91 Bytes 73 Bytes 71 Bytes

Eine andere Brute-Force-Methode.

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

Bis zu 73 Bytes dank Giuseppe
Bis zu 71 Bytes durch Ersetzen von nchoosek durch combnk

Probieren Sie es online!

OrangeCherries
quelle
3

Pyth , 22 Bytes

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

Probieren Sie es online!

Timeout in TIO für Eingänge größer als 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
quelle
Nicht kürzer, aber wenn Sie die Leistung ändern U4, S3wird ein bisschen verbessert, weil beide kartesischen Produkte nicht mit all diesen zusätzlichen nutzlosen Nullen umgehen müssen. In diesem Fall wird Eingabe 3 in ~ 13 Sekunden statt ~ 30 Sekunden ausgegeben (obwohl Eingabe 4 immer noch eine Zeitüberschreitung aufweist und dies Codegolf ist, spielt das keine Rolle; p).
Kevin Cruijssen
@ KevinCruijssen Sehr guter Punkt, ich hatte nicht daran gedacht, dass ich auf beiden Seiten des kartesischen Produkts eine 0 einfüge. Wenn ich weitere Golfplätze oder Gründe für die Bearbeitung finde, werde ich das auf jeden Fall hinzufügen, danke!
Sok
Schade ist es nicht eine 0-basierte inklusiven Bereich builtin in Pyth .. Ich habe versucht -S*60QsM^*MP*S3aU21 25, aber dass der Raum zwischen 21und 25ist ein bisschen ärgerlich .. Mit einem 0-basierten inklusiven Bereich yTstatt verwendet werden könnte 21, ein bisschen wie folgt aus : -S*60QsM^*MP*S3a}ZyT25( aber dann Znatürlich ohne den }mit dem 0-basierten inklusivbereich). Vielleicht sehen Sie etwas zu Golf in diesem alternativen Ansatz, das 25der Liste hinzuzufügen und das 75nach dem ersten kartesischen Produkt zu entfernen ?
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*

Probieren Sie es 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*

Probieren Sie es online!

-3 Bytes, danke an Rod

TFeld
quelle
@ Rod Danke, :)
TFeld
2

05AB1E , 21 20 18 Bytes

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

-3 Bytes dank @Grimy .

Je höher die Eingabe, desto schneller wird die Zeit abgelaufen ã. Dies liegt an dem eingebauten kartesischen Produkt .

Probieren Sie es online aus oder überprüfen Sie ein paar weitere Testfälle .

Erläuterung:

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
quelle
In diesem 60 * input
Sinne
@Grimy Ja, ignoriere meine Dummheit. Ich habe das falsche Ergebnis in der Testsuite gesehen, aber natürlich habe ich selbst einen Fehler gemacht. Ich sollte abends nach einem langen Arbeitstag nicht codegolf spielen.
Kevin Cruijssen
1

MathGolf , 26 Bytes

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

Probieren Sie es online!

-2 Bytes dank Kevin Cruijssen

Erläuterung

╟*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
quelle
-2 Bytes durch Ändern 3╒*mÅ~*N_∞α+auf N▐3╒*mÅ~*╡. (PS: Warum erwähnen Sie " für Eingabe 3 " in Ihrem Erklärungsheader?)
Kevin Cruijssen
Gute Arbeit, ich werde es ändern, wenn ich wieder auf meinem Laptop bin! Ich hatte eine 31-byter wenn ich die Antwort zu schreiben begann, die mehr kompliziert war, so dass ich eine gründliche Erklärung hinzufügen wollte, aber dann fand ich die Lösung in der Post
maxb
1

Wolfram Language (Mathematica) , 69 Bytes

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

Probieren Sie es online!

Basierend auf der Antwort von Lirtosiast .

ArrayDas dritte Argument von gibt den Versatz an (Standard 1), und das vierte Argument gibt den zu verwendenden Kopf an List. ##&ist gleichbedeutend mit Sequence, Array[1##&,{4,21},0,##&]gibt also ein (abgeflachtes) SequenceElement des äußeren Produkts von 0..3und zurück 0..20.

attinat
quelle
0

Kohle , 36 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Verwendet den Algorithmus von @ Rod; rohe Gewalt hätte 60 Bytes gedauert. Kürzen Sie die Zeichenfolge auf 9 Zeichen, wenn die Eingabe größer als 1 ist. Nehmen Sie dann die Ordnungszahlen der Zeichen und addieren Sie das entsprechende Vielfache von 60.

Neil
quelle
0

C # (Visual C # Interactive Compiler) , 305 Byte

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

Nun, es scheint nicht einfach zu sein, alle möglichen Kombinationen in C # zu berechnen, also ist diese Katastrophe eines Codes alles, was ich mir einfallen lassen könnte.

Außerdem dauert es ungefähr 30s, um ...

Würde gerne eine bessere Lösung sehen.

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

Probieren Sie es online!

Innat3
quelle
Sie haben anscheinend vergessen, Ihre eigentliche Antwort zu veröffentlichen. Normalerweise legen die Leute die abgewickelte Form unter die des Golfspielers.
Veskah,
@Veskah gut, ich poste normalerweise den Golf, wenn es verständlich ist, aber da dieser ein bisschen zu lang war, habe ich keinen Grund gesehen, es zu tun, da er sowieso im tio-Link zu finden ist, aber ich denke, du hast trotzdem Recht
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]}}

Probieren Sie es online!

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

Probieren Sie es online!

Es wurde eher für die Codelänge als für die Laufzeit optimiert, daher ist es etwas langsam. Es werden viele redundante Einträge für den Nachschlage-Hash generiert. Das @bDurchlaufen des Arrays uniqbeschleunigt es erheblich, kostet aber 5 weitere Bytes, weshalb ich es nicht getan habe.

Xcali
quelle
0

Wolfram Language (Mathematica) , 81 Byte

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

Probieren Sie es online!

Mathematica hat einige verwandte Buildins, einschließlich FrobeniusSolveund die eingeschränkte Form von IntegerPartitions, aber keines davon ist kürzer als Brute Force.

Lirtosiast
quelle
Das ist falsch - es sollte zurückkehren{163,166,169,172,173,175,176,178,179}
attinat
1
@attinat Behoben.
Lirtosiast
69 Bytes
Attinat
@attinat Poste es selbst.
Lirtosiast