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

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!


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


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!


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.


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

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.


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% .


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!


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

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


@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)

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]

-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.


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.


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!


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

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.


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.


To jest niepoprawne - powinno zostać zwrócone{163,166,169,172,173,175,176,178,179}
załączone

1
@attinat Naprawiono.
lirtosiast


@attinat Opublikuj to sam.
lirtosiast
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.