Punteggio di freccette impossibili


39

Sono stato sorpreso di non averlo già trovato, anche se c'è una grande domanda sui controlli delle freccette: Freccette incontra Codegolf

La tua sfida è calcolare quali punteggi non sono possibili con 'n' freccette al di sotto del punteggio massimo per 'n' freccette. Ad esempio per n = 3, il punteggio massimo possibile è 180, quindi restituiresti [163.166.169.172.173.175.176.178.179]

Per un riepilogo della regola delle ossa nude:

I punteggi possibili per un singolo dardo sono:

  • 0 (mancato)
  • 1-20, 25, 50
  • doppia o tripla di 1-20

Regole:

  • si applicano le regole standard per il golf
  • devi prendere un singolo parametro 'n' in qualunque modo la tua lingua lo consenta e restituire un elenco / matrice di tutti i punteggi unici al di sotto del punteggio massimo che non può essere segnato con n freccette. È inoltre possibile stampare questi valori sulla console.
  • l'ordine dei risultati non è importante
  • vince il codice più breve in byte

1
Ci scusiamo per la formattazione, la scrittura su un telefono!
Beirtipol,

in qualche modo correlato ; Penso che ce ne fosse un altro nel trovare valori mancanti da un intervallo, ma non riesco a trovarlo.
Giuseppe,

1
Mi scuso sinceramente, ho estratto quelle uscite da una risposta alla domanda di base di 3 freccette ma non ho verificato! Aggiornerò la domanda!
Beirtipol,

2
non preoccuparti :-) Mi sta benissimo!
Giuseppe,

Risposte:


32

Python 3 , 80 79 59 57 byte

-1 byte grazie ad Arnauld
-20 byte grazie ad ArBo
-2 byte grazie a sette negativi

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

Provalo online!


26
Io, ehm, cosa ?!
Beirtipol,

2
@beirtipol c'è un modello sui numeri dopo il 2 ° dardo (beh, anche sul 1 ° dardo, ma ci sono altri numeri), questo calcola i numeri in base a questo modello.
Rod

4
Ah, ben suonato, ben suonato davvero
beirtipol

8
@EriktheOutgolfer Se stai comprimendo, potresti anche comprimere tutto;) 59 byte
ArBo

2
@negativeseven mi ha battuto alla cosa dei 60, ci avrei provato :) Una buona scoperta nel mantenere separate le distrazioni, non ci avevo pensato.
ArBo


9

JavaScript (ES6),  55  54 byte

Salvato 1 byte grazie a @Shaggy

Basato sul modello utilizzato da Rod .

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

Provalo online!


1
s=60*n-> n*=60per salvare un byte.
Shaggy,

@Shaggy Grazie. :) Mi è mancato quello a causa della mia versione iniziale (non pubblicata) in cui stato riutilizzato in seguito. n
Arnauld,

9

Perl 6 , 39 byte (37 caratteri)

Questo sta sicuramente usando una mazza massiccia ma funziona. (Non solo la forza bruta, la forza brutalmente brutale)

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

Provalo online!

Ecco una spiegazione:

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

Il X* ^4moltiplicatore incrociato genera molti valori duplicati (saranno coinvolti più di 20 zeri e questo è prima di eseguire l'aggiunta incrociata), ma ciò non causa alcun problema poiché utilizziamo la differenza impostata che funziona con i valori univoci.

Questo al momento fallisce $n == 1(che dovrebbe restituire un set vuoto), ma c'è un problema archiviato e probabilmente funzionerà nelle versioni future. La versione di JoKing è un po 'più lunga, ma funziona $n == 1nell'attuale Rakudo.


1
Wow, imbarazzante ... I miei byte extra derivano dalla risoluzione del problema n = 1 (anche se puoi usare $ _ invece di $ ^ n per -1)
Jo King il

1
@JoKing ah, non credo che ci sia qualcosa di sbagliato nel fatto che due persone ottengano praticamente la stessa risposta (soprattutto perché il tuo funziona nelle versioni attuali rispetto al mio che è attualmente teorico) Inoltre, grazie a $ _, Brainfart totale da parte mia
user0721090601


8

MATL , 25 23 byte

Grazie a @Giuseppe , che ha corretto un errore e ha giocato a golf 2 byte!

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

Provalo online!

Spiegazione

Approccio a forza 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

La tua versione non funziona n=2, quindi l'ho riparata e mi sono liberata di un byte per l'avvio! Provalo online!
Giuseppe,

Oh, ho trovato un altro byte riordinando le cose :-) 23 byte
Giuseppe

@Giuseppe Ehi, grazie mille!
Luis Mendo,

7

J , 48 45 byte

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

Provalo online!

-3 byte grazie a FrownyFrog

Tentò una soluzione di forza bruta, ma non fu in grado di battere questa traduzione dell'idea di Rod.


tyvm come sempre, @FrownyFrog
Giona

ancora più breve626b66jh
FrownyFrog

quale base viene utilizzata e come fa J a usarla?
Giona il


ah, ty. avevo dimenticato che bc'era il "delimitatore" e lo leggevo come parte del numero ....
Giona

6

R , 64 byte

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

Provalo online!

Porti la straordinaria risposta trovata da Rod .

R , 85 73 68 byte

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

Provalo online!

La forza bruta genera tutti i punteggi possibili con le nfreccette, quindi prende la differenza impostata appropriata.

Ringraziamo la soluzione Octave di OrangeCherries per avermelo ricordato combn.

Altri 5 byte grazie al suggerimento di Robin Ryder di utilizzare %o%.


Mi dispiace molto, avrei dovuto ricontrollare l'esempio!
Beirtipol,

1
Bel uso FUNdell'argomento di combn! È possibile ottenere 68 byte con %o%anziché x*3,x*2.
Robin Ryder,

