Teilen Sie eine Zahl durch 3, ohne die Operatoren *, /, +, -,% zu verwenden

48

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__oder add()). Dies gilt auch für das Inkrementieren und Dekrementieren von Operatoren wie i++oder i--. 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
Gaffi
quelle
1
Wie soll das Ergebnis im positiven Fall gerundet werden? Wie wenn negativ?
dfeuer

Antworten:

15

J 45 44 10 Zeichen

".,&'r3'":

Funktioniert mit Negativen:

".,&'r3'": 15
5
   ".,&'r3'": _9
_3
   ".,&'r3'": 3e99
1e99

": - Als Text formatieren

,&'r3'- r3an das Ende anhängen

". - Führen Sie den String aus, z 15r3

defhlt
quelle
1
Es funktioniert, wenn Sie es tun 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.
Gareth
1
Vielleicht ##~3=_3#\i.für 11 Zeichen?
Gareth
1
Eigentlich können Sie mit auf 10 Zeichen verkleinern ##~0 0 1$~.
Gareth
1
Sie können das mit einem Haken auf verkleinern, 3#.}:(#:~$&3)aber es ist immer noch länger und behebt das Problem mit der negativen Zahl nicht.
Gareth
1
Ja, Sie können entweder die Power-Funktion ^: oder die Agenda @. für einen ifoder if...elseErsatz 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.
Gareth
56

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:

#!/usr/bin/env python3
import sys

# 71
sys.stdout.write('''#include <stdint.h>
#include <stdio.h>
int32_t div_by_3(int32_t input){''')

# 39 * 2**32
for i in range(-2**31, 2**31):
    # 18 + 11 + 10 = 39
    sys.stdout.write('if(input==%11d)return%10d;' % (i, i / 3))

# 95
sys.stdout.write(r'''return 7;}int main(int c,char**v){int32_t n=atoi(a[1]);printf("%d / 3 = %d\n",n, div_by_3(n));}''')

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:

  • Skriptausführungszeit - Wenn Sie das Skript ./test.py | pv --buffer-size=1M --average-rate > /dev/null30 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.
  • Kompilierungszeit - Der TCC-Compiler gibt an, C-Code mit 29,6 MB / s zu kompilieren , was eine Kompilierungszeit von 167503724710 B / (29,6 * 1048576 B / s) ≈ 5397 s ergibt. (Natürlich kann dies in einer Pipeline mit dem Skript ausgeführt werden.)
  • Größe des kompilierten Codes - Ich habe versucht, ihn mithilfe von zu schätzen ./test.py | tcc -c - -o /dev/stdout | pv --buffer-size=1M --average-rate > /dev/null, aber es scheint tcc, als würde nichts ausgegeben, bis die gesamte Quelldatei eingelesen wurde.
  • Arbeitsspeicherauslastung - Da der Algorithmus linear ist (und tcc nicht zeilenübergreifend optimiert), sollte der Arbeitsspeicher-Overhead nur wenige Kilobyte betragen (abgesehen vom Code selbst natürlich).
Mechanische Schnecke
quelle
22
Dies ist der Inbegriff der Hardcodierung. ++++++++++
Joe Z.
4
Abgesehen davon bin ich mir sicher, wenn Sie ihnen eine 160-GB-Quelldatei geben und sie bitten, sie zu kompilieren und zu testen, sehen sie Sie so an, als wären Sie verrückt.
Joe Z.
16
Wenn mein Chef mich bitten würde, eine Division durch drei zu berechnen, ohne - + / *%, würde ich ihn für verrückt halten.
Mikaël Mayer
Und doch a[b]ist ein syntaktischer Zucker für *(a + b), der den Zusatz macht.
Konrad Borowski
12
@NicolasBarbulesco Es gibt eine Größenbeschränkung für Stack Exchange-Antworten.
Timtech
38

Rubin 28

b=->n{n.to_s(3).chop.to_i 3}

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:

ice distantstar:~/virt/golf [349:1]% ruby ./div3.rb
666
222
ice distantstar:~/virt/golf [349]% ruby ./div3.rb
-15        
-5

