Schreiben Sie ein Programm, das berechnet, ob ein eingegebener Geldwert als Ganzzahl durch eine eindeutige Kombination von Münzen und / oder Banknoten dargestellt werden kann. Dies bedeutet, dass dieselbe Münze / Banknote nur einmal verwendet werden kann.
Ihr Programm sollte einen Wert als Eingabe annehmen und kann eine Liste von Münz- / Notenwerten entweder über die Eingabe oder über die Entsprechung eines Arrays in Ihrer Sprache aufnehmen. Die Liste der Münzen / Banknoten sollte sich ändern können. Stellen Sie daher sicher, dass klar ist, wo dies definiert ist, wenn Sie eine Konstante verwenden.
Ihr Programm sollte jeweils einen Wahrheits- / Falschwert ausgeben.
Bitte beachten Sie, dass die Ausgabe der Liste der Münzen / Banknoten, aus denen der Wert besteht, nicht erforderlich ist.
BEISPIEL
Mit dem britischen Pfund (1,00 £ = 100 und 420,69 £ = 42069)
coins = [1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000]
Folgendes wird true ausgeben:
6 (1, 5)
15 (10, 5)
88 (1, 2, 5, 10, 20, 50)
512 (500, 10, 2)
7003 (5000, 2000, 2, 1)
Folgendes wird false ausgeben:
4
209
8889
4242424242
[ANYTHING ABOVE 8888]
ALTERNATIVE TESTDATEN (US-Dollar)
coins = [1, 5, 10, 25, 50, 100, 200, 500, 1000, 2000, 5000, 10000]
Viel Glück!
Antworten:
Brachylog 2 (TIO Nexus), 2 Bytes
Probieren Sie es online!
Nimmt die Liste der Münzen entweder über die Standardeingabe oder durch Voranstellen vor dem Start des Programms als Array-Literal (entweder funktioniert es, also liegt es an Ihnen, was Sie für "legitimer" halten; ersteres ist standardmäßig zulässig) PPCG-Regeln (letzteres ist in der Frage ausdrücklich erlaubt); und nimmt den zu erzeugenden Wert als Befehlszeilenargument.
Erläuterung
Dieses Programm verwendet Implementierungsdetails der Art und Weise, wie der Wrapper von TIO Nexus für Brachylog funktioniert. Insbesondere können Sie ein Befehlszeilenargument angeben, um Eingaben über die Ausgabe zu erhalten. (Dies war im ursprünglichen Design für Brachylog nicht vorgesehen. Sprachen werden jedoch durch ihre Implementierung in PPCG definiert. Wenn eine Implementierung folgt, die genau das tut, was ich brauche, kann ich sie daher nutzen.) Programm sieht so aus:
Als vollständiges Programm gibt es einen Booleschen Wert zurück.
true.
ob alle Behauptungen im Programm gleichzeitig erfüllt werden können oderfalse.
nicht.(Eine Erinnerung oder für Leute, die es noch nicht wissen: Brachylog 2 verwendet eine eigene Zeichenkodierung, die
⊇
ein einziges Byte lang ist.)quelle
08
2B
(Sie können die Codierungen hier nachschlagen) codiert . Der Grund, warum ich die spezielle Codierung nicht angegeben habe, ist, dass sie irrelevant ist. Alles, was wirklich zählt, ist, dass Brachylog nicht mehr als 256 eindeutige Zeichen verwendet, sodass jedes in einem einzelnen Byte dargestellt werden kann. Dies geschieht üblicherweise durch Golfsprachen, um den Code besser lesbar zu machen. Sie könnten stattdessen eine Codierung wie Codepage 437 verwenden, aber wenn Sie dies tun, könnte sie niemand lesen .05AB1E , 4 Bytes
Erläuterung:
Probieren Sie es online!
quelle
Mathematica, 25 Bytes
Reine Funktion, die ein Array von Münzwerten als erstes Argument und die Ziel-Ganzzahl als zweites Argument verwendet und
True
oder zurückgibtFalse
.quelle
Gelee, 6 Bytes
Probieren Sie es online!
-2 Bytes dank Leaky Nun
-13 Bytes dank Leaky Nun (lange Geschichte)
quelle
Retina ,
5231 BytesProbieren Sie es online! Übernimmt die Eingabe als durch Leerzeichen getrennte Liste von Münzen und Banknoten, gefolgt vom gewünschten Wert. Bearbeiten: Dank @Kobi, der meinen Code getestet hat, wurden 18 Bytes gespeichert. Erläuterung: Die ersten beiden Zeilen werden einfach von dezimal in unär umgewandelt. Die dritte Zeile erfasst dann die Liste der Münzen und Banknoten. Die Abwechslung ermöglicht es dem Motor, zurückzuverfolgen und bestimmte Münzen / Banknoten nicht zu erfassen. Die Bilanzgruppe vergleicht dann den Wert mit allen Suffixen der Erfassungsliste (unnötig, aber golferischer).
quelle
^((1+) )+(\2?(?<-2>)|){99}$
(34 Bytes, mit Begrenzung der Anzahl der Münzen) oder^((1+) |1+ )+(\2?(?<-2>))+$
(auch 34 Bytes) verwenden.(?<-2>\2?)
funktioniert, plus ein weiteres Byte von Ihrer zweiten Antwort, weil die?
nicht mehr erforderlich ist.Brachylog , 7 Bytes
Probieren Sie es online!
Wie es funktioniert
Einschließlich der Kombination, 9 Bytes
Probieren Sie es online!
quelle
Java (OpenJDK 8) , 125 Byte
Probieren Sie es online!
quelle
boolean f(int[]c,int n){for(int l=c.length;l-->0;n-=n<c[l]?0:c[l]);return n<1;}
(79 Byte). Mit Java 8 und seinen Lambdas kann es weiter auf 62 Bytes reduziert werden. Bezüglich Ihrer Antwort, wie sie aktuell ist,int l=c.length-1
ist die Verwendung vonl
anstelle vonl-1
ebenfalls kürzer.Prolog (SWI) , 46 Bytes
Probieren Sie es online!
Gabel meiner Python Antwort .
quelle
is
wie#=
, die Sie einige Leerzeichen entfernen lassen würde).JavaScript (ES6),
81696764 ByteNimmt die Liste der Münzen
c
und den Zielbetraga
in Curry-Syntax auf(c)(a)
. Rückgabe0
odertrue
.Testfälle
Code-Snippet anzeigen
quelle
Haskell , 28 Bytes
Die Operatorfunktion
(#)
nimmt eine Ganzzahl und eine Liste von Ganzzahlen (oder allgemeiner einen beliebigenTraversable
Container mit Zahlen) und gibt a zurückBool
.Verwenden Sie als
6#[1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000]
.Probieren Sie es online!
Wie es funktioniert
c
ist der gewünschte Wert undl
die Liste der Münzwerte.mapM(:[0])l
ordnet(:[0])
überl
, paart jeden Wert mit 0 und konstruiert dann das kartesische Produkt, wobei Listen angegeben werden, in denen jedes Element entweder den entsprechenden Wert inl
oder 0 hat.sum<$>
summiert jede Kombination undelem c$
prüft, ob siec
in der Ergebnisliste enthalten ist.quelle
R
8883 Bytes-5 Bytes dank @Jarko Dubbeldam
Gibt eine anonyme Funktion zurück. Es generiert alle möglichen Kombinationen von Münzen (mit Hilfe
expand.grid
von Paaren vonT,F
) und prüft, ob die Werte vorhanden sind.k
ist eine Münze, dac
es sich bei R um ein reserviertes Wort handelt. Kann mehrere Werte gleichzeitig prüfen.Probieren Sie es online!
quelle
c(T,F)
durch!0:1
undrep(list(!0:1),length(k))
durch ersetzenlapply(k,function(x)!0:1)
Map(function(x)!0:1,k)
Japt , 7 Bytes
Probieren Sie es online! Ausgaben
0
für Falsy, eine positive Ganzzahl für Truthy.Erläuterung
quelle
Python 3 , 52 Bytes
5 Bytes dank ovs.
Probieren Sie es online!
quelle
Ruby , 39 Bytes
Gibt
nil
den falschen Wert und den kleinsten Münzwert in der Liste zurück, der die Zahl als wahr darstellt (alle Zahlen sind in Ruby wahr).Aber Sie passen, dass dieser Algorithmus irrsinnig langsam ist, mit
O(C!)
Zeitkomplexität, woC
die Länge der Münze Liste. Es endet schließlich, aber die meisten Testfälle laufen bei den meisten Online-Dolmetschern sogar ausf(UK_POUND, 5)
.Hier ist eine 41-Byte-Version, die durch Hinzufügen einer zusätzlichen Endebedingung viel schneller beendet wird und eine Zeitüberschreitung erheblich erschwert
Probieren Sie es online!
quelle
Bash + GNU-Dienstprogramme,
5639Eingabebezeichnungsliste (unsortiert) wird als durch Kommas getrennte Liste angegeben. Eingabeliste und Wert werden als Befehlszeilenparameter angegeben.
Ausgabe in Form des Shell-Returncodes. Überprüfen Sie mit,
echo $?
nachdem Sie das Skript ausgeführt haben.0
bedeutet wahr,1
bedeutet falsch.Probieren Sie es online aus .
printf %$2s
gibt eine Folge vonvalue
Leerzeichen aus"^ {${1//,/\}? {}}?$"
ist eine Shell-Erweiterung, die die Nennwertliste zu einem regulären Ausdruck erweitert^ {1}? {2}? {5}? {10}? ... $
. Es stellt sich heraus, dass dieegrep
Regex-Engine intelligent genug ist, um mit dieser übereinzustimmen, unabhängig davon, in welcher Reihenfolge sich die Nennwerte befindenegrep
prüft, ob die Zeichenkette mit dem regulären Ausdruck übereinstimmtquelle
C 66 Bytes
Sehen Sie es hier arbeiten .
C 53 Bytes
Diese Variante verwendet das Coin-Array, das den Zweck dieses Problems zunichte macht, da es sich um eine einfache Subtraktion handelt.
Das erste Argument ist das Münzfeld, das zweite die Münzzahl und das dritte der Wert.
C 48 Bytes
Eine Alternative zur vorherigen Variante. Es wird davon ausgegangen, dass das Münzarray umgekehrt und nullterminiert werden kann.
quelle
Pyth , 6 Bytes
Testsuite.
quelle
CJam ,
1817 BytesProbieren Sie es online!
Erläuterung
quelle
C (gcc) 91 Bytes
Probieren Sie es online!
quelle
PHP, 70 Bytes
Gibt 1 für wahr und nichts für falsch aus
Probieren Sie es online!
quelle
Oktave, 39 Bytes
Eine anonyme Funktion, die ein Array von Münzwerten als erstes Argument und die Ziel-Ganzzahl als zweites Argument verwendet und true oder false zurückgibt.
Probieren Sie es online!
quelle
Mathematica, 42 Bytes
Eingang
quelle