Credits für die Challenge-Idee gehen an @AndrewPiliser. Sein ursprünglicher Vorschlag im Sandkasten wurde aufgegeben und da er hier seit mehreren Monaten nicht mehr aktiv ist, habe ich die Herausforderung übernommen.
Ausgeglichener Ternär System ist ein nicht standardmäßiges Zahlensystem. Es ist insofern ternär, als der Wert der Ziffern um den Faktor 3 zunimmt, wenn Sie weiter nach links gehen - also 100
ist 9
und 1001
ist 28.
Anstelle der Werte 0, 1 und 2 haben die Ziffern jedoch die Werte -1, 0 und 1 . (Sie können dies weiterhin verwenden, um eine beliebige Ganzzahl auszudrücken.)
Für diese Herausforderung wird die Ziffernbedeutung +1
geschrieben als +
, -1
geschrieben als -
und 0
ist gerecht0
. Balanced Ternary verwendet das -
Symbol vor Zahlen nicht, um sie zu negieren, wie dies bei anderen Zahlensystemen der Fall ist - siehe Beispiele.
Ihre Aufgabe ist es, ein komplettes Programm zu schreiben, das eine 32-Bit-Ganzzahl mit Dezimalzeichen als Eingabe verwendet und in ein ausgeglichenes ternäres Programm konvertiert. Eingebaute Basisumwandlungsfunktionen jeglicher Art sind nicht erlaubt (Mathematica hat wahrscheinlich eine ...). Die Eingabe kann über Standardeingabe, Befehlszeilenargumente usw. erfolgen.
Führende Nullen dürfen in der Eingabe vorhanden sein, aber nicht in der Ausgabe, es sei denn, die Eingabe ist 0
. In diesem Fall sollte die Ausgabe auch vorhanden sein0
.
Beispiele
Dies sind Umrechnungen von Ternär nach Dezimal; Sie müssen in die andere Richtung konvertieren.
+0- = 1*3^2 + 0*3^1 + -1*3^0 = 9 + 0 + -1 = 8
+-0+ = 1*3^3 + -1*3^2 + 0*3^1 + 1*3^0 = 27 + -9 + 0 + 1 = 19
-+++ = -1*3^3 + 1*3^2 + 1*3^1 + 1*3^0 = -27 + 9 + 3 + 1 = -14
quelle
Antworten:
Python 2: 58 Zeichen
Erzeugt die ausgeglichene ternäre Ziffer für Ziffer vom Ende. Die letzte Ziffer wird durch den Rest gegeben
n%3
wird-1
,0
oder+1
. Wir entfernen dann die letzte Ziffer und dividieren durch 3 unter Verwendung von Pythons Floor Dividen=(n+1)/3
. Dann fahren wir rekursiv mit der neuen letzten Ziffer fort, bis die Zahl 0 ist.Ein Sonderfall ist erforderlich für die Eingabe
0
zu geben ,0
anstatt die leere Zeichenkette.Die Spezifikationen erlauben dies nicht, aber wenn man anstelle eines Programms eine Funktion schreiben und den leeren String für 0 ausgeben könnte, wäre eine Lösung mit 40 Zeichen möglich.
quelle
n*"."and
im Funktionsfall zu verwenden . Funktioniert auchprint s or 0
besser: Ps or 0
. Ich hatte es versuchtn*"."and
, aber es schlägt fehl, wennn<0
.CJam, 24 Bytes
Das habe ich mir selbst ausgedacht und ich denke, das ist höchstwahrscheinlich die einzige Möglichkeit, damit umzugehen.
Algorithmisch ist es der Antwort von xnor ähnlich.
Probieren Sie es hier online aus
Wie es funktioniert :
quelle
JavaScript (E6) 68
Ein vollständiges Programm, wie gewünscht, mit E / A über Popup. Der Kern ist die R-Funktion, 49 Bytes.
Ich schätze, das unterscheidet sich nicht so sehr von den anderen rekursiven Lösungen. Nutzen Sie die automatische Konvertierung zwischen String und Zahl, um einen Sonderfall für "0" zu vermeiden
Testen Sie in der FireFox / FireBug-Konsole nur mit der R-Funktion
Ausgabe
quelle
d=(n%3+3)%3
wennd=n%3
liefert den gleichen Wert fürd
?Pyth,
712423Dies ist eine rekursive Lösung, die auf der 40-stelligen rekursiven Funktion von @ xnor basiert.
y
Konstruiert den ausgeglichenen Ternärwert der Eingabe, indem die letzte Ziffer unter Verwendung des Mod-3-Index ermittelt wird, und verwendet dann die Tatsache, dass die restlichen Ziffern dem ausgeglichenen Ternärwert für (n + 1) / 3 entsprechen, wobei die Floored Division verwendet wird. Dann ruft es die Funktion auf und gibt das Ergebnis zurück oder 0, wenn die Eingabe 0 ist.Probieren Sie es hier aus.
quelle
Mathematica -
157154146128Die Golfversion:
Und mit Einzug für die Lesbarkeit:
Verwendung:
Ausgabe:
Vielen Dank an Martin Büttner für die Reduzierung der Zeichenanzahl.
quelle
Mathematica, 54 Zeichen
Ähnlich wie die Rekursion von xnor
Unicode - Symbole verwendet zu ersetzen
Floor
,Part
,!=
Ausgabe
Aus
f
Gründen der Kürze gespeichert und ohne Unicode geschrieben, können Sie nicht anzeigenquelle
GNU sed, 236 Bytes
Probieren Sie es online!
Erläuterung
Die erste Hälfte des Codes (abzüglich der ersten Zeile) wird dezimal in unär übersetzt und stammt direkt aus " Tipps zum Golfen in sed ". Dann wird eins nach dem anderen in ein ausgewogenes ternäres Trit übersetzt, was ich anhand eines Beispiels von Hand demonstrieren werde.
Vor der endgültigen Ausgabe, die ternären Ziffern
-
,0
und+
durch dargestellt werden!
,:
und+
jeweils.Für ein interessantes Ergebnis beginnen wir mit
-48
, das auf unary (mit dem-
intakten) konvertiert wurde . Um den ersten (am weitesten rechts stehenden) Trit zu berechnen, müssen wir den Rest von 48 ÷ 3 berechnen. Wir können dies tun, indem wir das111
s durch3
s ersetzen :48 ÷ 3 hat keinen Rest, also
1
bleiben keine s übrig, und wir wissen, dass unser erster Trit:
(für 0) ist, also ersetzen wir ihn:Jetzt haben wir unseren "einen Platz", also wissen wir, dass die verbleibenden
3
s den Platz drei repräsentieren. Um die Mathematik am Laufen zu halten, müssen wir sie durch 3 teilen, dh durch1
s ersetzen :Lassen Sie uns unsere Mathematik noch einmal überprüfen: Wir haben 16 (unär
1111111111111111
) an der dreifachen Stelle und Null (:
) an der Stelle eins. Das sind 3✕16 + 1✕0 = 48. So weit so gut.Jetzt fangen wir wieder an. Ersetze
111
s durch3
s:Diesmal ist unser Rest
1
, also setzen wir+
den Platz drei ein und ersetzen das verbleibende3
s durch1
s:Sanity Check Time: Wir haben eine 5 (unär
11111
) in den Neunern, 1 (+
) in den:
Dreien und 0 ( ) in den Einern: 9✕5 + 3✕1 + 1✕0 = 48. Großartig! Wieder ersetzen wir das111
s durch3
s:Diesmal ist unser Rest 2 (
11
). Das braucht zwei Trits (+!
), was bedeutet, dass wir einen Carry haben. Genau wie in der Dezimalarithmetik bedeutet dies, dass wir die am weitesten rechts stehende Ziffer nehmen und den Rest der linken Spalte hinzufügen. In unserem System bedeutet dies, dass wir!
die Neun einsetzen und links davon drei weitere hinzufügen und dann alle ersetzen3
s durch1
s , um die 27er-Stelle darzustellen:Jetzt haben wir keine 3en mehr, sodass wir alle verbleibenden unären Ziffern durch die entsprechenden Trits ersetzen können. Zwei (
11
) ist+!
:Im eigentlichen Code erfolgt dies in zwei Schritten
s/1/+/
undy/1:/!0/
, um Bytes zu sparen. Der zweite Schritt ersetzt auch:
s durch0
s, also macht er das tatsächlich:Jetzt prüfen wir, ob wir eine negative Zahl haben. Wir müssen also das Zeichen entfernen und dann jeden Trit umkehren:
Schließlich ersetzen wir
!
s durch-
s:Das ist es!
quelle
Stax , 17 Bytes
Führen Sie es aus und debuggen Sie es
Kürzeste Antwort bisher, sollte aber von einigen Golfsprachen leicht geschlagen werden. Der Algorithmus ist derselbe wie die Python-Antwort von @ xnor.
ASCII-Äquivalent:
quelle
JavaScript
108102 (ES6, keine rekursiven Aufrufe)Ursprünglicher Eintrag bei 108
Nicht so ausgefallen wie die Antwort von @ edc65 ... Ich würde mich über jede Hilfe bei der weiteren Reduzierung freuen ...
quelle
Clojure, 242 Bytes
Ist dies die längste Antwort von Clojure?
Ungolfed (mit Kommentaren):
quelle
8. ,
179171167 ZeichenHier handelt es sich um ein vollständiges Programm in 8th, das eine dezimal vorzeichenbehaftete Ganzzahl als Eingabe verwendet und in ein ausgeglichenes ternäres Programm konvertiert
Prüfung
Beim ersten Mal fragt das Programm nach einer zu konvertierenden Zahl (nach Bedarf). Dann ist es möglich, das Wort aufzurufen
f
, um weitere Zahlen wie in der folgenden Zeile umzuwandeln:Ausgabe
Code Erklärung
Dies ist der Code für die Eingabebehandlung. Der Kern des Codes liegt im Wort
f
. Abseits des Golfplatzes hätte ich>bt
stattdessen das Wort gebrauchtf
. Hier ist es eine ungolfed Version vonf
(mit Kommentaren):quelle
Java,
327269 ZeichenMein erster Versuch im Code-Golf. Ich kenne keine dieser wirklich kurzen Sprachen, deshalb hier eine Lösung in Java. Ich würde mich über Ratschläge zur weiteren Verkürzung freuen.
Versuchen Sie es hier: http://ideone.com/fxlBBb
BEARBEITEN
Ersetzt
BufferedReader
durchScanner
, sodass ich diethrows
Klausel entfernen konnte , aber den Import ändern musste (+2 Zeichen). ErsetztInteger
durchint
. Leider kann das Programm nicht kompiliert werden, wenn es nichtString[] h
in istmain
.quelle
Scanner
anstelle von "a" verwendenBufferedReader
. AuchString[] h
undthrows java.lang.Exception
wahrscheinlich nicht notwendig, und Sie könnten ein paar weitere Bytes sparen, indem Sieint
anstelle von verwendenInteger
.JavaScript (ES6), 51 Byte
Durchlaufe die Charaktere. Multiplizieren Sie zuerst die vorherige Summe mit 3, und konvertieren Sie dann, wenn isNaN (Zeichen) wahr ist, die Zeichenfolge (Zeichen + "1") in eine Zahl, und addieren Sie sie, andernfalls Null.
quelle
Stax , 14 Bytes
Führen Sie es aus und debuggen Sie es
quelle
05AB1E , 20 Bytes
Probieren Sie es online!
quelle
APL (NARS), 26 Zeichen, 52 Byte
Prüfung:
Möglicherweise könnte es weniger sein, wenn ⊥ verwendet wird, aber es ist verboten ...
quelle