Rubin, 60 45

Alternativ ohne Basiskonvertierung:

d = -> n {x = n · abs; r = (0..1.0 / 0) · Schritt (3) · Aufnahme (x) · Index x; n> 0 · r: -r}

d=->n{(r=1.step(n.abs,3).to_a.size);n>0?r:-r}
defhlt
quelle
1
Die Alternative ohne Basisumwandlung hat den gesperrten /Operator, wo er Float::INFINITYwurde 1.0/0. Ruby 2.1, kann man Golf (0..1.0/0).step(3)in 0.step(p,3)der Entfernung /. Das größere Problem ist , dass -rAnwendungen -zu negieren. Der Wechsel -rzu kostet 5 Zeichen ~r.pred, wobei Integer # pred missbraucht wird, um 1 ohne den Subtraktionsoperator zu subtrahieren.
Kernigh
26

Mathematica, 13 Zeichen

Mean@{#,0,0}&
Alephalpha
quelle
Das ist böse: Ich denke, Sie könnten die speichern &und eine einfache Variable verwenden (andere hier tun das auch).
Yves Klett
3
@ YvesKlett: Mean ist von Natur aus böse.
GuitarPicker
18

JavaScript, 56

alert(Array(-~prompt()).join().replace(/,,,/g,1).length)

Erzeugt eine Zeichenfolge mit einer Länge nvon ,s, die ,,,durch s ersetzt wird 1. Anschließend wird die resultierende Länge der Zeichenfolge gemessen. (Hoffentlich ist unary -erlaubt!)

Casey Chu
quelle
+1, aber es funktioniert nicht mit negativen Werten
Francesco Casula
Äh, Frage ... wie zählt das? Es wird der -Negationsoperator verwendet.
Patrick Roberts
@ Patrick Ich nahm die Spezifikation zu bedeuten, keine Subtraktion - wenn Sie wollen, können Sie -~mitparseInt()
Casey Chu
@CaseyChu Der von zurückgegebene Wert -~prompt()ist eins größer als parseInt(prompt()). Ich bin mir nicht sicher, wie du damit umgehen würdest.
Patrick Roberts
alert(Array(parseInt(prompt())).slice(1).join().replace(/,,,/g,1).length)
Casey Chu
16

Python, 41 38

print"-"[x:]+`len(xrange(2,abs(x),3))`

xrange 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.

>>> x = -72
-24

>>> x = 9223372036854775806
3074457345618258602
grc
quelle
2
10/3entspricht 3, nicht 4.
Joel Cornett
Wenn Sie print" -"[x<0]+len (range (2, abs (x), 3)) `` ausführen, werden 39 Zeichen angezeigt
Joel Cornett
Die Kommentarformatierung von golfexchange bringt es durcheinander. auf dem oben genannten habe ich Backticks verwendet, um len()als Abkürzung fürrepr()
Joel Cornett
Ich habe es aktualisiert. Ich kann es nicht verwenden range, da es die Liste tatsächlich erstellt. xrangetäuscht es nur vor, damit es in der Lage ist, große Zahlen zu verarbeiten, ohne Zeit / Speicher zu verschwenden.
grc
2
Tu so als wäre es Python 3;) Ich mag das Single Char Slicing übrigens.
Joel Cornett
11

Haskell, 90 106

d n=snd.head.dropWhile((/=n).fst)$zip([0..]>>=ν)([0..]>>=replicate 3>>=ν);ν q=[negate q,q]

Erstellt 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 ab n( /=ist in Haskell ungleich) und gibt die erste zurück, die dies tut.

Dies wird viel einfacher, wenn es keine negativen Zahlen gibt:

25 27

(([0..]>>=replicate 3)!!)

gibt einfach das nth Element der Liste zurück [0,0,0,1,1,1,2, ...].

hörte auf, sich gegen den Uhrzeigersinn zu drehen
quelle
3
oO Ich habe nie an diese zweite Lösung gedacht. Möglicherweise kann ich so etwas in Python
Akolyt
8

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.

