Zitiere diese Frage auf SO (Spoiler alert!):
Diese Frage wurde in einem Oracle-Interview gestellt.
Wie würden Sie eine Zahl durch 3 teilen, ohne die Operatoren *, /, +, -,% zu verwenden?
Die Nummer kann signiert oder nicht signiert sein.
Die Aufgabe ist lösbar, aber sehen Sie, ob Sie den kürzesten Code schreiben können.
Regeln:
- Führe die gewünschte Ganzzahldivision durch (
/3
) - Verwenden Sie nicht die nicht-textbasierten Operatoren
*
,/
,+
,-
, oder%
(oder deren Äquivalente, wie__div__
oderadd()
). Dies gilt auch für das Inkrementieren und Dekrementieren von Operatoren wiei++
oderi--
. Die Verwendung von Operatoren für die Verkettung und Formatierung von Zeichenfolgen ist in Ordnung. Die Verwendung dieser Zeichen für verschiedene Operatoren, z. B. für unäre-
Operatoren für negative Zahlen oder*
zur Darstellung eines Zeigers in C, ist ebenfalls in Ordnung. - Der Eingabewert kann beliebig groß sein (was auch immer Ihr System verarbeiten kann), sowohl positiv als auch negativ
- Die Eingabe kann über STDIN oder ARGV erfolgen oder auf andere Weise erfolgen
- Erstellen Sie den kürzesten Code, den Sie für die oben genannten Aufgaben verwenden können
Antworten:
J
45 4410 Zeichen".,&'r3'":
Funktioniert mit Negativen:
":
- Als Text formatieren,&'r3'
-r3
an das Ende anhängen".
- Führen Sie den String aus, z15r3
quelle
3 3 3 #: 9
. Anscheinend müssen Sie wissen, wie lange Ihre ternäre Nummer sein wird._3]\i.
ist auch ein möglicher Ausgangspunkt für etwas, aber ich weiß nicht, ob es hier kürzer als Ihre Lösung wäre. Das Problem beim jetzigen#_3]\i.
Stand ist, dass es immer auf- und abrundet.##~3=_3#\i.
für 11 Zeichen?##~0 0 1$~
.3#.}:(#:~$&3)
aber es ist immer noch länger und behebt das Problem mit der negativen Zahl nicht.^:
oder die Agenda@.
für einenif
oderif...else
Ersatz verwenden. In diesem Fall können Sie möglicherweise@.
zwei Verben verwenden, die mit einem '`' - Zeichen verbunden sind (ein Gerundium in J-speak), um das eine oder das andere anhand einer Bedingung auszuwählen.C, 167503724710
Hier ist meine Lösung für das Problem. Ich gebe zu, dass es unwahrscheinlich ist, einen strengen Code-Golfwettbewerb zu gewinnen, aber es werden keine Tricks verwendet, um die eingebaute Divisionsfunktionalität indirekt aufzurufen. Es ist in portablem C geschrieben (wie bei der ursprünglichen Frage zum Stapelüberlauf gefordert) und es funktioniert einwandfrei für negative Zahlen, und der Code ist außergewöhnlich klar und explizit.
Mein Programm ist die Ausgabe des folgenden Skripts:
Zeichenanzahl: 71 + 39 * 2 ** 32 + 95 = 167503724710
Benchmarks
Es wurde gefragt, wie lange dies dauern würde und wie viel Speicher es verwenden würde. Hier sind einige Benchmarks:
./test.py | pv --buffer-size=1M --average-rate > /dev/null
30 Sekunden lang ausführen, wird eine Geschwindigkeit von ca. 14,8 MB / s erreicht. Die Ausgaberate kann vernünftigerweise als ungefähr konstant angenommen werden, daher sollte die Laufzeit bis zur Fertigstellung etwa 167503724710 B / (14,8 * 1048576 B / s) ≈ 10794 s betragen../test.py | tcc -c - -o /dev/stdout | pv --buffer-size=1M --average-rate > /dev/null
, aber es scheinttcc
, als würde nichts ausgegeben, bis die gesamte Quelldatei eingelesen wurde.quelle
a[b]
ist ein syntaktischer Zucker für*(a + b)
, der den Zusatz macht.Rubin 28
Um durch 3 zu teilen, müssen wir nur die nachstehende Null in der Zahl der Basis 3 entfernen:
120 -> 11110 -> 1111 -> 40
Funktioniert mit Negativen:
Rubin,
6045Alternativ ohne Basiskonvertierung:
d = -> n {x = n · abs; r = (0..1.0 / 0) · Schritt (3) · Aufnahme (x) · Index x; n> 0 · r: -r}quelle
/
Operator, wo erFloat::INFINITY
wurde1.0/0
. Ruby 2.1, kann man Golf(0..1.0/0).step(3)
in0.step(p,3)
der Entfernung/
. Das größere Problem ist , dass-r
Anwendungen-
zu negieren. Der Wechsel-r
zu kostet 5 Zeichen~r.pred
, wobei Integer # pred missbraucht wird, um 1 ohne den Subtraktionsoperator zu subtrahieren.Mathematica, 13 Zeichen
quelle
&
und eine einfache Variable verwenden (andere hier tun das auch).JavaScript, 56
Erzeugt eine Zeichenfolge mit einer Länge
n
von,
s, die,,,
durch s ersetzt wird1
. Anschließend wird die resultierende Länge der Zeichenfolge gemessen. (Hoffentlich ist unary-
erlaubt!)quelle
-
Negationsoperator verwendet.-~
mitparseInt()
-~prompt()
ist eins größer alsparseInt(prompt())
. Ich bin mir nicht sicher, wie du damit umgehen würdest.alert(Array(parseInt(prompt())).slice(1).join().replace(/,,,/g,1).length)
Python,
4138xrange
scheint in der Lage zu sein, große Zahlen (ich denke, das Limit ist das gleiche wie bei einem Long in C) fast augenblicklich zu verarbeiten.quelle
10/3
entspricht 3, nicht 4.print" -"[x<0]+
len (range (2, abs (x), 3)) `` ausführen, werden 39 Zeichen angezeigtlen()
als Abkürzung fürrepr()
range
, da es die Liste tatsächlich erstellt.xrange
täuscht es nur vor, damit es in der Lage ist, große Zahlen zu verarbeiten, ohne Zeit / Speicher zu verschwenden.Haskell, 90
106Erstellt eine unendliche (verzögerte) Nachschlageliste
[(0,0),(0,0),(-1,0),(1,0),(-2,0),(2,0),(-3,-1),(3,1), ...]
, schneidet alle nicht übereinstimmenden Elemente abn
(/=
ist in Haskell ungleich) und gibt die erste zurück, die dies tut.Dies wird viel einfacher, wenn es keine negativen Zahlen gibt:
25
27gibt einfach das
n
th Element der Liste zurück[0,0,0,1,1,1,2, ...]
.quelle
C #, 232 Bytes
Mein erster Code Golf ... Und da es kein C # gab und ich eine andere Methode ausprobieren wollte, die ich hier nicht ausprobiert hatte, dachte ich, ich würde es versuchen. Wie einige andere hier nur nicht negative Zahlen.
Ungolfed
quelle
string[] g
und ihn instring[]g
.Add
?Perl (
2622)Diese Version (ab) verwendet Perls Regex-Engine. Es liest eine Zahl als letztes Befehlszeilenargument (
pop
) und erstellt einen String von3
s dieser Länge ("3" x $number
). Der Regex-Ersetzungsoperator (s///
hier aufgrund der Puzzle-Regeln mit unterschiedlichen Begrenzungszeichen und mit einemg
globalen Flag geschrieben) ersetzt drei Zeichen durch die leere Zeichenfolge und gibt die Anzahl der Ersetzungen zurück, bei der es sich um die Ganzzahl dividiert durch drei handelt. Es könnte sogar ohne geschrieben werden3
, aber die obige Version sieht lustiger aus.quelle
$_=3x pop;say s|333||g
.'$_=3x pop;say s|333||g||0
. Langsam mit großen Zahlen wie 99999999 und nicht mit negativen Zahlen.-p
Sie diese Option in der Befehlszeile, und Sie können Folgendes ausführen:$_=3x$_;$_=0|s|...||g
Für insgesamt 22 Eingaben, einschließlich der Abdeckung der Eingaben 0, 1 oder 2.C 160 Zeichen
Zeichenweise Lösung mit langer Teilung unter Verwendung von Nachschlagetabellen, dh ohne atoi () oder printf () für die Konvertierung zwischen Strings und Ganzzahlen zur Basis 10.
Die Ausgabe enthält manchmal eine führende Null - ein Teil ihres Charmes.
Hinweis:
Testen:
quelle
Python 42
Da jede hier veröffentlichte Lösung, die ich überprüft habe, Dezimalstellen abschneidet, ist dies meine Lösung.
Python
5051Da Python Bodenteilung macht, ist hier meine Lösung, die das implementiert.
Die eingegebene Ganzzahl befindet sich in der Variablen x.
Getestet in Python 2.7, aber ich vermute, dass es auch in 3 funktioniert.
quelle
-3
die richtige Antwort ist-10/3
.JavaScript, 55
Wenn man es nicht benutzen kann
-1
, dann ist hier eine Version, die es ersetzt~0
(danke Peter Taylor!).quelle
~
ist ein bitweiser Operator, der die Bits des Operanden invertiert (zuerst in eine Zahl konvertiert). Dies ist der kürzeste Weg, eine Zeichenkette in eine Zahl umzuwandeln (soweit ich weiß).~~
Konvertiert auch in eine Ganzzahl im Gegensatz zu+
.C 83 Zeichen
Die zu
main()
teilende Zahl wird über stdin übergeben und als Exit-Code von (% ERRORLEVEL% in CMD) zurückgegeben. Dieser Code missbraucht einige Versionen von MinGW, indem er, wenn Optimierungen nicht aktiviert sind, den letzten Zuweisungswert als Rückgabeanweisung behandelt. Es kann wahrscheinlich ein bisschen reduziert werden. Unterstützt alle Nummern, die zu einer passenint
Wenn unary negate (-) nicht erlaubt ist: (129)
Wenn einstellige negate IS zulässig: (123)
EDIT: ugoren hat mich darauf hingewiesen, dass - ~ ein Zuwachs ist ...
83 Zeichen, wenn unary negate erlaubt ist: D
quelle
x+3
ist-~-~-~x
.C 139 Zeichen
Führen Sie mit Zahl als Befehlszeilenargument aus
Testen:
Bearbeitungen:
quelle
A
, meine Funktion überprüft nur das Bit i in Nummer n. Erlaubt der C-Standard das Weglassen von Typdeklarationen, oder ist das etwas mit dem Compiler?ZSH -
3120/21Für negative Zahlen:
Mit negativen Zahlen (ZSH +
bc
) -6261Ich sollte wahrscheinlich nicht zwei Programme als Antwort geben, also ist hier eines, das für jedes Zeichen der Zahl funktioniert:
Dabei wird derselbe Trick zur Basisumwandlung verwendet wie bei Artem Ice .
quelle
C
8173 ZeichenUnterstützt nur nicht negative Zahlen.
Die Idee ist, Zeigerarithmetik zu verwenden. Die Zahl wird in den Zeiger eingelesen
x
, der nirgendwo hinweist.&x[~2]
=&x[-3]
=x-3
wird verwendet, um 3 zu subtrahieren. Dies wird wiederholt, solange die Zahl über 2 liegt.i
Zählt, wie oft dies getan wird (&i[1]
=i+1
).quelle
Java
8679Angenommen, die Ganzzahl ist in y:
Konvertiert in eine Zeichenfolge in Basis 3, entfernt das letzte Zeichen (Rechtsverschiebung ">>" in Basis 3) und konvertiert dann zurück in eine Ganzzahl.
Funktioniert für negative Zahlen.
Wenn die Zahl y <3 oder> -3 ist, gibt sie 0.
Zum ersten Mal im Code Golf. =) Also kann ich noch keinen Kommentar abgeben.
Danke Kevin Cruijssen für die Tipps.
quelle
&&
bis&
und 2xInteger
bisLong
. (Auch, warum verwenden Sie~2
anstelle von nur-3
? Sie sind die gleiche-
, aber ich weiß nicht, ob das für unäre Verneinung gilt.Python2.6 (
29) (71) (57) (52) (43)Bearbeiten - Wir haben gerade festgestellt, dass wir auch mit negativen ganzen Zahlen umgehen müssen. Wird das später beheben
Edit2 - Behoben
Edit3 - 5 Zeichen wurden gespeichert, indem Joel Cornetts Rat befolgt wurde
Edit4 - Da die Eingabe nicht unbedingt von STDIN oder ARGV stammen muss, wurden 9 Zeichen gespart, indem keine Eingabe von stdin übernommen wurde
quelle
abs()
print z if x==abs(x) else -z
print (z,-z)[x<0]
Javascript,
4729Dient
eval
zum dynamischen Generieren von a/
. Wird+
nur für die Verkettung von Zeichenfolgen verwendet, nicht für das Hinzufügen.EDIT: Verwendet
"\57"
anstelle vonString.fromCharCode(47)
quelle
alert(eval(prompt()+"\573"))
?Rubin (
432217)Nicht nur Golf, sondern auch Eleganz :)
Die Ausgabe wird wie folgt sein
(41/1)
. Wenn es eine Ganzzahl sein muss, müssen wir addieren,.to_i
um das Ergebnis zu erhalten. Wenn wir zu ändernto_i
, könnento_f
wir auch die Ausgabe für Floats erhalten.quelle
rational
Zeile in Ruby 1.9.3. Wenn Sie die Klammern weglassen, sparen Sie ein weiteres Zeichen .TI-Basic, 8 Bytes
Gewinner? :)
PS Rundet auf unendlich für negative Zahlen (siehe hier, warum). Stattdessen ersetzen Runde auf Null
int(
mitiPart(
ohne Byte ändern.Testfälle
quelle
Python 2.x,
545351print' -'[x<0],len(range(*(2,-2,x,x,3,-3)[x<0::2]))
Wo
_
ist die Dividende und wird als solche eingetragen.Hinweis: Nicht sicher, ob die Verwendung des interaktiven Interpreters zulässig ist, laut OP: "Eingabe kann über STDIN oder ARGV erfolgen oder auf andere Weise eingegeben werden"
Bearbeiten: Jetzt für Python 3 (funktioniert in 2.x, druckt aber ein Tupel). Funktioniert mit Negativen.
quelle
__len__
ist genug.len(range(100,1000))
gibt900
in 3.2.3 unter Linux.len(xrange(0,_,3))
ist sowieso kürzer und massiv schneller.C ++, 191
Mit main und includes sind es 246, ohne main und includes sind es nur 178. Zeilenumbrüche zählen als 1 Zeichen. Behandelt alle Zahlen als vorzeichenlos. Ich bekomme keine Warnungen, dass main ein nicht unterzeichnetes int zurückgegeben hat, so dass es fair ist.
Meine erste Codegolf-Einsendung.
Verwendet Shifts, um die Zahl wiederholt durch 4 zu teilen, und berechnet die Summe (die zu 1/3 konvergiert)
Pseudocode:
Abgesehen davon könnte ich die main-Methode eliminieren, indem ich d main benenne und ein Zeichen ** aufnehme und den Rückgabewert des Programms als Ausgabe verwende. Es wird die Anzahl der Befehlszeilenargumente geteilt durch drei, abgerundet, zurückgegeben. Dies bringt seine Länge auf die beworbene 191:
quelle
Golfscript - 13 Zeichen
quelle
s/seem to //
:(. Ich muss darüber nachdenkenPowerShell 57 oder 46
In 57 Zeichen, die
%
als PowerShell foreach-Operator verwendet werden, nicht modulo. Diese Lösung kann positive oder negative ganze Zahlen akzeptieren.In 46 Zeichen, wenn
*
als Operator für die Zeichenfolgenwiederholung zulässig, nicht multiplizieren. Diese Option erfordert positive Ganzzahlen als Eingabewerte.quelle
R
Diese funktionieren nur mit positiven ganzen Zahlen:
Oder:
Oder:
Oder:
[[EDIT]] Und eine hässliche:
[[EDIT2]] Plus wahrscheinlich das Beste - inspiriert vom Matlab-Code oben von Elliot G:
quelle
wrong sign in 'by' argument
SmileBASIC,
585136 Bytes (keine mathematischen Funktionen!)Erläuterung:
Das Programm verschiebt die Hintergrundebene gleichmäßig über 3 Frames und erhält den Winkel nach 1 Frame, wenn 1/3 der Gesamtentfernung zurückgelegt wurde.
Float Division Version, 38 Bytes:
Erläuterung:
quelle
Haskell
4139 ZeichenFunktioniert mit allen positiven und negativen ganzen Zahlen
Erstellt zunächst für jede dritte ganze Zahl von 0 bis zur Eingabe eine Liste mit Einsen oder Einsen (-1) (abhängig vom Vorzeichen der Eingabe)
n
.abs(n)
für negative Zahlen inklusive.z.B
n=8 -> [0,3,6]
Es gibt dann die Summe dieser Liste zurück.
quelle
Clojure, 87; arbeitet mit Negativen; basierend auf lazyseqs
Ungolfed:
quelle
Weises Notizbuch (21)
quelle