Niemożliwe wyniki rzutek

39

Zaskoczyło mnie to, że nie zadałem już tego pytania, chociaż na kasach rzutek istnieje wielkie pytanie: rzutki spotykają Codegolfa

Twoim zadaniem jest obliczyć, które wyniki nie są możliwe przy rzutkach „n” poniżej maksymalnego wyniku dla rzutek „n”. Np. Dla n = 3 maksymalny możliwy wynik to 180, więc powróciłbyś [163,166,169,172,173,175,176,178,179]

Podsumowanie reguł dla gołych kości:

Możliwe wyniki dla jednej strzałki to:

  • 0 (brak)
  • 1-20, 25, 50
  • podwójne lub potrójne 1-20

Zasady:

  • obowiązują standardowe zasady gry w golfa
  • musisz wziąć pojedynczy parametr „n” w dowolny sposób na jaki pozwala Twój język i zwrócić listę / tablicę wszystkich unikalnych wyników poniżej maksymalnej liczby punktów, której nie można zdobyć za pomocą n rzutek. Możesz również wydrukować te wartości na konsoli.
  • kolejność wyników jest nieistotna
  • najkrótszy kod w bajtach wygrywa
beirtipol
źródło
1
Przepraszamy za formatowanie, pisanie na telefonie!
beirtipol
nieco spokrewniony ; Wydaje mi się, że istniał jeszcze jeden sposób na znalezienie brakujących wartości z zakresu, ale nie mogę go znaleźć.
Giuseppe
1
Szczerze przepraszam, wyciągnąłem te wyniki z odpowiedzi na podstawowe pytanie 3 rzutek, ale nie zweryfikowałem! Zaktualizuję pytanie!
beirtipol
2
bez obaw :-) Wygląda mi dobrze!
Giuseppe

Odpowiedzi:

32

Python 3 , 80 79 59 57 bajtów

-1 bajt dzięki Arnauld
-20 bajtów dzięki ArBo
-2 bajty dzięki ujemnej siódemce

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

Wypróbuj online!

Pręt
źródło
26
Ooooo, co ?!
beirtipol
2
@beirtipol jest wzorzec liczb po drugiej rzutce (no cóż, jest też na 1. rzutce, ale są też inne liczby), to oblicza liczby na podstawie tego wzoru.
Rod
4
Ach, dobrze zagrane, naprawdę dobrze zagrane
beirtipol
8
@EriktheOutgolfer Jeśli kompresujesz, równie dobrze możesz skompresować wszystko;) 59 bajtów
ArBo
2
@negativeseven pobił mnie do 60, chciałem tego spróbować :) Dobry znalezisko na temat trzymania bajtów osobno, choć o tym nie myślałem.
ArBo
14

Perl 6 , 42 bajtów

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

Wypróbuj online!

Brute force rozwiązanie, które wypracowuje wszystkie możliwe wartości rzutek.

Jo King
źródło
9

JavaScript (ES6),  55  54 bajtów

Zaoszczędzono 1 bajt dzięki @Shaggy

Na podstawie wzoru użytego przez Rod .

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

Wypróbuj online!

Arnauld
źródło
1
s=60*n->, n*=60aby zapisać bajt.
Kudłaty
n
9

Perl 6 , 39 bajtów (37 znaków)

To zdecydowanie używa potężnego młota, ale działa. (Nie tylko brutalnie go zmusza, ale brutalnie brutalnie zmusza)

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

Wypróbuj online!

Oto wyjaśnienie:

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

X* ^4Krzyż mnożnik generuje wiele zduplikowanych wartości (nie będzie 20+ Zera zaangażowanych i to przed robi przekrój dodatkowo), ale to nie powoduje żadnych problemów, ponieważ używamy różnicę zestaw , który działa z unikalnymi wartościami.

To się obecnie nie powiedzie $n == 1(co powinno zwrócić pusty zestaw), ale zgłoszono problem i prawdopodobnie będzie działać w przyszłych wersjach. Wersja JoKinga jest trochę dłużej, ale działa $n == 1w obecnym Rakudo.

użytkownik0721090601
źródło
1
Wow, niezręczne ... Moje dodatkowe bajty pochodzą z rozwiązania problemu n = 1 (chociaż możesz użyć $ _ zamiast $ ^ n dla -1)
Jo King
1
@JoKing ha, nie sądzę, że coś jest nie tak z dwojgiem ludzi otrzymujących praktycznie tę samą odpowiedź (zwłaszcza, że ​​twoja działa w obecnych wersjach w porównaniu do mojej, która jest obecnie teoretyczna). Ponadto, dzięki $ _, totalny fart mózgowy z mojej strony
user0721090601
8