class l:System.Collections.Generic.List<int>{}class p{static void Main(string[] g){int n=int.Parse(g[0]);l b,a=new l();b=new l();while(a.Count<n)a.Add(1);while(a.Count>2){a.RemoveRange(0,3);b.Add(1);}System.Console.Write(b.Count);}}

Ungolfed

class l : System.Collections.Generic.List<int>
{ }
class p
{
    static void Main(string[] g)
    {
        int n = int.Parse(g[0]);
        l b, a = new l();
        b = new l();
        while (a.Count < n) a.Add(1);
        while (a.Count > 2)
        {
            a.RemoveRange(0, 3);
            b.Add(1);
        }
        System.Console.Write(b.Count);
    }
}
Drake Clarris
quelle
2
Ungefähr 5 Jahre später. Sie können 1 Byte sparen, indem Sie den Speicherplatz entfernen string[] gund ihn instring[]g
Metoniem
Anführungszeichen "Verwenden Sie nicht die nicht textbasierten Operatoren *, /, +, - oder% (oder deren Entsprechungen wie div oder add ()" - Verwenden Sie keine Entsprechung - .Add?
Jonathan Frech
@JonathanFrech Diese add-Methode funktioniert nicht bei zwei Zahlen, sie fügt einer Sammlung nur einen Wert hinzu
Verkörperung der Ignoranz
7

Perl (26 22)

$_=3x pop;say s|333||g

Diese Version (ab) verwendet Perls Regex-Engine. Es liest eine Zahl als letztes Befehlszeilenargument ( pop) und erstellt einen String von 3s dieser Länge ( "3" x $number). Der Regex-Ersetzungsoperator ( s///hier aufgrund der Puzzle-Regeln mit unterschiedlichen Begrenzungszeichen und mit einem gglobalen 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 werden 3, aber die obige Version sieht lustiger aus.

$ perl -E '$_=3x pop;say s|333||g' 42
14
memowe
quelle
2
Hey @memowe, gute Arbeit! Sie könnten ein paar Zeichen mehr sparen (4), indem Sie tun $_=3x pop;say s|333||g.
Dom Hastings
2
Wenn die Eingabe 0, 1 oder 2 ist, wird eine leere Zeichenfolge gedruckt. Wenn es 0 drucken muss, dann muss es 3 weitere Zeichen (25 insgesamt): '$_=3x pop;say s|333||g||0. Langsam mit großen Zahlen wie 99999999 und nicht mit negativen Zahlen.
Kernigh
1
Verwenden -pSie diese Option in der Befehlszeile, und Sie können Folgendes ausführen: $_=3x$_;$_=0|s|...||gFür insgesamt 22 Eingaben, einschließlich der Abdeckung der Eingaben 0, 1 oder 2.
Xcali
6

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.

main(int n,char**a){
char*s=a[1],*x=0;
if(*s==45)s=&s[1];
for(;*s;s=&s[1])n=&x[*s&15],x="036"[(int)x],*s=&x["000111222333"[n]&3],x="012012012012"[n]&3;
puts(a[1]);
}

Hinweis:

  • missbraucht den Array-Zugriff, um das Hinzufügen zu implementieren.
  • Kompiliert mit Clang 4.0, andere Compiler können barf.

Testen:

./a.out -6            -2
./a.out -5            -1
./a.out -4            -1
./a.out -3            -1
./a.out -2            -0
./a.out -1            -0
./a.out 0             0
./a.out 1             0
./a.out 2             0
./a.out 3             1
./a.out 4             1
./a.out 5             1
./a.out 6             2
./a.out 42            14
./a.out 2011          0670
Baby-Kaninchen
quelle
6

Python 42

int(' -'[x<0]+str(len(range(2,abs(x),3))))

Da jede hier veröffentlichte Lösung, die ich überprüft habe, Dezimalstellen abschneidet, ist dies meine Lösung.

Python 50 51

int(' -'[x<0]+str(len(range([2,0][x<0],abs(x),3))))

Da 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.

Matt
quelle
+1 Für das Anbieten beider Alternativen zur negativen Wertsituation. Da es bereits so viele Antworten gibt, werde ich die Spezifikation nicht anpassen, um die eine oder andere Option auszuschließen, obwohl ich persönlich zustimmen würde, dass dies -3die richtige Antwort ist -10/3.
Gaffi
Für diejenigen, die sich für Bodenteilung
Matt
Was ist mit der Multiplikation und Subtraktion in Ihrer zweiten Lösung?
Stand
@boothby Die zweite Lösung implementiert die Bodenteilung. Ich wollte Range (0, abs (x), 3) für negative Zahlen und Range (2, abs (x), 3) für positive Zahlen. Um das zu tun, hatte ich einen Bereich (2 ... dann subtrahierte ich 2, wenn x negativ ist. X <0 ist wahr, wenn x negativ ist, (wahr) * 2 == 2
Matt
Ich verstehe den Unterschied zwischen Bodenteilung und abgeschnittenen Dezimalstellen nicht. Hat dies mit negativer Teilung zu tun?
Joel Cornett
6

JavaScript, 55

alert(parseInt((~~prompt()).toString(3).slice(0,-1),3))

Wenn man es nicht benutzen kann -1, dann ist hier eine Version, die es ersetzt ~0(danke Peter Taylor!).

alert(parseInt((~~prompt()).toString(3).slice(0,~0),3))
Inkbug
quelle
1
@ArtemIce One ~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ß).
Inkbug
1
Ich bin der Meinung, dass die Verwendung von String-Parsing / Konvertierung ein Betrug ist, da es a) im Vergleich zu bitweisen Operationen ein sehr komplizierter und teurer Prozess ist, b) die verbotenen Operatoren intern verwendet und c) waaaaay mehr Zeichen als eine Homerolled-Lösung in Anspruch nimmt. Ein bisschen wie, wie Leute mürrisch werden, wenn Sie die eingebauten Sortierungen verwenden, wenn Sie gebeten werden, eine Quicksortierung zu implementieren.
Wug
1
@Sam ~~Konvertiert auch in eine Ganzzahl im Gegensatz zu +.
Inkbug
1
@Wug Es ist Codegolf, es geht also nicht um Effizienz, es sei denn, dies ist in der Aufgabe angegeben.
5.
3
+1 für die Nutzung verschiedener Basen. Es ist eine meiner Lieblings-JavaScript-Golftechniken.
DocMax
6

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)

