Sie müssen 2 Zeichenfolgen eingeben und die Summe dieser beiden Zeichenfolgen ausgeben, ohne sie in int zu konvertieren oder einen numerischen Datentyp zu verwenden.
Ex.
string one = "123";
string two = "456";
string sum = "579";
Angenommen, die Zeichenfolgen sind nicht größer als 10 Stellen.
Dies ist Code Golf und die kürzeste Antwort in Zeichen gewinnt. Eine Bearbeitung der Antwort in C # bringt mich zum Lächeln :).
Bearbeiten: Die Konvertierung in int kann als etwas in dieser Art definiert werden
Int.TryParse
, (int)
, Convert.ToInt
Etc
code-golf
string
arithmetic
CSharper
quelle
quelle
Antworten:
80836 Assembly (
5753 Byte)Dies addiert Ziffer für Ziffer von rechts nach links, ohne ASCII-Ziffern
'0'-'9'
in Ganzzahlen umzuwandeln0-9
und nach Bedarf zu übertragen. Der Bytecode ist der Code für eine Funktion, die in C aufgerufen werden kann (siehe unten).Der obige Bytecode wurde von Hand aus der folgenden Baugruppe (NASM-Stil, kommentiert) geschrieben:
So versuchen Sie dies in C (gcc, Linux, Intel-Prozessor):
quelle
Ruby,
10971Käsig. Wenn Sie Mohammad nicht auf den Berg bringen können ...
Algorithmus:
Änderungsprotokoll
71 kürzer als ein Array.
85 Methodendeklaration entfernt und Aufrufe an konsolidiert
n.to_s
92 einige Tipps angewendet
101 Speichern Sie ein Zeichen
102 Verwenden Sie x zum Inkrementieren
109 anfängliches Festschreiben
quelle
succ
oderprev
.... aber das macht nicht mal Spaß Golf zu spielen.sed, 359 Bytes (ohne die ausgefallene Formatierung)
Ich bin mir immer noch nicht sicher, ob dies ein Dup von Add ohne Addition ist (oder einer der 4 grundlegenden arithmetischen Operatoren) . Lassen Sie mich in der Zwischenzeit meine Antwort auf diese Frage kreuzen. Es wird kein Golf gewinnen, aber es ist ein Anfang, und ich denke, es erfüllt leicht die Spezifikation:
Die Eingabe erfolgt von STDIN in der Form "x y". Das wird zuerst in "x: 0 :: y:" transformiert. 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. (Zumindest theoretisch) funktioniert es jedoch 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
y
wird auf umgerechnety+1
mit nur regex? und keine tatsächliche Ergänzung? Nett!Ruby -
485432265Dies scheint eher im Sinne dessen zu sein, wonach Sie in der Frage gesucht haben.
Es löst im Grunde das Problem, wie ein Mensch es auf Papier tun würde - indem es alle Ergebnisse der einstelligen Addition "auswendig lernt", jede Spalte hinzufügt und versteht, wie man bei Bedarf "die eine trägt".
Dies verwendet auch einen "numerischen Datentyp" (Variable i), der durch die Frage verboten ist, jedoch nur für die Zeichenfolgenindizierung. Ich werde versuchen, dies zu entfernen und meine Antwort zu bearbeiten.
Etwas ungolf:
BEARBEITEN: Verwenden Sie einige Ideen aus den Kommentaren, um die "gespeicherte" Zuordnungstabelle zu generieren, anstatt sie nur fest zu codieren.
quelle
[?1..?9].zip([?1..?9]).map{|x,y| Regex.new(x+y)}.map{/*something based on the order of results*/}
product
ist besser alszip
/#{x+y}/
ist kürzer alsRegexp.new(x+y)
. ;)i=-1;(s=(?0..?9).to_a).product(s).map{|x,y|i+=1;/#{x+y}/=>(?0..'18').each_cons(10).to_a[i/10][i%10]}
gibt Ihnen Ihr Regex-Array.i
) ... es muss einen anderen Weg geben, um das zu umgehen ... vielleicht nureach_cons(10)
als Enumerator undnext
durch die Menge?CJam,
95 92 80 72 7044 Zeichenwas übersetzt bedeutet
Dies kann definitiv viel Golf gespielt werden. Ich weiß wirklich nicht, ob mein Ansatz optimal ist oder noch nicht.
UPDATE - Inline die Summenmatrixerstellung zum Speichern von Bytes. Aus diesem Grund läuft das Programm jetzt zehnmal langsamer, aber immer noch eine konstante Zeit für jede Art von Eingabe.
Probieren Sie es hier online aus
Liest die Zeile mit zwei Zahlen aus STDIN als Zeichenfolge und gibt sie als Zeichenarray aus, das selbst eine Zeichenfolge ist.
Beispielsweise:
Die Ausgabe enthält vorhergehende
0
. Lassen Sie mich wissen, ob dies ein Problem ist.quelle
C # -
128108104Vielen Dank an Compass, BMac und Shawn für die Verbesserungsvorschläge.
Erster Versuch bei Code Golf, und die Verwendung von C # scheint hier ein Handicap zu sein ...
Mit können
.Compute()
Sie die Zeichenfolgenwerte verwenden und direkt summieren. Als Bonus funktioniert dies für andere Betreiber außer nur "+".Golf:
Ungolfed:
Wenn
t("123","456");
Sie anrufen, erhalten Sie 579.quelle
System.Console.WriteLine(new System.Data.DataTable()...
Console.Write
4 Bytes zu speichernGNU sed, 266 Bytes
Verwendet einen anderen Ansatz als die Lösung von DigitalTrauma. Infolgedessen ist dieser mit O (m + n) noch schlechter . Konvertieren Sie beide Operanden in unär, verketten Sie, konvertieren Sie zurück in dezimal (alle verwenden natürlich Regex - sed hat nicht das Konzept einer Ganzzahl).
Als Bonus fasst dieses Programm alle natürlichen Ganzzahlen zusammen, die auf stdin (in der ersten Zeile) angegeben sind, was bedeutet, dass Sie nichts, eine oder zehn Zahlen eingeben können und es trotzdem das Richtige tut.
Die Idee hinter diesem Code ist vage von einer alten PPCG-Sed-Vorlage von mir inspiriert, obwohl ich mich nicht erinnere, für welche Frage es eine Antwort ist.
Hier ist es "hübsch" für Ihre "Bequemlichkeit" gedruckt, eine andere Idee von DigitalTrauma auszuleihen. : D.
(Um die 266-Byte-Version zu erhalten, entfernen Sie nachfolgende Semikolons, führende Leerzeichen und den letzten Kommentar, vorzugsweise mit sed.)
Einige Tests von DigitalTrauma ausleihen:
Ich habe die wirklich großen Tests wegen der schrecklichen Raumeffizienz ein wenig optimiert. Aufgrund der Verwendung wird
q
nur die erste Zeile verarbeitet, daher diewhile
Schleife im Test.quelle
Java 6 (181 Zeichen)
Nicht zu übertreffen durch das Handicap C # , Java in seiner ganzen Pracht. So viel Boilerplate! Die Verwendung besteht darin, die Argumente durch ein Leerzeichen getrennt bereitzustellen, d. H.
123 456
Ungolfed:
Durch die Verwendung der in verfügbaren JavaScript-Engine
javax
können wir eine andere Sprache für uns arbeiten lassen und die Regeln befolgen, keine numerischen Typen in der Muttersprache zu verwenden oder zu konvertieren.Begründung für die Verwendung
eval
Wir haben die Werte nicht in int konvertiert, damit JavaScript ausgewertet werden kann. Wir haben einen String erstellt,
"123+456"
der keine Zahl ist. JS Engine verarbeitet die Formel und wertet den String als Zahlenliterale aus, bei denen es sich nicht um numerische Datentypen handelt. Java kitschige Logik! Abgesehen davon funktioniert dies auch fürdouble
Mathematik.quelle
dc -e"$1 $2+p"
ich sie technisch gesehen nicht in der nativen Bash verwendet habe. Sie übergibt nur eine Zeichenfolge an einige ImplementierungsdetailsAPL (61)
Ich denke, das fällt unter die Regeln.
Dies ist eine Funktion, die zwei Zeichenfolgenargumente akzeptiert und eine Zeichenfolge zurückgibt:
Es ist auch ziemlich schnell, es addiert die Zahl, die von 999999
9
s gebildet wird , in einem Augenblick zu sich selbst.Es findet den Index jedes Zeichens in
⎕D
(dies ist die Zeichenfolge '0123456789'), fügt dann die Grundschule für jeden Index separat hinzu, trägt sie nach Bedarf und sucht dann nach den resultierenden Ziffern in⎕D
. (Ich denke, die⎕D
Suche fällt unter die Regeln, es geht im Grunde nur'x'-48
).Erläuterung:
⎕D∘⍳¨⍺⍵
: Schlagen Sie die Indizes⎕D
für jedes Zeichen in beiden Zeichenfolgen nach.¯1+
: subtrahieren1
von jedem, da die Arrays standardmäßig 1-basiert sind.⌽↑⌽¨
: Beides umkehren, in eine Matrix verwandeln (leere Quadrate mit Nullen füllen), dann die Matrix umkehren.+⌿
: Summiere die Spalten der Matrix{
...}
: übertragen:∨/T←9<Z←0,⍵
: Fügen Sie0
vor der Liste ein zusätzliches hinzu . Finden Sie heraus, welche 'Ziffern' höher als 9 sind, und speichern Sie diese inT
. Wenn irgendwelche Ziffern höher als 10 waren:Z-10×T
:10
von jeder Position subtrahieren , die höher als 10 ist,T←(1⌽T)+
: Fügen Sie1
zu jeder Position neben jeder Position, die höher als 10 war, hinzu und speichern Sie inT
.T↓⍨~×⊃T
: WennT
mit einer Null beginnt, entfernen Sie diese,∇
: Wenden Sie die Übertragsfunktion auf das Ergebnis an.⋄⍵
: Andernfalls geben Sie den Wert unverändert zurück1+
: Fügen Sie jeder Position eine hinzu (da das Array 1-indiziert ist)⎕D[
...]
: Verwenden Sie das Ergebnis als Index für⎕D
.quelle
Perl -
136119115 BytesIch lerne Perl, das schien mir eine gute Übung zu sein. Tipps sind willkommen!
Cheesy Antwort, um das aus dem Weg zu räumen:
Aktuelle Antwort:
Unkomprimiert:
quelle
($x,$y)=@ARGV
undsay
anstelle von ersetzen,print
werden einige Zeichen entfernt.say
ist eine Perl 6-Sache (oder Sie könnten sie in Perl 5 mit diesen Anweisungen verwenden, aber das wäre zu lang).say
Verwenden Sie stattdessen , umwarn
einen Charakter zu rasieren. Das wird an STDERR anstatt an STDOUT ausgegeben, aber das verstößt nicht gegen die Regeln dieses Artikels. :-)Java 7, Punktzahl = 252
Verwendet keine Ganzzahlen, Longs, Bytes, Shorts, Doubles, Floats oder integrierte Bibliotheksfunktionen zum Hinzufügen. Wickeln Sie sich in einen Klassenkörper und rufen Sie mit an
t(String1,String2)
. Bitte füllen Sie Zeichenfolgen mit Nullen auf, damit sie gleich lang sind.t("123","234")
kehrt zurück"0357"
.Golf:
Golfed Erweitert mit Klasse:
Teilweise Golf erweitert:
100% erweitert:
quelle
char
ein numerischer Datentyp ._.\u0030
in einen String konvertiere , bekomme ich"0"
nicht"48"
.Java - 257 Zeichen
Wie jeder weiß, gibt es keine bessere Sprache zum Golfen als Java
Dies ist eine ungolfed Lösung
quelle
Haskell -
9894 Bytesquelle
JavaScript (ES6),
55 6659 ** Dies macht einige Annahmen:
Die Eingabe wird in den Variablen a und b definiert, z. B.:Geändert, um Eingaben von der Eingabeaufforderung (+11) zu erhalten.var a='123',b=321';
quelle
Python 2.7,
196137 ZeichenVersion 2 (kürzer durch Initialisieren des Wörterbuchs mit Code):
Vorherige Version 1 (196 Zeichen):
z.B
Die Wörterbuchschlüssel sind Zeichenfolgen, die Wörterbuchwerte enthalten nur Zahlenkonstanten, um den Code zu verkürzen, und die Berechnung erfolgt durch Verketten von zwei Zeichenfolgen und Erhalten der resultierenden Länge. Ich hoffe, dass dies als "Nichtkonvertieren in Ints" gilt.
Python-Small-Print-Regel-Cheat-Version
Hinweis:
Typ z ist ein benutzerdefinierter Typ, den ich definiere: definitiv kein numerischer Typ nach der vom Fragesteller verwendeten Definition, sondern verhält sich nahe genug an einem numerischen Typ, um unter bestimmten Umständen nützlich zu sein . Verhaltensweisen vom Typ z werden in diesem Codebeispiel nur teilweise implementiert. Wenn der CPython-Interpreter 'int' zum Implementieren von z verwendet , handelt es sich lediglich um ein Implementierungsdetail, das nicht mit dem vorliegenden Problem zusammenhängt.
quelle