Die Situation:
Mehrere ( M
) Zwerge haben eine Koboldkiste mit N
Goldmünzen gefunden und müssen diese teilen. Aufgrund der alten Regeln, die die Zuteilung von Beute an Piraten in der Reihenfolge ihres Dienstalters regeln, sollte der älteste Zwerg eine Münze mehr als der nächstälteste Zwerg usw. erhalten, damit der jüngste Zwerg M-1
weniger Münzen als der älteste Zwerg erhält . Außerdem muss kein Zwerg Münzen einwerfen (dh keine negativen Münzen für Zwerge)
Hilf den Zwergen, die Münzen auf diese Weise zu teilen, oder sag ihnen, dass dies unmöglich ist.
Der Code des Gewinners muss immer richtig antworten (diese Herausforderung ist deterministisch) und den allgemeinen Code-Golf- Regeln folgen .
Eingang
Sie erhalten eine ganze Zahl N (3 ≤ N ≤ 1000) für die Anzahl der Münzen und eine ganze Zahl M (3 ≤ M ≤ N) für die Anzahl der durch Leerzeichen getrennten Zwerge.
Ausgabe
Wenn es nicht möglich ist, die Münzen so zu teilen, wie es die Zwerge wollen, drucke -1 (minus eins). Andernfalls drucken Sie die Anzahl der Münzen, die jeder Zwerg erhält, vom ältesten bis zum jüngsten. Trennen Sie die Zahlen mit Leerzeichen.
Proben :
Eingang
3 3
Ausgabe
2 1 0
Eingang
9 3
Ausgabe
4 3 2
Eingang
7 3
Ausgabe
-1
Eingang
6 4
Ausgabe
3 2 1 0
Antworten:
J -
32292825Nichtkürzer als andere J-Lösung,aberund verwendet eine andere IdeeDie Antwort für die Anzahl der Münzen, die der Gnom mit dem höchsten Rang erhält, ist einfach
N/M+(M-1)/2
(wenn es eine ganze Zahl ist), wir konstruieren das Negative davon-:@-.@]-%
. Danni:
macht man ein Array wie dieses2 1 0 _1 _2
zum Argument_2
und wir nehmen M Elemente daraus.quelle
i:
. Sie können durch das Schreiben einen anderen drei char speichern%
statt[%]
, und durch die Verwendung-.@]
statt(1-])
.J - 30 Zeichen
Sehr viel Spaß beim Golfen. Vieles hat gut geklappt.
Erläuterung:
/
- Nehmen Sie die durch Leerzeichen getrennten ganzen Zahlen als Argument und verteilen Sie die Funktion zwischen ihnen. Das heißt, man betrachte N als linkes Argument für die Funktion in Klammern(...)
und M als rechtes Argument.i.&-
- Negiere (-
) und nimm dann ganze Zahlen (i.
). Normalerweise, wenn Sie so etwas tun wiei.5
Sie bekommen0 1 2 3 4
. Wenni.
jedoch eine negative Zahl empfangen wird, wird diese Ausgabeliste umgekehrt. So wird zBi._5
geben4 3 2 1 0
.s=.+/&
- Führen Sie die obige Aktion für jedes Argument (&
) aus und erstellen Sie+/
aus diesen Arrays eine Additionstabelle ( ). Wir haben jetzt eine Tabelle, in der jede Zeile eine mögliche Verteilung von Münzen an M Zwerge darstellt, obwohl dies vielleicht nicht der Fall ist, wenn es N Münzen gibt. Schließlich ist dieses Verb zur Tabellenerstellung so nützlich, dass wirs
es später erneut aufrufen und verwenden werden.+/@s~
- Jetzt verwenden wirs
wieder, vertauschen (~
) aber die Reihenfolge der Argumente, damit wir die Tabelle transponieren. Dies ist eine einfache Methode, um die Summe jeder Zeile nach dem Erstellen der Tabelle (+/@
) zu berechnen. Dies hängt damit zusammen, wie J mehrdimensionale Listen summiert.i.[
- In dieser Summenliste suchen wir nach dem linken Argument des Verbs, dh N. Wenn N ein Element ist, erhalten wir diesen Index. Andernfalls erhalten wir die Länge der Liste, die insbesondere ein ungültiger Index ist.{ ::_1:
- Jetzt versuchen wir, mit dem Index eine Zeile aus der Tabelle herauszuholens
.{
wird einen Domänenfehler auslösen, wenn der Index ungültig war. In diesem Fall wird der Fehler abgefangen (::
) und -1 (_1:
) zurückgegeben. Das erledigt alles. Da wiri.&-
zuvor verwendet haben, erfolgt die Verteilung der Münzen in absteigender Reihenfolge, wie erforderlich.Verwendung:
quelle
9 3
sollte zurückkehren4 3 2
, nicht-1
. Scheint es eine Umsetzung in Ihrem Beispielgebrauch zu geben?9 3
gibt4 3 2
und7 3
gibt_1
, wie erwartet.R -
7170676665 ZeichenUngolfed:
Lösung:
Wenn M die Anzahl der Zwerge ist, kann die Folge des bezahlten Goldes in zwei singuläre Reihen zerlegt werden. Zuerst eine mit Null endende Reihe: M-1, ..., 2, 1, 0 und eine konstante Reihe von c, c, ..., c. Die Summe der ersten Reihe ist immer M * (M-1) / 2. Wenn also der Rest (x = N - M * (M-1) / 2) ohne Rest geteilt werden könnte (Modulo gleich 0), erhält jeder Zwerg x / M plus den Teil der abnehmenden Reihe.
Verwendung:
quelle
m*(m+1)/2
mitsum(1:m)
PHP (187)
Es ist mein erster Versuch, Golf zu spielen, und ich weiß, es könnte besser sein, aber trotzdem :)
Golf gespielt:
Ungolfed:
In einer Shell ausführen
Grundidee:
Münzen können durch diese Regeln getrennt werden, wenn eine der folgenden Bedingungen erfüllt ist:
Wenn ja, nehmen wir als Basis die durchschnittlichen Münzen pro Zwerg (ACPD). Wir müssen jedoch von der höchsten zur niedrigsten Leistung gehen. Also machen wir eine Schleife mit einem Zähler, der von ACPD + der Zählung der übrigen Zwerge zum oberen Ende beginnt, und fahren fort, bis wir die ACPD erreichen - die Zählung der übrigen Zwerge zum unteren Ende.
Grundsätzlich ist es dasselbe, wenn die Zwerge ungerade sind (dh 5 Zwerge - der mittlere ist 3 und an beiden Enden verbleiben 2), aber nicht, wenn sie gerade sind - weshalb wir uns auf Boden UND Runde verlassen.
Bisherige Probleme: Funktioniert mit einer zu niedrigen Münzzahl, was bedeutet, dass einige Zwerge geschlagen und ihrer kostbaren Einnahmen beraubt werden. Und das ist traurig. Oder zumindest, wenn Sie Zwerge mögen.
Lösung :
Intelligentere Lösung :
Münzen sind Metall. Lass die Zwerge sie alle zum Schmelzen bringen und wirf sie dann in kleinere / größere Mengen Münzen, damit sie auf jeden Fall teilbar sind.
Intelligenteste Lösung :
Stehlen Sie ihren Berg, benennen Sie sich in Smaug um und behalten Sie alles für sich. Warum musst du dich schließlich mit mürrischen Zwergen herumschlagen?
quelle
Python 3 (100)
Verwenden der gleichen Idee wie @Geobits, jedoch gemäß den Anforderungen für Eingabe und Ausgabe.
quelle
Python 3 -
1091071031029093Verwendung der gleichen Idee wie Evpok, jedoch mit einer Reihe von Verbesserungen.
Die Verbesserungen sind:
quelle
[::-1]
ist besser als meine Lösung. +1Python 3 - 114
Funktioniert, indem geprüft wird, ob durch
N-(M*(M-1)/2)
gleichmässig teilbar istM
. Neu in Python, also alle Tipps geschätzt.Ideone.com Beispiel
quelle
print
Anweisungsstil von Python 2 unterstützte ? Oder wie führt die letzte Zeile (else:print -1
) nicht zu einem Fehler?C # - 322
Schreckliche Punktzahl, aber ich habe einen anderen Ansatz gewählt und verwendet
goto
:)Ich werde es später verkürzen.
quelle
Convert.ToInt16
Anrufe auf nur verkürzenint.Parse
. Sie können jede vorab zugewiesene Variable mitvar
(anstelle von zBint[]
) deklarieren . Ihre Befehlszeilenparameter müssen nicht aufgerufen werdenargs
. Und Sie können häufig verwendete Typen wie aliasusing C = Console
. Ich denke auch, dass es für eine so lange Lösung besser ist, den Zeilenabstand intakt zu halten, als nur ein paar Zeichen zu speichern. Oh, und ich bin mir auch nicht sicher, warumgoto
es hier besser ist als Alternativen ...Java 210
quelle
class A{public static void main(String[]a)
ist beispielsweise gültig und erspart Ihnen 3 Zeichen. Entfernen Sie nachif
und um jedenfor
Whitespace ... usw.R:
777370 ZeichenErstellen Sie einen Vektor von (M-1) bis 0 und addieren Sie 1 zu jeder Zahl, bis die Summe nicht mehr unter N liegt. Wenn sie überlegen ist, geben Sie -1 aus, andernfalls geben Sie den Vektor aus.
Eingerückt und leicht ungolfed:
Anwendungsbeispiel:
quelle
Julia, 45 Jahre alt
Nur ein bisschen Algebra, ich habe viel länger gebraucht, als ich sollte.
quelle
JavaScript - 76
Ich hätte das wahrscheinlich in einer anderen Sprache kürzer schreiben können, aber es gab noch keine JS-Lösung.
Führen Sie in der Konsole aus.
Beispiel Eingabe:
Ausgabe:
Eingang:
Ausgabe:
Eingang:
Ausgabe: -1
Schade, console.log ist so lange zu buchstabieren :) Leider macht das Deklarieren
l=console.log.bind(console)
es nicht kürzer undl=console.log
funktioniert einfach nicht.Eingang:
Ausgabe:
quelle
c=console
und verwendenc.log()
, um es zu verkürzen.Golfscript, 35
Wie es funktioniert
Im folgenden Beispiel lautet die Eingabe
9 3
.quelle
Delphi XE3 (176)
Wie es funktioniert.
Liest 2 Ganzzahlen, Münzen und Zwerge.
Subtrahiert die Differenz pro Zwerg.
Wenn der Rest Mod Zwerge> 0 ist es unmöglich.
Andernfalls erhalten Sie den gleichen Anteil pro Zwerg in einer Zwergenschleife von 1 bis 0 und drucken den Zwergenindex + den gleichen Anteil
Ungolfed
quelle
Mathematica 65
Die Funktion
g
erzeugt alle um eins ansteigenden Folgen der Länge m von 0 bis n und prüft, ob eine von ihnen zu m summiert. Bei Erfolg wird die Sequenz zurückgegeben. Andernfalls wird -1 zurückgegeben.Die Folgen ergeben sich aus
Partition
der Liste {0,1,2,3… m} in alle möglichen Unterlisten von n zusammenhängenden ganzen Zahlen.Es gibt natürlich effizientere Möglichkeiten, um den gleichen Effekt zu erzielen, aber die, die ich gefunden habe, erfordern mehr Code.
Beispiele
quelle
C 131
Ungolfed
Dies wird mit einer Warnung kompiliert, da main keinen Typ hat. Wenn dies nicht in den Golfregeln gültig ist, müsste ich fünf Zeichen hinzufügen.
quelle
Cobra - 198
Cobra Website
Erklärt:
Erforderlich, damit der Code ausgeführt werden kann
Nimmt Eingaben und speichert sie als
a
undb
Initialisiert die Ausgabeliste
l
und initialisiert das erforderliche Geldt
und die Anzahl der Münzen, die jedem Zwergenstapel hinzugefügt werden sollenn
Findet den niedrigstmöglichen Geldwert, der dazu führt, dass alle Zwerge eine zulässige Anzahl von Münzen auf ihrem Stapel haben
Legt fest, wie viele Münzen zu jedem Stapel hinzugefügt werden sollen, sodass das erforderliche Gesamtgeld> = dem insgesamt verfügbaren Geld entspricht
Füllt die Liste mit den unterschiedlich großen Geldhaufen
Gibt entweder
-1
oderl
abhängig davon aus, ob das insgesamt benötigte Geld dem insgesamt verfügbaren Geld entsprichtquelle
Perl 5 , 78 + 1 (-n) = 79 Bytes
Probieren Sie es online!
quelle
Python (
1009694):Eine schöne, runde Antwort.Nicht mehr, aber es ist jetzt kürzer.Ungolfed:
Ausgabe:
quelle