I(unsigned a){a=a&1?I(a>>1)<<1:a|1;}main(a,b,c){scanf("%i",&b);a=b;a=a<0?a:I(~a);for(c=0;a<~1;a=I(I(I(a))))c=I(c);b=b<0?I(~c):c;}

Wenn einstellige negate IS zulässig: (123)

I(unsigned a){a=a&1?I(a>>1)<<1:a|1;}main(a,b,c){scanf("%i",&b);a=b;a=a<0?a:-a;for(c=0;a<~1;a=I(I(I(a))))c=I(c);b=b<0?-c:c;}

EDIT: ugoren hat mich darauf hingewiesen, dass - ~ ein Zuwachs ist ...

83 Zeichen, wenn unary negate erlaubt ist: D

main(a,b,c){scanf("%i",&b);a=b;a=a<0?a:-a;for(c=0;a<~1;a=-~-~-~a)c=-~c;b=b<0?-c:c;}
Kaslai
quelle
Wenn unary negate erlaubt ist, x+3ist -~-~-~x.
Ugoren
Danke für das. Ich weiß nicht, warum mir das nie in den Sinn gekommen ist. Ich glaube, ich wusste nicht, dass Sie Unaries so unentgeltlich stapeln können, hehe.
Kaslai
5

C 139 Zeichen

t;A(a,b){return a?A((a&b)<<1,a^b):b;}main(int n,char**a){n=atoi(a[1]);for(n=A(n,n<0?2:1);n&~3;t=A(n>>2,t),n=A(n>>2,n&3));printf("%d\n",t);}

