Eine Tasche , auch Multiset genannt, ist eine ungeordnete Sammlung. Sie können es einen Satz nennen, der Duplikate zulässt, oder eine Liste (oder ein Array), die nicht sortiert / indiziert sind. In dieser Herausforderung werden Sie gebeten, Taschenoperationen durchzuführen: Addition, Differenz, Multiplikation, Division, Zählung und Gleichheitstest.
Operationen
Die angegebenen Vorgänge sind möglicherweise nicht konventionell.
- Außerdem werden zwei Beutel zu einem zusammengefasst, wodurch die Gesamtzahl der einzelnen Werte erhalten bleibt
[1,2,2,3] + [1,2,4] = [1,1,2,2,2,3,4]
- Die Differenz entfernt aus einem Beutel jedes Element eines anderen Beutels oder bewirkt nichts, wenn kein solches Element vorhanden ist
[1,2,2,4] - [1,2] = [2,4]
[1,2,3] - [2,4] = [1,3]
- Multiplikation multipliziert jedes Element in der Tasche.
[1,2,3,3,4] * 3 = [1,1,1,2,2,2,3,3,3,3,3,3,4,4,4]
2 * [1,3] = [1,1,3,3]
- Eine Teilung ist ungewöhnlich: Jeweils n gleiche Elemente werden in n gleiche neue Beutel gegeben, Elemente, die keine n-Gruppe bilden können, verbleiben im Beutel. Geben Sie eine der n neuen Taschen zurück.
[1,1,2,2,2] / 2 = [1,2]
[1,2,2,3,3,3] / 3 = [3]
- Beim Zählen wird gezählt, wie viele Teilerbeutel aus dem Dividendenbeutel hergestellt werden können
[1,1,2,2,2,2,3,3,3] c [1,2,3] = 2
- gleichheitstest prüft ob zwei beutel die gleiche nummer von jedem element haben
[1,2,2,3] == [3,2,1,2] = truthy
[1,2,3] == [1,2,2,3] = falsy
(kann auch dafür verwendet werden=
)
Wenn Sie für die Operatoren eigene Symbole verwenden, geben Sie diese bitte an.
Formate
Taschen werden als Listen des Formulars angezeigt [1,1,2,3,4]
. Sie können jede andere als quadratische Klammer verwenden oder sogar Anführungszeichen oder gar nichts. Die Elemente werden int
für die Zwecke dieser Frage (mathematisch, nicht notwendigerweise ) ganze Zahlen sein . Taschen müssen nicht sortiert werden.
Das Eingabeformat ist zwei Beutel oder ein Beutel und eine Ganzzahl mit einem Operator. Sie können Ihr eigenes Format angeben, solange es diese drei enthält.
Das Ausgabeformat sollte ein einzelner Beutel desselben Formats sein.
Regeln
- Sie dürfen keine integrierten Funktionen, Operationen oder Bibliotheken (einschließlich der Standardbibliothek) verwenden, die diese bereits implementieren. Es ist jedoch in Ordnung, die Listenverkettung und -vervielfachung zu verwenden, da sie per Definition Listenoperationen sind und keine Bag-Operationen (die im Grunde das Gleiche tun).
- Es gelten Standardlücken
- kürzeste Antwort gewinnt
Testfälle
[1,2,2,3] + [1,2,4]
[1,1,2,2,2,3,4]
[1,2,2,4] - [1,2]
[2,4]
[1,2,3] - [2,4]
[1,3]
[1,2,3,3,4] * 3
[1,1,1,2,2,2,3,3,3,3,3,3,4,4,4]
2 * [1,3]
[1,1,3,3]
[1,1,2,2,2] / 2
[1,2]
[1,2,2,3,3,3] / 3
[3]
[1,1,2,2,2,2,3,3,3] c [1,2,3]
2
[3,2,1,2] == [1,2,2,3]
truthy
[1,2,3] == [1,2,2,3]
falsy
quelle
Antworten:
05AB1E,
9287838277 BytesNach Operation aufteilen
Erläuterung
Zusatz
Legen Sie eine Tüte in eine andere und drücken Sie sie zu einer Tüte flach.
Multiplikation
Stellen Sie sicher, dass sich die Nummer oben auf dem Stapel befindet. Nenne das X.
Dupliziere den Beutel X-mal und verbinde ihn zu einem Beutel.
Anzahl
Zählen Sie für jedes Element im Divisionsbeutel die Anzahl der Vorkommen im Dividendenbeutel.
Die Mindestanzahl ist die Anzahl der Taschen, die wir herstellen können.
Gleichberechtigung
Sortieren Sie beide Beutel und prüfen Sie, ob sie gleich sind.
Teilung
Zählen Sie, wie oft jedes einzelne Element im Beutel vorkommt.
Kommt es mindestens so oft vor wie der Divisor. Bewahren Sie (nr_of_copies_total // divisor) Kopien in der Tasche auf.
Unterschied
Sortieren Sie jedes Element im Subtrahend vor dem Minuend.
Wenn der aktuelle Subtrahend gleich dem ersten Element im Minuend ist, entfernen Sie ihn aus dem Minuend.
quelle
APL (155)
Dies definiert einen Operator
∆
'bag', der Bag-Operationen für gegebene Funktionen definiert. Dh+∆
wäre zusätzlich. Dann liest es eine Zeile von der Tastatur und wertet sie als APL-Ausdruck aus.Die Funktionen sind:
+∆
zusätzlich-∆
Subtraktion×∆
Multiplikation÷∆
, Teilung⊂∆
, Zählen≡∆
, Äquivalenz (obwohl aufgrund des Golfspiels jede nicht erkannte Funktion die Äquivalenz bewirkt)Erläuterung:
∆←{
...}
: einen Operator definieren∆
:O←⍺⍺
: Speichern Sie die angegebene Funktion inO
( funktioniert⎕CR
nicht⍺⍺
direkt mit)O←⎕CR'O'
: Ermittelt die String-Darstellung dieser Funktion'+'=O
...:
: zusätzlich⍺,⍵
: Verbinden Sie die beiden Listen miteinanderR[⍋R←
...]
: und sortiere das Ergebnis'-'=O:
: für die Subtraktion,⍺{
...}⍵
: führe die folgende rekursive Funktion aus:⍵≡⍬:⍺
: Wenn der Subtrahend leer ist, gib das Minuend zurück⍺/⍨(⍳⍴⍺)≢⍺⍳⊃⍵∇1↓⍵
: andernfalls entferne das erste Element des Subtrahends sowohl vom Subtrahend als auch vom Minuend und versuche es erneut(⍬=⍴⍵)∧K←'×'=O:
für die Multiplikation, und wenn das richtige Argument kein Sack ist:⍵/⍺
: repliziere jedes Element im linken Argument mit dem rechten ArgumentK:
: ... und wenn das richtige Argument ist eine Tasche:⍺/⍵
: repliziere jedes Element im rechten Argument mit dem linken Argument (dies ist so, dass die Multiplikation kommutativ ist)'÷'=O:
: für die Teilung,⍵≤⍺∘.+⍺
: sehen, welche Elemente in ⍺ mindestens ⍵ Mal vorkommen,⍺/⍨
: Wählen Sie diese aus ⍺,∪
: und entferne alle Duplikate aus dieser Liste'⊂'=O:
: zum Zählen,⍵{
...}⍺
: führe die folgende rekursive Funktion aus:(∪⍺)≢∪⍵:0
: Wenn eine Liste Elemente enthält, die die andere nicht enthält, ist das Ergebnis 01+⍺∇⍵-∆⍺
: Andernfalls subtrahieren Sie die Dividende vom Divisor, versuchen Sie es erneut und erhöhen Sie das Ergebnis.⋄
: Wenn keine der oben genannten Bedingungen erfüllt ist, führen Sie den Äquivalenztest durch:⍺[⍋⍺]≡⍵[⍋⍵]
: Beide Listen sortieren und prüfen, ob sie gleich sind⎕
: Liest einen Ausdruck von der Tastatur, wertet ihn aus und gibt das Ergebnis aus.Testfälle:
quelle
[2,2,2,2,2,2]/3
die etwas geben sollte[2,2]
, aber Ihre scheint etwas zu geben[2]
.∆
, wird der Benutzer in die native REPL von APL verschoben, die∆
jetzt gültig ist. Ich denke, Sie können einige Bytes sparen, indem Sie die Subtraktion bis zum Ende verschieben, da dies die einzige ist, für die zwei Zeilen erforderlich sind.⎕CR
Verwenden Sie stattdessen , um*
count zu symbolisieren, und tun SieO←⍺⍺2
dann2=O:
für plus,1=O
für mult,0=O:
für equiv,7<O:
für count und0<O:
für div (mit impliziertem0>O:
Wert für subtr).JavaScript (ES6), 260 Byte
Nimmt 3 Parameter auf. Der erste Parameter ist ein Array, der zweite ein Operator, der dritte ist vom Operator abhängig. Taschen müssen nicht negative ganze Zahlen enthalten.
Ungolfed:
quelle
Oktave,
253244226 BytesDiese Funktion muss sich in einer Datei befinden. Um die Funktion in das Befehlsfenster zu schreiben, müssen Sie
endfunction
oder verwendenend
.Danke an Luis Mendo für das Speichern von 18 Bytes.
Die Operationen sind:
Anwendungsbeispiel:
Ungolfed:
quelle
Mathematica,
387347300284 BytesEtwas entgolfet (alias alte Version), hatte keine volle Unterstützung für Gleichheitstests (zurückgegebene wahrheitsgemäße Werte, aber für nicht passende Taschen unbewertet gelassen).
Implementiert den erforderlichen Datentyp mit head
b
.Zunächst
b
wird definiert, zu seinOrderless
. Jedes Objekt, das mit head an den Kernel übergebenb
wird, sortiert seine Argumente automatisch. Selbst wenn diesb[3,2,1]
eingegeben wird, sieht der Bewerter niemals etwas anderes alsb[1,2,3]
.Addition wird trivial als Verbinden der Elemente definiert.
Eine spezielle Regel für die Differenz von zwei Beuteln ist definiert (unten erklärt). Die Vorgängerversion hatte ein Hilfssymbol für Formausdrücke
-bag
.Dann wird die Multiplikation (solange
n
es sich um eine positive ganze Zahl handelt) rekursiv definiert,n*b[...] = b[...] + (n-1)*b[...]
was sich schließlich zu einer einfachen Summe reduziert.Die Sonderregel für
b[...] - b[...]
zählt die Anzahl der verschiedenen Elemente in der Summe der Beutel und subtrahiert den zu subtrahierenden Beutel zweimal von diesem Ergebnis. Einfacher erklärt:Oben ist eine Liste von
Keys->Values
.KeyValueMap
mitTable
erstellt Listen von jedemKey
Value
Mal. (Es gibt auch eineMax[...,0]
Möglichkeit, negative Längentabellen nicht zu erstellen). Dies kommt heraus als:Das ist abgeflacht und der Kopf
List
wird durch ersetztb
.Die Division durch ganze Zahlen ist in den verwendeten Funktionen etwas ähnlich, es ist einfach die durchgehende Division der Elementzählung durch die ganze Zahl.
Division durch Mengen oder Zählung habe ich seit der ursprünglichen Implementierung geändert. Es wird nun rekursiv wie folgt vorgegangen. Sprich, teilen wir Beutel
b1
durchb2
(die in der golfed Code sindc
unda
jeweils. Wenn(b1-b2) + b2 == b1
, dann 1 addieren und daß das Ergebnis der Teilung hinzuzufügen(b1-b2)/b2
. Falls nicht, geben 0 zurück und die Rekursion verlassen.Wenn Taschen passen, built-in
==
gibtTrue
. Die letzte Zeile erzwingt ein,False
wenn sie dies nicht tun.Testfälle:
quelle
Q - 219 Zeichen
a
zur Additions
für Differenz (Subtraktion),m
zur Multiplikation,d
zur Division,c
zur Zählung,e
zur Gleichheit.Der Additionsalgorithmus ist der offensichtliche, er fügt nur die Säcke zusammen.
Die Subtraktionsfunktion indiziert im Eingabebeutel (als Array dargestellt) den gesamten Indexbereich, mit Ausnahme der ersten
n
Indizes jeder durch Gleichheit zu jedem Element in gebildeten Äquivalenzklassey
, wobein
die Anzahl der Kopien dieses Vertreters in angegeben isty
. Der Umgang mit möglichen Duplikateny
macht dies zu einem echten Funktionsmonster.Die Multiplikationsfunktion nimmt
x
Werte von jedemy
y
Wert . In dem Fall, dass es sich um einen einzelnen Wert handelt, werden diese Werte anstelle eines Arrays nur repliziert.Die Divisionsfunktion erzeugt die Werte, deren Anzahl im Array größer als ist
y
, und entfernt dann Duplikate.Die Zählfunktion berechnet die Anzahl der Elemente in
y
und gibt dann das Minimum zurück.Zwei Taschen sind gleich, wenn ihre sortierten Array-Darstellungen gleich sind.
quelle
Ruby, Klassendefinitionsantwort,
323291 BytesWollte meistens nur das machen
Bag
einer echten Klasse machen, weil Ruby flexibel mit Klassen umgehen kann. In diesem Fall erbt es von,Array
weil es kürzer ist, als ein internes Array zu initialisieren und sich mit den anderen Dingen zu befassen.Ich werde wahrscheinlich eine ernstere Antwort zum Golfen geben, die eine Funktion verwendet, um die Operationen von morgen zu erledigen. Ich bin sehr müde und hatte zu viel Spaß damit
, obwohl ich mich mit der Definition derNumerikklasse herumschlagen mussteNumber * Bag
, umrichtig arbeiten zu können.LOBEN SIE DIE COERCE-FUNKTION, UM ES ZU MACHEN, DASS ICH DIE NUMERIKKLASSEN-DEFINITIONEN NICHT MESSEN MUSSTEProbieren Sie es online! (Whitespace spielt in Ruby keine Rolle, daher ist der Code dort etwas ungolfed.)
quelle
Ruby, 201 Bytes
Wie in meiner anderen Antwort versprochen, ist hier eine, die Funktionen verwendet, anstatt eine neue Klasse zu erstellen. Ich bin so kurz davor, die 200-Byte-Marke zu überschreiten ... Probieren Sie es online aus
Dies verwendet die gleichen Opcodes wie @Neil in seiner JavaScript-Antwort und die gleiche Reihenfolge der Argumente (lhs, opcode, rhs).
Der Code:
quelle
C ++,
555551 Bytes(Zeilenumbrüche zur besseren Lesbarkeit hinzugefügt - nur die erste neue Zeile wird benötigt und gezählt)
Erläuterung
Wir implementieren unsere Tasche als Karte von (Wert, Anzahl). Die Grundoperationen können durch Manipulieren der Zählwerte implementiert werden; Subtraktion und Ganzzahldivision müssen auch alle Elemente entfernen, deren Anzahl Null erreicht, damit dies
std::map::operator==
als Gleichheitstest funktioniert.Der folgende erweiterte Code ist eine generische Version des oben genannten Codes, jedoch weitaus weniger vorteilhaft: Wir verwenden einen separaten Code, um alle Nullzählwerte
s()
herauszufiltern, und implementierenconst
Operationen in Form von Zuweisungsoperatoren auf idiomatische C ++ - Weise. Wir verwenden auchs()
, um die Multiplikation durch0
Rückgabe eines wirklich leeren Beutels (getestet durch Hinzufügen(B{1}*0 != B{})
vonmain()
) durchzuführen. Das Original besteht diesen Test nicht und es ist nicht klar, ob es eine Anforderung ist.Tests
quelle
Python 2.7 - 447B (Dateigröße)
Dies ist mein erster Versuch bei Codegolf, ich hoffe, dass er zufriedenstellt. Ich brauchte 2h (Aber ich bin immer noch ein Anfänger in Python)
Edit: Danke an "Kevin Lau - nicht Kenny" für diesen Hinweis:
Bearbeiten: Zusätzlich habe ich Platz gespart, indem ich Funktionen durch Lambda und neue Zeilen und Einrückungen durch mehr Semikolons ersetzt habe.
Code:
prüft:
Ausgabe:
Ich könnte es ein anderes Mal versuchen, wenn ich es als Basis setze. Edit: Vielleicht probiere ich es mal nur mit Funktionen.
quelle
self
- so etwas istS
genauso gut. Ein weiterer Trick ist, dass die integriertesorted
Funktion genau das tut, was Sie von Ihrer neuen Funktions
erwarten, sodass Sie auf die Funktionsdefinition verzichten können (da Sie sie nur einmal verwenden). Sie brauchen__radd__
es nie, weil Sie niemals Taschen mit anderen als Taschen hinzufügen, obwohl Sie es immer noch brauchen__rmul__
. Schließlich brauchen Sie nur ein Leerzeichen anstelle von vier, was Ihre Byteanzahl um einiges verringert