@RobinRyder duh. Ho anche provato a capire come fare la moltiplicazione della trasmissione sulla risposta Octave!
Giuseppe,

4

Ottava , 91 byte 73 byte 71 byte

Un altro metodo di forza bruta.

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

Fino a 73 byte grazie a Giuseppe
Fino a 71 byte sostituendo nchoosek con combnk

Provalo online!


3

Pyth , 22 byte

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

Provalo online!

Timeout in TIO per input superiori a 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

Non più breve, ma se si U4passa S3alle prestazioni viene migliorato un po 'perché entrambi i prodotti cartesiani non devono affrontare tutti quegli 0 inutili aggiuntivi. Inserisci 3 uscite in ~ 13 secondi invece di ~ 30 in quel caso (anche se l'ingresso 4 è ancora in timeout, e questo è codice golf, quindi non importa molto; p).
Kevin Cruijssen,

@KevinCruijssen Ottimo punto, non avevo considerato che avrei incluso uno 0 su entrambi i lati del prodotto cartesiano. Se trovo più golf o motivi per modificarlo, lo includerò sicuramente, grazie!
Ho

Peccato che non ci sia un intervallo inclusivo basato su 0 incorporato in Pyth .. Ho provato questo -S*60QsM^*MP*S3aU21 25, ma quello spazio tra 21ed 25è un po 'fastidioso .. Con un intervallo inclusivo basato su 0 yTpotrebbe essere usato al posto di 21, un po' come questo: -S*60QsM^*MP*S3a}ZyT25( ma poi senza Zovviamente, con il }sostituito con l'intervallo inclusivo basato su 0). Forse vedi qualcosa da giocare a golf in questo approccio alternativo di aggiungere 25l'elenco all'elenco e rimuovere il 75dopo il primo prodotto cartesiano?
Kevin Cruijssen,


2

Python 2 , 125 byte

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*

Provalo online!


Python 3 , 126 125 122 byte

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*

Provalo online!

-3 byte, grazie a Rod


@rod Grazie, :)
TFeld il

2

05AB1E , 21 20 18 byte

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

-3 byte grazie a @Grimy .

Il timeout è piuttosto rapido quanto più alto è l'input dovuto all'integrazione del prodotto cartesiano ã .

Provalo online o verifica alcuni altri casi di test .

Spiegazione:

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)

In quella nota, il massimo è 60 * input, non 180.
Grimmy

@Grimy Sì, ignora la mia stupidità .. Ho visto il risultato errato nella suite di test, ma ovviamente ho fatto anch'io un errore. Non dovrei codegolf la sera dopo una lunga giornata di lavoro ..>.>
Kevin Cruijssen,


1

MathGolf , 26 byte

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

Provalo online!

-2 byte grazie a Kevin Cruijssen

Spiegazione

╟*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 byte cambiando 3╒*mÅ~*N_∞α+in N▐3╒*mÅ~*╡. (PS: Perché menzioni " per input 3 " nell'intestazione della spiegazione?)
Kevin Cruijssen,

Bel lavoro, lo cambierò quando torno sul mio laptop! Ho avuto un 31-byte quando ho iniziato a scrivere la risposta, che era più complicata, quindi volevo aggiungere una spiegazione approfondita, ma poi ho trovato la soluzione nel post
maxb

1

Wolfram Language (Mathematica) , 69 byte

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

Provalo online!

Basato sulla risposta di Lirtosiast .

ArrayIl terzo argomento specifica l'offset (impostazione predefinita 1) e il quarto argomento specifica la testa da utilizzare anziché List. ##&è equivalente a Sequence, quindi Array[1##&,{4,21},0,##&]restituisce un (appiattito) Sequencecontenente membri del prodotto esterno di 0..3e 0..20.


0

Carbone , 36 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Utilizza l'algoritmo di @ Rod; la forza bruta avrebbe richiesto 60 byte. Funziona troncando la stringa di 9 caratteri se l'input è maggiore di 1, quindi prendendo le ordinali dei caratteri e aggiungendo il multiplo appropriato di 60.


0

C # (compilatore interattivo Visual C #) , 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);}

Bene, non sembra esserci un modo semplice per calcolare tutte le possibili combinazioni in C #, quindi questo disastro di un codice è tutto ciò che ho potuto inventare.

Inoltre ci vogliono circa 30 secondi per completare ...

Mi piacerebbe vedere una soluzione migliore.

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

Provalo online!


Sembra che tu abbia dimenticato di pubblicare la tua vera risposta golf. Di solito le persone mettono la forma srotolata sotto quella golfizzata.
Veskah,

@Veskah bene, di solito inserisco il golf se è comprensibile, ma poiché questo è stato un po 'troppo lungo non ho visto il punto di farlo dal momento che può essere trovato nel link tio comunque, ma suppongo che tu abbia ragione comunque
Innat3


0

Perl 5 -n , 96 93 91 byte

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

Provalo online!

È stato ottimizzato per la lunghezza del codice piuttosto che per il tempo di esecuzione, quindi è un po 'lento. Genera molte voci ridondanti per il suo hash di ricerca. L'esecuzione @bdell'array uniqlo accelera notevolmente, ma costa 5 byte in più, quindi non l'ho fatto.


0

Wolfram Language (Mathematica) , 81 byte

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

Provalo online!

Mathematica ha alcuni builtin correlati inclusi FrobeniusSolvee la forma limitata di IntegerPartitions, ma nessuno di essi è più corto della forza bruta.


Questo non è corretto - dovrebbe tornare{163,166,169,172,173,175,176,178,179}
attinat il

1
@attinat Fixed.
lirtosiast


@attinat Pubblicalo tu stesso.
lunedì
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.