Führen Sie mit Zahl als Befehlszeilenargument aus

  • Behandelt sowohl negative als auch positive Zahlen

Testen:

 ./a.out -6            -2
 ./a.out -5            -1
 ./a.out -4            -1
 ./a.out -3            -1
 ./a.out -2            0
 ./a.out -1            0
 ./a.out 0             0
 ./a.out 1             0
 ./a.out 2             0
 ./a.out 3             1
 ./a.out 4             1
 ./a.out 5             1
 ./a.out 6             2
 ./a.out 42            14
 ./a.out 2011          670

Bearbeitungen:

  • Durch Mischen von Zusatz (A) wurden 10 Zeichen gespart, um lokale Variablen zu entfernen.
Baby-Kaninchen
quelle
1
Schön gemacht. Ich habe mein Bestes gegeben, um ein bisschen herumzudrehen, und bin auf 239 gekommen. Ich kann einfach nicht mit deinem Kopf umgehen 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?
Shiona
1
C nimmt int an, wenn nichts angegeben ist.
Wug
5

ZSH - 31 20/21

echo {2..x..3}|wc -w

Für negative Zahlen:

echo {-2..x..3}|wc -w

Mit negativen Zahlen (ZSH + bc) -62 61

Ich sollte wahrscheinlich nicht zwei Programme als Antwort geben, also ist hier eines, das für jedes Zeichen der Zahl funktioniert:

echo 'obase=10;ibase=3;'`echo 'obase=3;x'|bc|sed 's/.$//'`|bc

Dabei wird derselbe Trick zur Basisumwandlung verwendet wie bei Artem Ice .

Jon Gauthier
quelle
5

C 81 73 Zeichen

Unterstützt nur nicht negative Zahlen.

char*x,*i;
main(){
    for(scanf("%d",&x);x>2;x=&x[~2])i=&i[1];
    printf("%d",i);
}

Die Idee ist, Zeigerarithmetik zu verwenden. Die Zahl wird in den Zeiger eingelesen x, der nirgendwo hinweist. &x[~2]= &x[-3]= x-3wird verwendet, um 3 zu subtrahieren. Dies wird wiederholt, solange die Zahl über 2 liegt. iZählt, wie oft dies getan wird ( &i[1]= i+1).

ugoren
quelle
Jemand, der versucht, den Code zu verstehen, hat Licht ins Dunkel gebracht? Vielen Dank
Cong Hui
@Chui, fügte eine Erklärung hinzu.
Ugoren
@ugoren, soweit ich weiß, sollte printf ("% d") nicht den Speicheradressenzeiger ausgeben, den ich in Hex habe? Warum gibt es eine ganze Zahl aus? oder char * i wurde initialisiert, um standardmäßig auf die Speicheradresse 0 zu zeigen? Vielen Dank
Cong Hui
5

Java 86 79

Angenommen, 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.

System.out.print(~2<y&y<3?0:Long.valueOf(Long.toString(y,3).split(".$")[0],3));

Zum ersten Mal im Code Golf. =) Also kann ich noch keinen Kommentar abgeben.

Danke Kevin Cruijssen für die Tipps.

Vektorisiert
quelle
Ich weiß, es ist mehr als zwei Jahre her, aber Sie können ein paar Teile Golf spielen: &&bis &und 2x Integerbis Long. (Auch, warum verwenden Sie ~2anstelle von nur -3? Sie sind die gleiche
Byteanzahl
1
@KevinCruijssen So nostalgisch, meinen ersten Beitrag nach so langer Zeit zu bearbeiten. War mir nicht sicher, warum ich dachte, ~ 2 wäre damals besser.
Vectorized
2
@ KevinCruijssen Nun, die Herausforderung besagt, dass du nicht verwenden darfst -, aber ich weiß nicht, ob das für unäre Verneinung gilt.
FlipTack
@FlipTack Ah, du hast vollkommen recht. In diesem Fall vergiss, dass ich es jemals gesagt habe. :)
Kevin Cruijssen
4