MATL , 25 23 bajtów

Dzięki @Giuseppe , który naprawił błąd i grał w golfa 2 bajty!

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

Wypróbuj online!

Wyjaśnienie

Podejście brutalnej siły.

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
źródło
Twoja wersja nie działa n=2, więc naprawiłem ją i uruchomiłem bajt, aby uruchomić! Wypróbuj online!
Giuseppe
Znalazłem kolejny bajt, zmieniając układ rzeczy :-) 23 bajty
Giuseppe,
@Giuseppe Hej, dziękuję bardzo!
Luis Mendo
7

J , 48 45 bajtów

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

Wypróbuj online!

-3 bajty dzięki FrownyFrog

Podjęto próbę brutalnej siły, ale nie udało się pobić tego tłumaczenia pomysłu Rod.

Jonasz
źródło
tyvm jak zawsze, @FrownyFrog
Jonah
jeszcze krótszy626b66jh
FrownyFrog
jaka baza jest używana i skąd J wie, jak jej używać?
Jonah
ah, ty. zapomniałem, że bjest tam „ogranicznik” i czytałem go jako część numeru ....
Jonah
6

R , 64 bajty

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

Wypróbuj online!

Porty niesamowite odpowiedź znaleźć Rod .

R , 85 73 68 bajtów

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

Wypróbuj online!

Brutalna siła generuje wszystkie możliwe wyniki za pomocą nrzutek, a następnie przyjmuje odpowiednią ustawioną różnicę.

Kredyt dla Octave rozwiązania OrangeCherries' za przypomnienie mi combn.

5 dodatkowych bajtów dzięki sugestii Robina Rydera%o% .

Giuseppe
źródło
Bardzo przepraszam, powinienem dwukrotnie sprawdzić przykład!
beirtipol
1
Niezłe użycie FUNargumentu combn! Można uzyskać 68 bajtów ze %o%zamiast x*3,x*2.
Robin Ryder
@RobinRyder duh. Próbowałem nawet wymyślić, jak wykonać zwielokrotnianie transmisji na odpowiedzi Octave!
Giuseppe
4

Oktawa , 91 bajtów 73 bajty 71 bajtów

Kolejna metoda brutalnej siły.

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

Zejdź do 73 bajtów dzięki Giuseppe
Zejdź do 71 bajtów, zastępując nchoosek combnk

Wypróbuj online!

Wiśnie Pomarańczowe
źródło
3

Pyth , 22 bajty

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

Wypróbuj online!

Przekroczono limit czasu w TIO dla danych wejściowych większych niż 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
źródło
Nie krócej, ale jeśli zmieni U4się S3wydajność poprawia się trochę, ponieważ oba iloczyn kartezjański nie mają do czynienia z tymi wszystkimi dodatkowymi bezużytecznych 0s. Wejdź 3 wyjścia w ~ 13 sekund zamiast ~ 30 w tym przypadku (chociaż wejście 4 wciąż się kończy, a to jest kod golfowy, więc nie ma to tak wielkiego znaczenia; p).
Kevin Cruijssen
@KevinCruijssen Bardzo dobrze, że nie pomyślałem, że dodałem 0 po obu stronach produktu kartezjańskiego. Jeśli znajdę więcej golfów lub powody do edycji, z pewnością to uwzględnię, dzięki!
Sok
Szkoda, że ​​w Pyth nie ma wbudowanego zakresu włączającego opartego na 0 .. Próbowałem tego -S*60QsM^*MP*S3aU21 25, ale ta przestrzeń pomiędzy 21i 25jest nieco denerwująca .. Przy włączonym zakresie włączającym opartym na 0 yTzamiast tego można użyć 21czegoś takiego: -S*60QsM^*MP*S3a}ZyT25( ale potem Zoczywiście bez }zastąpienia go zakresem obejmującym 0). Może widzisz coś do golfa w tym alternatywnym podejściu dodawania 25do listy i usuwania 75po pierwszym kartezjańskim produkcie?
Kevin Cruijssen
2

Python 2 , 125 bajtów

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*

Wypróbuj online!


Python 3 , 126 125 122 bajtów

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*

