Sytuacja:
Kilka ( M
) krasnoludów znalazło skrzynię goblina ze N
złotymi monetami i muszą je podzielić. Ze względu na starożytne zasady rządzące przydzielaniem łupów piratom w kolejności starszeństwa, najstarszy krasnolud powinien dostać jedną monetę więcej niż następny najstarszy krasnolud itd., Aby najmłodszy krasnolud otrzymał M-1
mniej monet niż najstarszy krasnolud. Ponadto żaden krasnolud nie musi rzucać monetą (tzn. Żadnych monet ujemnych do żadnych krasnoludów)
Pomóż krasnoludom podzielić monety w ten sposób lub powiedz im, że jest to niemożliwe.
Kod zwycięzcy musi zawsze odpowiadać poprawnie (wyzwanie jest deterministyczne) i przestrzegać ogólnych zasad gry w golfa .
Wkład
Otrzymujesz liczbę całkowitą N (3 ≤ N ≤ 1000) dla liczby monet i liczbę całkowitą M (3 ≤ M ≤ N) dla liczby krasnoludów, oddzielonych spacją.
Wydajność
Jeśli nie można podzielić monet w sposób, jaki chcą krasnoludy, wydrukuj -1 (minus jeden). W przeciwnym razie wydrukuj liczbę monet, które otrzyma każdy karzeł, od najstarszych do najmłodszych. Oddziel liczby spacjami.
Próbki :
wkład
3 3
wydajność
2 1 0
wkład
9 3
wydajność
4 3 2
wkład
7 3
wydajność
-1
wkład
6 4
wydajność
3 2 1 0
Odpowiedzi:
J -
32292825Niekrótszy niż inne rozwiązanie J,alei używa innego pomysłuOdpowiedź na liczbę monet, które otrzymuje gnom o najwyższej randze, to po prostu
N/M+(M-1)/2
(jeśli jest to liczba całkowita), konstruujemy negatywną wartość tego-:@-.@]-%
. Następniei:
tworzy taką tablicę2 1 0 _1 _2
dla argumentu_2
i bierzemy z niej elementy M.źródło
i:
. Możesz zapisać kolejne trzy znaki, pisząc%
zamiast[%]
i używając-.@]
zamiast(1-])
.J - 30 znaków
Bardzo fajnie gra w golfa. Wiele rzeczy wyszło dobrze.
Wyjaśnienie:
/
- Weź liczby całkowite rozdzielone spacjami jako argument i przesuń funkcję między nimi. To znaczy, rozważ N lewy argument funkcji w nawiasach,(...)
a M prawy argument.i.&-
- Negate (-
), a następnie weź liczby całkowite (i.
). Zwykle, gdy robisz coś takiegoi.5
, jak dostajesz0 1 2 3 4
. Ilekroći.
otrzymuje liczbę ujemną, jednak odwraca tę listę wyjściową. Tak np .i._5
Da4 3 2 1 0
.s=.+/&
- Wykonaj powyższą akcję dla każdego argumentu (&
), a następnie utwórz tabelę dodatków (+/
) z tych tablic. Mamy teraz tabelę, w której każdy rząd jest możliwą dystrybucją monet do M krasnoludów, choć może nie, gdy jest N monet. Wreszcie, ten czasownik tworzący tabelę jest tak przydatny, że nazwiemy gos
i użyjemy go później.+/@s~
- Teraz używamys
ponownie, ale zamieniamy (~
) kolejność argumentów, aby transponować tabelę. Jest to golfowy sposób pobierania sumy każdego wiersza po utworzeniu tabeli (+/@
), związany ze sposobem, w jaki J sumuje listy wielowymiarowe.i.[
- Na tej liście sum szukamy lewego argumentu czasownika, tj. N. Jeśli N jest pozycją, otrzymujemy ten indeks: w przeciwnym razie otrzymujemy długość listy, która w szczególności jest niepoprawnym indeksem.{ ::_1:
- Teraz próbujemy użyć indeksu, aby wyciągnąć wiersz z tabeli ws
.{
wyrzuci błąd domeny, jeśli indeks był nieprawidłowy, więc w takim przypadku łapiemy błąd (::
) i zwracamy -1 (_1:
). To obsługuje wszystko. Ponieważ używamyi.&-
wcześniej, dystrybucja monet będzie w kolejności malejącej, zgodnie z wymaganiami.Stosowanie:
źródło
9 3
powinny zostać zwrócone4 3 2
, a nie-1
. Wydaje się, że w twoim przykładzie użycia jest transpozycja?9 3
daje4 3 2
i7 3
daje_1
, zgodnie z oczekiwaniami.R -
7170676665 znakówNie golfowany:
Rozwiązanie:
Jeśli M liczba krasnoludów, sekwencję płatnego złota można rozłożyć na dwie osobliwe serie. Najpierw szereg kończący się na zero: M-1, ..., 2, 1, 0 i stała seria c, c, ..., c. Suma pierwszej serii to zawsze M * (M-1) / 2. Więc jeśli resztę (x = N - M * (M-1) / 2) można podzielić bez reszty (moduł równy 0), każdy karzeł otrzymuje x / M plus część malejącej serii.
Stosowanie:
źródło
m*(m+1)/2
jąsum(1:m)
PHP (187)
To moja pierwsza próba gry w golfa i wiem, że może być lepiej, ale nadal :)
Gra w golfa:
Nie golfowany:
Wykonaj w powłoce
Podstawowy pomysł:
Monety można oddzielić według tych reguł, jeśli jedna z nich jest prawdziwa:
Jeśli tak, przyjmujemy za podstawę średnie monety na karła (ACPD). Ale musimy zacząć od najwyższej mocy wyjściowej, aż osiągniemy najniższą. Tworzymy więc pętlę z licznikiem, zaczynając od ACPD + liczba pozostałych krasnoludów w kierunku wyższego końca, i kontynuujemy aż do osiągnięcia ACPD - liczba pozostałych krasnoludów w kierunku dolnego końca.
Zasadniczo jest tak samo, jeśli krasnoludy są nieparzyste (tj. 5 krasnoludów - środkowy ma 3, a na obu końcach pozostają 2), ale nie, jeśli są parzyste - dlatego polegamy na podłodze ORAZ okrągłej.
Dotychczasowe problemy: działa ze zbyt niską liczbą monet, co oznacza, że niektóre krasnoludy zostaną rozbite i pozbawione cennych zarobków. I to jest smutne A przynajmniej jeśli lubisz krasnoludy.
Rozwiązanie :
Inteligentniejsze rozwiązanie :
Monety są metalowe. Spraw, by krasnoludy stopiły je wszystkie, a następnie rzuciły je w mniejszą / większą liczbę monet, tak aby można je było podzielić.
Najmądrzejsze rozwiązanie :
Ukradnij ich górę, zmień nazwę na Smaug i zachowaj to wszystko dla siebie. W końcu po co zawracać sobie głowę zrzędliwymi krasnoludami?
źródło
Python 3 (100)
Korzystanie z tego samego pomysłu co @Geobits, ale zgodne z wymaganiami wejściowymi i wyjściowymi.
źródło
Python 3 -
1091071031029093Korzystając z tego samego pomysłu co Evpok, ale z kilkoma ulepszeniami.
Ulepszenia to:
źródło
[::-1]
jest lepsza niż moje rozwiązanie. +1Python 3 - 114
Działa poprzez sprawdzenie, czy
N-(M*(M-1)/2)
można go równomiernie podzielićM
. Nowy w Pythonie, więc wszelkie wskazówki są mile widziane.Przykład Ideone.com
źródło
print
styl instrukcji Python 2 ? Lub w jaki sposób ostatnia linia (else:print -1
) nie powoduje błędu?C # - 322
Okropny wynik, ale wybrałem inne podejście i skorzystałem z niego
goto
:)Skrócę to później.
źródło
Convert.ToInt16
połączenia do justint.Parse
. Możesz zadeklarować dowolną wstępnie przypisaną zmienną za pomocąvar
(zamiast npint[]
.). Parametry wiersza polecenia nie muszą być wywoływaneargs
. I możesz aliasować często używane typy, takie jakusing C = Console
. Myślę też, że w przypadku tak długiego rozwiązania lepiej jest zachować nienaruszone odstępy między wierszami niż zapisać tylko kilka znaków. Aha, i nie jestem do końca pewien, dlaczegogoto
jest to lepsze niż alternatywy tutaj ...Java 210
źródło
class A{public static void main(String[]a)
jest ważna i oszczędza ci 3 znaki. Po każdymif
i wokół każdegofor
usuń białe znaki ... itd.R:
777370 znakówUtwórz wektor, przechodząc od (M-1) do 0 i dodaje 1 do każdej liczby, aż suma nie będzie już gorsza od N. Jeśli jest wyższa, wyprowadzaj -1 w innym przypadku, wypisz wektor.
Wcięte i lekko pozbawione golfa:
Przykładowe użycie:
źródło
Julia, 45 lat
Odrobina algebry zajęła mi znacznie więcej czasu, niż powinna.
źródło
JavaScript - 76
Prawdopodobnie mógłbym napisać to krócej w innym języku, ale nie było jeszcze rozwiązania JS, więc oto:
Uruchom w konsoli.
Przykładowe dane wejściowe:
Wydajność:
Wkład:
Wydajność:
Wkład:
Wyjście: -1
Szkoda, że konsola.log jest tak długa, by przeliterować :) Niestety deklaracja
l=console.log.bind(console)
nie skraca jej i po prostul=console.log
nie działa.Wkład:
Wydajność:
źródło
c=console
ic.log()
skrócić.Golfscript, 35
Jak to działa
W poniższym przykładzie dane wejściowe to
9 3
.źródło
Delphi XE3 (176)
Jak to działa.
Odczytuje 2 liczby całkowite, monety i krasnoludy.
Odejmuje różnicę na krasnoluda.
Jeśli reszta modów krasnoludków> 0 to niemożliwe.
W przeciwnym razie uzyskaj równy udział na krasnoluda w pętli krasnoludków od 1 do 0 i drukuje dwarfIndex + równy udział
Bez golfa
źródło
Mathematica 65
Funkcja
g
generuje wszystkie sekwencje rosnące o jeden o długości m od 0 do n i sprawdza, czy którakolwiek z nich sumuje się do m. Jeśli się powiedzie, sekwencja jest zwracana; w przeciwnym razie zwracane jest -1.Sekwencje są tworzone przez
Partition
umieszczenie listy {0,1,2,3… m} we wszystkich możliwych podlistach n ciągłych liczb całkowitych.Istnieją oczywiście bardziej wydajne sposoby osiągnięcia tego samego efektu, ale te, które znalazłem, wymagają więcej kodu.
Przykłady
źródło
C 131
Bez golfa
Kompiluje się to z ostrzeżeniem, ponieważ main nie ma typu. Jeśli nie jest to ważne w zasadach golfa, musiałbym dodać pięć znaków.
źródło
Kobra - 198
Witryna Cobra
Wyjaśnił:
Wymagane do uruchomienia kodu
Pobiera dane wejściowe i zapisuje je jako
a
ib
Inicjuje listę wyników
l
i inicjalizuje całkowitą ilość pieniędzyt
i liczbę monet, które należy dodać do każdego stosu krasnoludówn
Znajduje najniższą możliwą wartość pieniężną, która spowoduje, że wszystkie krasnoludy będą miały na stosie dopuszczalną liczbę monet
Określa, ile monet należy dodać do każdego stosu, tak aby suma wymaganych pieniędzy wynosiła> = do całkowitej dostępnej kwoty
Wypełnia listę stosami pieniędzy o różnych rozmiarach
Wyjścia znakami
-1
lubl
zależnie czy całkowita wymagana pieniędzy jest równa całkowitej dostępnej pieniędzyźródło
Perl 5 , 78 + 1 (-n) = 79 bajtów
Wypróbuj online!
źródło
Python (
1009694):Ładna, punktowana odpowiedź.Już nie, ale teraz jest krótszy.Nie golfowany:
Wydajność:
źródło