Python2.6 ( 29 ) ( 71 ) ( 57 ) ( 52 ) (43)

z=len(range(2,abs(x),3))
print (z,-z)[x<0]

print len(range(2,input(),3))

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

Elssar
quelle
abs()
Fahren
kürzer zu tunprint z if x==abs(x) else -z
Joel Cornett
Besser nochprint (z,-z)[x<0]
Joel Cornett
@ArtemIce danke, nur erkannte ich, dass ich das nach dem Lesen einer anderen Antwort oben verwenden konnte.
Elssar
@ JoelCornett Humm, wusste nicht, danke
Elssar
4

Javascript, 47 29

Dient evalzum dynamischen Generieren von a /. Wird +nur für die Verkettung von Zeichenfolgen verwendet, nicht für das Hinzufügen.

alert(eval(prompt()+"\57"+3))

EDIT: Verwendet "\57"anstelle vonString.fromCharCode(47)

Peter Olson
quelle
-1 für alert(eval(prompt()+"\573"))?
Shieru Asakoto
4

Rubin ( 43 22 17)

Nicht nur Golf, sondern auch Eleganz :)

p Rational gets,3

Die Ausgabe wird wie folgt sein (41/1). Wenn es eine Ganzzahl sein muss, müssen wir addieren, .to_ium das Ergebnis zu erhalten. Wenn wir zu ändern to_i, können to_fwir auch die Ausgabe für Floats erhalten.

Holeth
quelle
1
Funktioniert ohne die erfordernde rationalZeile in Ruby 1.9.3. Wenn Sie die Klammern weglassen, sparen Sie ein weiteres Zeichen .
Steenslag
4

TI-Basic, 8 Bytes

Gewinner? :)

