Auf der Website gibt es eine Frage, bei der die Division ohne Verwendung der Division implementiert werden soll.
In meinem Fall bitte ich Sie, dasselbe zu tun, aber nur Addition zu verwenden.
Dies bedeutet im Grunde: Addition ist der einzige zulässige Operator oder die einzige zulässige Funktion, die mit Zahlen arbeitet und andere Zahlen zurückgibt (dh keine Subtraktion, Multiplikation, Exponentiation, bitweise Inversion usw.). Dinge wie if-Anweisungen, Zuweisungs- und Vergleichsoperatoren und for-Schleifen sind weiterhin zulässig, vorausgesetzt, Sie verwenden in diesen weiterhin nur Addition.
Ihre Aufgabe ist es, eine Funktion zu erstellen divide(a, b)
, die zwei positive ganze Zahlen akzeptiert a
und b
das Ergebnis der a
Division durch b
und auf Null zurückgibt , jedoch Addition und keine anderen arithmetischen Operatoren und keine anderen Datenkonstrukte außer Zahlen verwendet.
Der Code, der gewinnt, ist derjenige, bei dem die wenigsten Additionsoperationen über den Satz von Eingaben ausgeführt werden müssen, wobei a
von 1
bis 200
und b
von 1
bis variiert a
.
Um dies zu verfolgen, können Sie eine alternative Version Ihres Codes erstellen, die jede Instanz von a + b
durch add(a, b)
und ein Programm ersetzt, add
um eine globale add_used
Variable zu erhöhen und die Summe der beiden Zahlen zurückzugeben.
quelle
Antworten:
Das Schreiben von Regeln ist schwierig, insbesondere enthalten diese Regeln Anreize, um jeden Preis Ergänzungen zu vermeiden.
Gibt es einen Preis für die lächerlichste Antwort?
JavaScript - 0 Ergänzungen
Jetzt mit Fallback-Methode, die eine gewaltige Lösung für größere
a
und größereb
und eine etwas kompaktere Struktur bietet, um die Zeichenbeschränkung nicht zu überschreiten. (Pfff, 30000 Zeichen. Was ist das? Twitter?) Noch keine Ergänzungen im gemessenen Bereich.quelle
a
1 bis 200, sondern sagt nur, dass die Punktzahl anhand der Gesamtzugaben aus diesem Bereich von Eingaben beurteilt wird. Es muss noch für ganze Zahlen über 200 funktionieren .Tcl, 0 Ergänzungen
Warum nicht Strings verwenden?
quelle
Append
ist ähnlich wie Addition, aber es ist nicht ganz dasselbe. IchJoined
liste mit einer ähnlichen Logik auf, die auf Zahlen basiert.Haskell 0 Ergänzungen, 29 Bytes
Dies definiert den Divisionsoperator (
/
) neu. Es funktioniert, indem eine Liste0
bis unendlich erstellt wird, in der jedes Element mehrmals wiederholtm
wird, und dann das n-te Element der Liste ausgewählt wird (unter Verwendung eines auf 0 basierenden Index).quelle
([0..]>>=replicate m)!!n
. es ist fast das gleicheVerwenden Sie diese Implementierung in Java, 199206 Ergänzungen
Es folgen die Hilfsfunktionen
quelle
Python - 0 Ergänzungen
Dies verwendet einen Iterator der Länge
a
und verbraucht ihn in Gruppen vonb
bisStopIteration
wird ausgelöst. Zu diesem Zeitpunktj
enthält das Ergebnis.quelle
Meine Lösung ist C / C ++ - Code und es werden viele Ergänzungen vorgenommen (200402), aber trotzdem ...
Und die Ausgabe ist:
quelle
Python, 320703 Ergänzungen
Wie immer eine Referenzantwort auf den letzten Platz. Dies fügt einfach
1
einen "Quotienten" undb
eine "Remultiplikations" -Variable hinzu, bis sie triffta
.Hier ist der Debugging-Code:
quelle
Tcl, 0 Ergänzungen.
Nun, ich musste einen Weg finden, der keine anderen Datenstrukturen verwendet, aber immer noch nicht das ist, was Sie wollen:
Verwendet die aktuelle Stapelgröße verschiedener grüner Threads.
quelle
C ++, 100201
quelle
a < b
das Ergebnis sein0
, kein Fehler.break
sollte seincontinue
.Mathematica 100201 Ergänzungen
Dies addiert den Divisor
b
zuc
(der bei 0 initialisiert wird), solange die laufende Summe kleiner oder gleich der Dividende ista
. Außerdem wird der aktuelle Wert vonc
an eine Liste angehängt.t
, ohne dass eine arithmetische Operation ausgeführt werden muss.Wenn die
While
Schleife endet, gibt die Funktion die Länge von aust
, die genau dem Quotienten der Ganzzahldivision entspricht. Somit ist die Anzahl der Ergänzungen für eine gegebenedivide[a,b]
genau dem Quotienten.100201 ist die Summe der Quotienten in der Tabelle 200 x 200. So oft
c
wurde um erhöhtb
. Es waren keine weiteren Ergänzungen erforderlich. Es wurden nur positive ganze Zahlen verwendet.Es ist effizienter, eine Nachschlagetabelle zu erstellen, nach der jede Suche fast sofort erfolgt.
Verwendungszweck
quelle
n++
Sache erklären ? Sieht nach Ergänzung für mich aus.n++
, was völlig unnötig war. Nach allem, was ich sagen kann (ich kenne TCL nicht), ist meine Lösung wie Ihre, speichert die Elemente jedoch in mehreren Sätzen und nicht in Zeichenfolgen.no other data constructs besides numbers
?R - 0 Addition
Verwendet R-Vektor-Recycling.
Die zweite Zeile erstellt eine Längenmatrix,
a
die von einem Längenvektorb
gefüllt wird, der bis zum Erreichen der Länge recycelt wirda
.Die dritte Zeile teilt die Matrix nach ihrem Wert und gibt die Länge des letzten Elements zurück (daher das Ergebnis der ganzzahligen Division von
a
durchb
).Das Auffüllen einer Matrix mit einem Vektor, dessen Länge nicht ein Vielfaches der Länge der Matrix ist, löst eine Warnung aus. Wenn wir jedoch die Warnung vorher unterdrücken (Zeile 1), funktioniert dies.
Um ein konkretes Beispiel zu geben, wenn wir 5 durch 3 teilen,
A
wird ein Vektor sein, der 1 2 3 1 2 enthält (dh 1 2 3, recycelt auf eine Länge von 5). Das Ergebnis der Aufteilungsoperation ist eine Liste mit dem ersten Element, das 1 1, das zweite 2 2 und das dritte 3 enthält (da es nur eine 3 in gibtA
). Das Ergebnis ist daher 1.quelle
In Ruby,
Ich kenne TCL nicht, aber ich vermute, dass dies der gleiche Ansatz ist wie die (erste) Antwort von @Johannes.
quelle
d = 'x' * 5
=> "xxxxx".a << b
Hängt Stringb
an String ana
. Hierd = "xxx"
undd << 'x'
führt zud = "xxxx"
.Java: 92 987 Ergänzungen
Ich benutze die binäre Rekursion
a/b == 2 * a/(2b) + maybe 1
. Dafür werden Divisor und Rest benötigt. Normalerweise würde es eine Subtraktion a% (2b) - b geben, aber das wird gelöst, indem der Rest als gehalten wird(rem, remNegative)
. Und2b = b+b
natürlich.quelle
quelle
C # - 0 Ergänzungen
Füllt eine Liste von Ganzzahlen mit
1..b
wiederholtena
Zeiten. Die Häufigkeit, mit derb
(mit Ausnahme des Auftretens mit einem Index>a
) angezeigt wird, ist das Ergebnis.Ich bin mir nicht sicher, ob die Liste nach den Regeln zulässig ist, aber ich sende dies im Geiste der anderen Beiträge, die die Regeln nicht allzu ernst nehmen (schließlich wird die Verwendung von Addition überhaupt nicht umgangen insgesamt herausfordern).
quelle
C - 85591 Ergänzungen
Auf geht's. Ich denke, das könnte optimal sein. Es verwendet eine Technik der "umgekehrten Division", bei der durch lange Multiplikation die größte Zahl
q
so aufgebaut wird, dassq * b <= a
nur+
und verwendet werden<=
. Es ist sehr sehr schnell.Anmerkungen:
s(a,b)
Gibt bei jeder Addition eine Zählervariable für Summea+b
und Inkremente zurückz
. Wenn entwedera
oderb
Null ist, wird die unnötige Addition vermieden.d(a,b,p)
ist eine rekursive Funktion zum Aufbau der internen Teile zum Vergleich und zur Addition. Es verwendet globale Variablenq
,u
undv
. Die maximale Rekursionstiefe ist die Anzahl der Bitsa
, und die Rekursion ist eher linear als ein Baum. (Beachten Sie dasb
in dieser Funktion ist das Originalb
multipliziert mit einer Potenz von 2.)divide(a,b)
gibt den Boden (a / b) nach Bedarf zurück.quelle
J, 0 Ergänzungen, 14 Bytes
Inspiriert von Alexei Kopylovs Antwort .
Verwendet überhaupt keine Mathematik:
quelle