Problem:
Ihr Ziel ist es zwei Eingangsnummern hinzuzufügen , ohne eine der folgenden mathematischen Operatoren zu verwenden: +,-,*,/
.
Darüber hinaus können Sie keine integrierten Funktionen verwenden, die diese mathematischen Operatoren ersetzen sollen.
Wertung:
Der kleinste Code (in Bytes) gewinnt.
Aktualisieren
Die meisten Programme, die ich gesehen habe, verknüpfen entweder zwei Arrays, die ihre Nummern enthalten, oder machen
first number
aus einem Zeichen, fügensecond number
Zeichen hinzu und zählen sie dann alle.Kürzester Array-Zähler: APL mit 8 Zeichen von Tobia
Kürzeste Array-Verkettung: Golfscript mit 4 Zeichen von Doorknob
Kürzeste logarithmische Lösung: TI-89 Basic mit 19 Zeichen von Quincunx
Integrationslösung: Mathematica mit 45 Zeichen, von Michael Stern
Am coolsten, meiner Meinung nach: bitweise Operatoren in Javascript, von Dave
quelle
Antworten:
Smalltalk,
2113Alle folgenden Befehle funktionieren nur mit positiven ganzen Zahlen. Siehe die andere Smalltalk- Antwort für eine ernsthafte.
Version 1
Verschieben zu einer großen Ganzzahl und Abfragen des hohen Bitindex (schlecht, die ST-Indizierung basiert auf 1, daher benötige ich eine zusätzliche Rechtsverschiebung):
Version 2
Ähnlich und sogar etwas kürzer (aufgrund der Smalltalk-Vorrangregeln und ohne Verschiebung nach rechts):
version3
eine weitere Variation des Themas "Sammlungsverkettung - Fragen nach Größe"
mit zwei Zahlen a und b,
Mit Intervals als Sammlung erhalten wir eine speicherfreundlichere Version ;-) in 21 Zeichen:
Nicht zu empfehlen für starkes Knirschen.
version4
Wenn Sie zu Ihrer Unterhaltung Zeit gegen Speicher eintauschen möchten, versuchen Sie Folgendes:
das ist normalerweise genau genug (aber keine garantie ;-)))
version5
Schreiben Sie in eine Datei und fragen Sie sie nach ihrer Größe
quelle
Javascript (25)
Dies fügt zwei Variablen x und y hinzu, wobei nur bitweise Operationen verwendet werden, und speichert das Ergebnis in x.
Dies funktioniert auch mit negativen Zahlen.
quelle
while(y)x^=y,y=(y&x^y)<<1
!for(;y;y=(y&x^y)<<1)x^=y
1 Byte kürzer :)C - 38 Bytes
Ich schummle hier ein bisschen, sagte der OP, keine mathematischen Operatoren zu verwenden.
Das
*
imprintf()
Format bedeutet, dass die zum Drucken des Zeichens verwendete Feldbreite einem Argument vonprintf()
in diesem Fall 3 und 4 entnommen wird. Der Rückgabewert vonprintf()
ist die Anzahl der gedruckten Zeichen. Es werden also' '
insgesamt 3 + 4 Zeichen gedruckt, wobei eines mit einer Feldbreite von 3 und eines mit einer Feldbreite von 4 gedruckt wird .Der Rückgabewert sind die im
printf()
Anruf hinzugefügten Nummern .quelle
main
. Auch wenn Sie nicht, was Sie drucken, können Sie ersetzen' '
mit0
und lassen Sie die zweite.Python - 49 Bytes
Annahme der Eingabe durch Platzierung in Variablen
x
undy
.Diese 61-Byte- Lösung ist ein vollständiges Programm:
Da Sie die Exponentiation nicht verboten haben, musste ich dies posten. Wenn Sie den Ausdruck mit den Eigenschaften von Logarithmen vereinfachen, erhalten Sie einfach
print input() + input()
.Dies unterstützt sowohl negative als auch Gleitkommazahlen.
Hinweis: Ich habe den Ratschlägen von Gnibbler gefolgt und diese Antwort in drei Teile geteilt. Dies ist die Mathematica-Lösung und dies ist die TI-89 Basic-Lösung .
quelle
E^y
. Die VerwendungLog[Log[(E^E^x)^E^y]]
scheint gut zu funktionieren.JavaScript [25 Bytes]
quelle
Mathematica, 21 Bytes
In Mathematica gibt es eine Reihe von Möglichkeiten, dies zu tun. Erstens: Verwenden Sie die Funktion Akkumulieren und werfen Sie alles außer der endgültigen Zahl in die Ausgabe. Wie bei meiner anderen unten stehenden Lösung gehe ich davon aus, dass sich die eingegebenen Zahlen in den Variablen
a
und befindenb
. 21 Bytes.Mehr Spaß, obwohl es 45 Zeichen sind, verwenden Sie die Zahlen, um eine Linie zu definieren und darunter zu integrieren.
Als Bonus funktionieren beide Lösungen für alle komplexen Zahlen, nicht nur für positive ganze Zahlen, wie dies bei einigen anderen Lösungen der Fall zu sein scheint.
quelle
function _(){return array_sum(func_get_args());}
. Ich musste es abbauen, weil ich keinen kurzen Weg finden konnte, es zu "reparieren".array_sum()
von PHP, was genau dasselbe bewirkt.GolfScript,
64 Zeichen / ByteEingabe in Form von
10, 5
(=>15
).Das
+
ist Array Verkettung, nicht hinaus.Wie es funktioniert,
,
wird verwendet, um ein Array mit der Länge der Zahl (0,1,...,n-2,n-1
) zu erstellen . Dies geschieht für beide Nummern, dann werden die Arrays verkettet.,
wird erneut für einen anderen Zweck verwendet, um die Länge des resultierenden Arrays zu ermitteln.Nun, hier ist der Trick . Ich mag dieses wirklich, weil es das Eingabeformat missbraucht. Es sieht so aus, als würde nur ein Array eingegeben, aber da die Eingabe als GolfScript-Code ausgeführt wird, ist die erste
,
für mich bereits erledigt! (Die alte 6-stellige Version hatte ein~,\,+,
Eingabeformat10 5
, bei dem ich 2 Zeichen weggelassen habe, indem ich das\,
(Swap-Array) weggelassen habe).Alte Version (12) :
Erzeugt eine Funktion
f
.Die
*
und+
sind String-Wiederholungen bzw. Verkettungen, keine arithmetischen Funktionen.Erläuterung:
n
Erstellt eine Zeichenfolge mit einem Zeichen (eine neue Zeile). Das wird danna
mal wiederholt , dann wird das selbe mit gemachtb
. Die Zeichenfolgen werden verkettet und dann,
für die Zeichenfolgenlänge verwendet.quelle
C,
2927 BytesVerwenden der Zeigerarithmetik:
x
ist als Zeiger definiert, der Aufrufer sollte jedoch eine Ganzzahl übergeben.Ein anonymer Benutzer schlug Folgendes vor - ebenfalls 27 Byte, aber die Parameter sind Ganzzahlen:
quelle
int
s auf den heute üblichen Systemenint
mit 32 Bit und Zeigern mit 64 Bit übergeben werden. Der zweite vermeidet dieses Problem.Brainf * ck,
936Dies funktioniert ohne einfache Addition. es geht durch und legt eine Spur von 1 und zählt sie dann auf
Hinweis: Die
+
und-
sind nur einzelne Inkremente und ohne sie kann in brainf * ck nichts unternommen werden. Sie sind nicht wirklich Addition / Subtraktion, also glaube ich, dass dies immer noch zählt.quelle
J (6)
Sie haben nicht gesagt, dass wir die succ-Funktion nicht verwenden könnten:
Verwendungszweck:
Es werden nur 9 Wiederholungen von
>:
8 ausgeführt.Die Liste Verkettung Ansatz funktioniert auch:
#@,&(#&0)
. Und - ich weiß, es verstößt gegen die Regeln - ich kann diese Antwort nicht ohne die einfachste Lösung gehen lassen:*&.^
(Multiplikation unter Potenzierung).quelle
Nachschrift, 41
Wir definieren die Funktion mit dem Ausdruck 41 Bytes lang als:
Dann nennen wir es zB:
Welches gibt
Im Gegensatz zu den meisten Mitbewerbern kann es problemlos mit Negativen und Posen umgehen :-)
quelle
Bash, 20 Zeichen
quelle
Smalltalk (jetzt ernst),
123 118105 (*)Tut mir leid, dass du zweimal geantwortet hast, aber halte dies für eine ernsthafte Antwort, während die andere eher humorvoll war. Das Folgende wird tatsächlich genau zu diesem Zeitpunkt in allen unseren Maschinen ausgeführt (allerdings in Hardware). Seltsam, dass es niemand anderem einfiel ...
Durch Kombinieren von zwei Halbaddierern und paralleles Ausführen aller Bits der Wörter erhalten wir eine lesbare Version (Eingaben a, b; Ausgabe in s):
Die Schleife dient zur Übertragung von Überträgen. Die Masken stellen sicher, dass vorzeichenbehaftete Ganzzahlen behandelt werden (ohne sie sind nur vorzeichenlose Zahlen möglich). Sie definieren auch die Wortlänge, die oben für den 32-Bit-Betrieb angegeben ist. Wenn Sie eine 68-Bit-Addition bevorzugen, ändern Sie diese in 16rFFFFFFFFFFFFFFFF.
Golf-Version (123 Zeichen) (vermeidet die lange Maske durch Wiederverwendung in m):
(*) Durch die Verwendung von -1 anstelle von 16rFFFFFFFF können wir besser Golf spielen, aber der Code funktioniert nicht mehr für Zahlen mit willkürlicher Genauigkeit, sondern nur für smallIntegers mit Maschinenwortgröße (die Darstellung für largeIntegers ist im Ansi-Standard nicht definiert):
Dies reduziert die Codegröße auf 105 Zeichen.
quelle
APL, 8 und 12
Nichts neues hier, die Array-Zählversion:
und das Protokoll ○ Protokollversion:
Ich dachte nur, dass sie in APL cool aussehen!
quelle
≢∘∊⍳¨
sed, 359 bytes (ohne die ausgefallene formatierung)
Entschuldigen Sie die verspätete Antwort und wahrscheinlich die mit Abstand längste hier. Aber ich wollte sehen, ob das mit sed möglich ist:
Dies ist vergleichbar mit https://codegolf.stackexchange.com/a/38087/11259 , bei dem Zahlen einfach in einer Zeichenfolge inkrementiert werden. Stattdessen werden die Inkrementierungsoperationen in einer Schleife ausgeführt.
Die Eingabe erfolgt aus STDIN in der Form "x y". Das wird zuerst in "x: 0 :: y:" umgewandelt. Dann erhöhen wir alle Zahlen, die nach ":" stehen, bis wir "x: x: :( x + y):" erhalten. Dann kehren wir endlich zurück (x + y).
Ausgabe
Beachten Sie, dass dies nur für die natürlichen Zahlen funktioniert. Es funktioniert jedoch (zumindest theoretisch) für beliebig große ganze Zahlen. Da wir x-Inkrementierungsoperationen für y ausführen, kann die Reihenfolge einen großen Unterschied für die Geschwindigkeit bedeuten: x <y ist schneller als x> y.
quelle
Strich , 18 Bytes
Benötigt GNU-Zeit 1.7 oder höher. Die Ausgabe erfolgt nach STDERR.
Probieren Sie es online!
Beachten Sie, dass dies in B ash nicht funktioniert , da der eingebaute Zeitbefehl von der GNU-Zeit abweicht.
\time
Kann auf Kosten eines zusätzlichen Bytes verwendet werdentime
, um Bash zur Verwendung des externen Befehls zu zwingen.quelle
sleep -3
ich durch das Einfügen von Zufallszahlen meine Programme beschleunigen könnte. Was für ein Reinfall.\time
sollte auch in Bash funktionieren.Javascript (67)
Es ist wahrscheinlich viel besser
quelle
joins
unnötig sind. DerArray
Konstrukteur erstellt eine Reihe vonundefineds
, die gezählt werden können:a=Array;p=parseInt;r=prompt;alert(a(p(r())).concat(a(p(r()))).length)
Number
Konstruktor speichert 2 Zeichen überparseInt
alert
, wird die Ausgabe immer noch an die Konsole gesendet , aber die Antwort macht ein bisschen weniger Spaß. Sie können dieprompt
Variable auch anstelle von alert wiederverwenden (der Konstruktor alarmiert das Argument mit der Eingabeaufforderung). Wie auch immer, nette Antwort!Rubin, 18 Zeichen
Und zwei weitere ausführliche Varianten, 29 Zeichen
Eine andere Version, 32 Zeichen
quelle
On the fly Code-Generierung
Ja, es gibt tatsächlich eine Addition, aber nicht den Operator + und nicht einmal eine Framework-Funktion, die Addition ausführt. Stattdessen generieren wir eine Methode im laufenden Betrieb, die Addition ausführt.
quelle
Ruby 39
quelle
R 36
Dabei wird
rep
ein Vektor vonx
Einsen gefolgt vony
Zweien erstellt.quelle
length(rep(1:2,scan()))
TI Basic 89 - 19 Bytes
Führen Sie dies in Ihrem TI-89 aus (Startbildschirm oder Programmier-App):
Hierbei werden
x+y
wie in dieser Lösung Protokollregeln zum Berechnen verwendet . Als Bonus funktioniert es für Dezimal- und Ganzzahlen. Es funktioniert für alle reellen Zahlen. Wenn die Logarithmusregeln für komplexe Exponenten noch gültig sind, funktioniert dies auch für komplexe Zahlen. Mein Rechner spuckt jedoch Müll aus, wenn ich versuche, komplexe Exponenten einzufügen.quelle
ln
1 Byte in TI Basic? Sie können die schließenden Klammern auch löschen und auf 15 Byte reduzieren.Vielen Dank an Michael Stern, der mir Mathematica-Notation beigebracht hat .
Mathematica -
2120 BytesDies verwendet den gleichen Ansatz wie diese Lösung , wird jedoch in Mathematica verwendet, um sie zu verkürzen. Dies funktioniert für negative und Gleitkommazahlen sowie für ganze Zahlen in
x
undy
.Die Vereinfachung des Ausdrucks mithilfe von Protokollregeln ergibt zwar
x+y
, dies ist jedoch gültig, da die Potenzierung verwendet wird und nicht einer der vier Grundoperatoren.quelle
C # - String-Arithmetik
Wir konvertieren beide Zahlen in Strings, addieren sie mit Hilfe von Strings (mit Carry und allem, was Sie wissen) und analysieren sie dann wieder in Integer. Getestet mit i1, i2 in 0..200, wirkt wie ein Zauber. Finden Sie einen Zusatz in diesem!
quelle
C (79)
quelle
Python - 22 Zeichen
quelle
APL: 2
Dies konvertiert die Zahlen von der Basis 1, also (n * 1 ^ 1) + (m * 1 ^ 2), was genau n + m ist.
Kann auf TryApl.org ausprobiert werden
quelle
TI-BASIC, 10
Fügt hinzu
X
undY
quelle
K, 2 Bytes
Anwendungsbeispiel:
Wenden Sie den "where" -Operator (monadisch
&
) auf die Zahlen in einer Eingabeliste an (möglicherweise mit dem Eingabeformat). Dies erzeugt eine Liste mit der ersten Anzahl von Nullen, gefolgt von der zweiten Anzahl von Einsen:Normalerweise wird dieser Operator als "Zusammenstellung" verwendet, um eine Liste der Indizes der Nicht-Null-Elemente einer Booleschen Liste zu erstellen. Die verallgemeinerte Form ist jedoch gelegentlich nützlich.
Dann nehmen Sie einfach die Zählung dieser Liste (monadisch
#
).Wenn meine Interpretation der Eingabeanforderungen nicht akzeptabel ist, führt die folgende etwas längere Lösung denselben Trick aus:
quelle
Pyth , 29 Bytes
Probieren Sie es online!
Meine erste Einreichung hier!
Dies kompiliert zu:
quelle