int(mean({Ans,0,0

PS Rundet auf unendlich für negative Zahlen (siehe hier, warum). Stattdessen ersetzen Runde auf Null int(mit iPart(ohne Byte ändern.

Testfälle

-4:prgmDIVIDE
              -2
11:prgmDIVIDE
               3
109:prgmDIVIDE
              36
Timtech
quelle
3

Python 2.x, 54 53 51

print' -'[x<0],len(range(*(2,-2,x,x,3,-3)[x<0::2]))

Wo _ist die Dividende und wird als solche eingetragen.

>>> x=-19
>>> print' -'[x<0],len(range(*(2,-2,x,x,3,-3)[x<0::2]))
- 6

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.

Joel Cornett
quelle
Funktioniert das auch in Python 3?
Mechanische Schnecke
Muss nicht tiefgestellt werden können; Haben __len__ist genug.
Mechanische Schnecke
len(range(100,1000))gibt 900in 3.2.3 unter Linux.
Mechanische Schnecke
Dies funktioniert nicht für negative Zahlen. Und len(xrange(0,_,3))ist sowieso kürzer und massiv schneller.
Grc
@Mechanicalsnail: Punkt genommen. Ich gebe zu. Es funktioniert am 3.
Joel Cornett
3

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.

#include<iostream>
#define R return
typedef unsigned int U;U a(U x,U y){R y?a(x^y,(x|y^x^y)<<1):x;}U d(U i){if(i==3)R 1;U t=i&3,r=i>>=2;t=a(t,i&3);while(i>>=2)t=a(t,i&3),r=a(r,i);R r&&t?a(r,d(t)):0;}U main(){U i;std::cin>>i,std::cout<<d(i);R 0;}

Verwendet Shifts, um die Zahl wiederholt durch 4 zu teilen, und berechnet die Summe (die zu 1/3 konvergiert)

Pseudocode:

// typedefs and #defines for brevity

function a(x, y):
    magically add x and y using recursion and bitwise things
    return x+y.

function d(x):
    if x = 3:
        return 1.
    variable total, remainder
    until x is zero:
        remainder = x mod 4
        x = x / 4
        total = total + x
    if total and remainder both zero:
        return 0.
    else:
        return a(total, d(remainder)).

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:

#define R return
typedef unsigned int U;U a(U x,U y){R y?a(x^y,(x|y^x^y)<<1):x;}U main(U i,char**q){if(i==3)R 1;U t=i&3,r=i>>=2;t=a(t,i&3);while(i>>=2)t=a(t,i&3),r=a(r,i);R r&&t?a(r,d(t)):0;}
Wug
quelle
3

Golfscript - 13 Zeichen

~3base);3base
Knabberzeug
quelle
Scheint nicht mit negativen Eingaben
umzugehen
1
@res s/seem to //:(. Ich muss darüber nachdenken
gnibbler
3

PowerShell 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.

(-join(1..(Read-Host)|%{1})-replace111,0-replace1).Length

In 46 Zeichen, wenn *als Operator für die Zeichenfolgenwiederholung zulässig, nicht multiplizieren. Diese Option erfordert positive Ganzzahlen als Eingabewerte.

("1"*(Read-Host)-replace111,0-replace1).Length
Joseph Alcorn
quelle
Wenn Sie jemals wiederkommen, habe ich einen Bugfix gepostet. Wenn Sie möchten, dass ich meine lösche und die Änderung in Ihre übernehme, lassen Sie es mich einfach wissen.
Veskah,
3

R

Diese funktionieren nur mit positiven ganzen Zahlen:

max(sapply(split(1:x,1:3), length))
# Gives a warning that should be ignored

Oder:

min(table(rep(1:3, x)[1:x]))

Oder:

length((1:x)[seq(3,x,3)])

Oder:

sum(rep(1,x)[seq(3,x,3)])

[[EDIT]] Und eine hässliche:

trunc(sum(rep(0.3333333333, x)))

[[EDIT2]] Plus wahrscheinlich das Beste - inspiriert vom Matlab-Code oben von Elliot G:

length(seq(1,x,3))
lebatsnok
quelle
Ich wollte die gleiche Idee wie in Ihrem EDIT2 implementieren, aber es funktioniert nicht für negative Zahlen:wrong sign in 'by' argument
Andreï Kostyrka
3

SmileBASIC, 58 51 36 Bytes (keine mathematischen Funktionen!)

INPUT N
BGANIM.,4,-3,N
WAIT?BGROT(0)

Erläuterung:

INPUT N           'get input
BGANIM 0,"R",-3,N 'smoothly rotate background layer 0 by N degrees over 3 frames
WAIT              'wait 1 frame
PRINT BGROT(0)    'display angle of layer 0

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:

INPUT N
BGANIM.,7,-3,N
WAIT?BGVAR(0,7)

Erläuterung:

INPUT N           'input
BGANIM 0,"V",-3,N 'smoothly change layer 0's internal variable to N over 3 frames
WAIT              'wait 1 frame
PRINT BGVAR(0,7)  'display layer 0's internal variable
12Me21
quelle
3

Haskell 41 39 Zeichen

Funktioniert mit allen positiven und negativen ganzen Zahlen

f n=sum[sum$1:[-2|n<0]|i<-[3,6..abs n]]

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.

Charl Kruger
quelle
Funktioniert nicht bei negativen Zahlen (-3/3 ist -1, nicht 1).
Cormac
Schön, dass du es gemacht hast, dass es mit negativen Zahlen funktioniert, aber du kannst / nicht verwenden, lies die Spezifikation.
Cormac
Oh Mann, du hast mich zweimal erwischt. Alles behoben;)
Charl Kruger
Nett! Übrigens: Sie können 39 Zeichen mit fn = sum [sum $ 1: [- 2 | n <0] | i <- [3,6..abs n]]
Cormac
2

Clojure, 87; arbeitet mit Negativen; basierend auf lazyseqs

(defn d[n](def r(nth(apply interleave(repeat 3(range)))(Math/abs n)))(if(> n 0)r(- r)))

Ungolfed:

(defn d [n]
  (let [r (nth (->> (range) (repeat 3) (apply interleave))
               (Math/abs n))]
        (if (pos? n)
          r
          (- r))))
defhlt
quelle