Wypróbuj online!

-3 bajty, dzięki Rod

TFeld
źródło
@rod Dzięki, :)
TFeld
2

05AB1E , 21 20 18 bajtów

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

-3 bajty dzięki @Grimy .

Przekracza się dość szybko, im wyższy wkład, ze względu na wbudowany produkt kartezjański ã.

Wypróbuj online lub sprawdź kilka innych przypadków testowych .

Wyjaśnienie:

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
źródło
W tym 60 * input
względzie
@Grimy Tak, zignoruj ​​moją głupotę. Widziałem niepoprawny wynik w zestawie testów, ale oczywiście sam popełniłem błąd. Nie powinienem codegolf wieczorem po długim dniu w pracy ..>.>
Kevin Cruijssen
1

MathGolf , 26 bajtów

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

Wypróbuj online!

-2 bajty dzięki Kevin Cruijssen

Wyjaśnienie

╟*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
źródło
-2 bajty, zmieniając 3╒*mÅ~*N_∞α+na N▐3╒*mÅ~*╡. (PS: Dlaczego w nagłówku wyjaśnienia wspominasz „ dla wejścia 3 ”)
Kevin Cruijssen,
Dobra robota, zmienię to, kiedy wrócę na laptopa! Miałem 31 bajtów, kiedy zacząłem pisać odpowiedź, co było bardziej skomplikowane, więc chciałem dodać dokładne wyjaśnienie, ale potem znalazłem rozwiązanie w poście
maks.
1

Wolfram Language (Mathematica) , 69 bajtów

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

Wypróbuj online!

Na podstawie odpowiedzi lirtosiasta .

ArrayTrzeci argument określa przesunięcie (domyślnie 1), a czwarty argument określa głowicę, której należy użyć zamiast List. ##&jest równoważne Sequence, więc Array[1##&,{4,21},0,##&]zwraca (spłaszczony) Sequencezawierający elementy produktu zewnętrznego 0..3i 0..20.

attinat
źródło
0

Węgiel drzewny , 36 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wykorzystuje algorytm @ Rod; brutalna siła zajęłaby 60 bajtów. Działa poprzez obcięcie łańcucha do 9 znaków, jeśli wartość wejściowa jest większa niż 1, a następnie pobranie rzędnych znaków i dodanie odpowiedniej wielokrotności 60.

Neil
źródło
0

C # (interaktywny kompilator Visual C #) , 305 bajtów

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

Cóż, wydaje się, że nie ma łatwego sposobu obliczenia wszystkich możliwych kombinacji w C #, więc ta katastrofa kodu to wszystko, co mogłem wymyślić.

Ponadto ukończenie zajmuje około 30 sekund ...

Chciałbym zobaczyć lepsze rozwiązanie.

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

Wypróbuj online!

Innat3
źródło
Wygląda na to, że zapomniałeś opublikować swoją rzeczywistą odpowiedź w golfa. Zwykle ludzie umieszczają rozwiniętą formę pod golfem.
Veskah
@Weskah cóż, zazwyczaj wysyłam golfa, jeśli jest zrozumiały, ale ponieważ ten był trochę za długi, nie widziałem powodu, aby to robić, ponieważ można go znaleźć w linku tio, ale myślę, że masz rację
Innat3
0

Kotlin , 118 bajtów

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

Wypróbuj online!

JohnWells
źródło
0

Perl 5 -n , 96 93 91 bajtów

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

Wypróbuj online!

Został zoptymalizowany pod kątem długości kodu, a nie czasu działania, więc jest trochę powolny. Generuje wiele niepotrzebnych wpisów dla swojego skrótu wyszukiwania. Uruchomienie @btablicy uniqznacznie przyspiesza ją, ale kosztuje 5 bajtów więcej, więc tego nie zrobiłem.

Xcali
źródło
0

Wolfram Language (Mathematica) , 81 bajtów

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

Wypróbuj online!

Mathematica ma kilka powiązanych wbudowanych funkcji, w tym FrobeniusSolveograniczoną formę IntegerPartitions, ale żadne z nich nie jest krótsze niż brutalna siła.

lirtosiast
źródło
To jest niepoprawne - powinno zostać zwrócone{163,166,169,172,173,175,176,178,179}
załączone
1
@attinat Naprawiono.
lirtosiast
69 bajtów
attinat
@attinat Opublikuj to sam.
lirtosiast