Herausforderung:
Erstellen Sie ein Programm, das eine positive Ganzzahl akzeptiert und prüft, ob es in Form von (3 ^ x) -1 geschrieben werden kann, wobei X eine andere positive Ganzzahl ist .
Wenn dies möglich ist, geben Sie X aus
Wenn dies nicht möglich ist, geben Sie -1 oder eine falsche Anweisung aus.
Beispiel Ein- / Ausgänge
Eingang:
2
Es kann geschrieben werden als (3 ^ 1) - 1, also geben wir x aus, was 1 ist
Ausgabe:
1
Eingang:
26
26 kann geschrieben werden als (3 ^ 3) - 1, also geben wir x (3) aus
Ausgabe:
3
Eingang:
1024
1024 kann nicht in Form von (3 ^ x) - 1 geschrieben werden, daher geben wir -1 aus
Ausgabe:
-1
Dies ist Code-Golf, also gewinnt die geringste Anzahl von Bytes
Verwandte OEIS: A024023
3^0-1
einer gültigen Ausgabe machen und somit nicht als falsch verwendbar sein,log()
in ihrer Antwort sollte es bestätigen giives die richtige Antwort ,5
wenn242
eingegeben wird.Antworten:
Mathematica,
2116 BytesVerwendet die symbolische Berechnung von Mathematica. Wenn
#+1
eineLog[3,#+1]
Dreierpotenz ist, wird ein ganzzahliges Ergebnis berechnet, das ein atomarer Wert ist. Ansonsten werden wir bekommen,Log[#+1]/Log[3]
wie es ist. Da dies kein atomarer Wert ist, ist es ein Ausdruck, der immer von der Form isthead[val1,val2,...]
. In diesem Fall ist es tatsächlich so etwas wieTimes[Power[Log[3], -1], Log[#+1]]
.Wir unterscheiden die beiden Fälle, indem wir eine andere Funktion auf das Ergebnis anwenden. Was das Anwenden wirklich bewirkt, ist, dass es den
head
Teil eines Ausdrucks ersetzt. Da ganzzahlige Ergebnisse atomar sind, hat das Anwenden einer Funktion auf sie überhaupt nichts zu tun. Insbesonderef @@ atom == atom
.Im anderen Fall wird der Kopf jedoch ersetzt. Die Funktion, die wir verwenden
-1&
, ist eine einfache Funktion, die ihre Argumente ignoriert und zurückgibt-1
. So bekommen wir-1&[Power[Log[3], -1], Log[#+1]]
in nicht ganzzahligen Fällen etwas, was direkt ausgewertet wird-1
. Spezialgehäuse durch Magie.quelle
Python,
4644 BytesProbieren Sie es online!
In diesem Fall
0
wäre der Wert falsch. Vielen Dank an @ mbomb007 für den Hinweis auf meine fehlerhafte Ausgabe sowie 2 Byte keine[]
Einsparungen.quelle
[n for n in range(x)if 3**n-1==x]
für -4 Bytes neu schreiben , leere Liste als falschHaskell, 35 Bytes
Anwendungsbeispiel:
f 26
->3
.quelle
05AB1E , 7 Bytes
Probieren Sie es online!
Erläuterung
quelle
<3zm©.ïi®
ist der engste Punkt, an dem ich Bereiche nicht wie er verwendet habe.3DÝms<k
... Nevermind ... Ich kann mich kein Byte mehr rasieren, ich könnte schwören, ich könnte.Gelee , 5 Bytes
Gibt x oder 0 (falsch) aus.
Probieren Sie es online!
Wie es funktioniert
quelle
Python 2, 41 Bytes
Eine rekursive Funktion, die
0
bei nicht übereinstimmenden Eingaben zurückgegeben wird. Dividiert die Eingabe wiederholt durch 3, wobei die Anzahl der Schritte gezählt wirdi
, die am Ende ausgegeben werden. Wenn jedoch ein Schritt einen Wertn
ergibt, der nicht 2 modulo 0 ist, war die Zahl nicht für3^i-1
, sodass die Ausgabe mit 0 multipliziert wird.quelle
Perl, 31 Bytes
Benötigt
-E
Flag zum Ausführen:Erläuterungen:
grep{3**$_-1==$i}0..($i=<>)
Gibt eine Liste der Elemente des Bereichs0..$_
(dh von 0 bis zur Eingabe) zurück, die den Test erfüllen3**$_-1==$i
. Nur maximal ein Element kann diesen Test bestehen, daher gibt dieser Befehl ein Array mit 0 oder 1 Element zurück. Wir drucken dann diese Liste: entweder dasX
oder nichts (was falsch ist).quelle
Pyth, 11 Bytes
Konvertiert zu Basis 3 und überprüft die Gleichheit zu
[2, 2, ..., 2]
.quelle
?-2JjQ3ZlJ
, da<col> <num>
und<num> <col>
für-
in Pyth austauschbar .JavaScript (ES7),
383634 BytesOder nur
30 bis29 Bytes, wenn das Beenden bei einem Fehler in Ordnung ist:Prüfung
Code-Snippet anzeigen
quelle
Java 8,
375867 BytesDieses Lambda passt in eine
Function<Integer, Integer>
Referenz und verwendet den einfachen Trick zur Basis 3.Diesmal sollte es richtig funktionieren.
quelle
i->
. Wenn Siei
als nehmenLong
, können Sie auch verwendena.toString(...)
(IDs geben einige Warnungen über die Verwendung statischer Funktionen falsch, sollten aber kompilieren). Wie OP sagte, müssen Sie jedoch den Wert zurückgeben, nicht nur True oder False.Verarbeitung,
6056 BytesAusgänge
-1
wenn falsy.Erläuterung
void
ist 1 Byte kürzer als die Verwendungfloat
, daher gibt diese Funktion direkt aus, anstatt einen Wert zurückzugeben.Alternative Lösung
Für 63 Bytes, aber ich denke, diese Alternative kann kürzer als die ursprüngliche Lösung sein. Ich arbeite dran.
quelle
0
jetzt zurückkehren?0
in Java / Processing, von dem ich weiß, niemals falsch ist.Brachylog , 8 Bytes
Probieren Sie es online!
Gibt den Wert aus, wenn dies wahr und
false.
unmöglich ist.Erläuterung
Dies ist eine direkte Transkription der angegebenen Beziehung:
quelle
+~^r~:3
,~:
tun aber leider nicht das, was Sie erwarten (wahrscheinlich, weil:
es sich eher um eine Syntax als um eine eingebaute handelt), und scheinen damit identisch zu sein:
.:
ist ein Kontrollsymbol und~
funktioniert nur bei Prädikaten.Perl 6 ,
2524 BytesVersuch es
Entfernen des Leerzeichens nach der
**
Arbeit, da es länger ist als der andere übereinstimmende Infix-Operator*
.Also
…***…
wird da… ** * …
eher geparst als… * ** …
.Versuch es
Erweitert:
quelle
R, 24 Bytes
Ein anderer Ansatz als die Antwort von Plannapus und ein Byte kürzer!
Erzeugt alle Ganzzahlen von
3^1-1
bis3^99-1
und prüft, ob stdin übereinstimmt. In diesem Fall wird der Index zurückgegeben, zu dem die Übereinstimmung bestehtx
. Wenn nicht, wirdNA
als falscher Wert zurückgegeben.Übrigens werden mehrere Werte als Eingabe akzeptiert und alle getestet, was eine nette Funktion ist.
quelle
Prolog, 20 Bytes
Diese Sprache ist verdammt cool.
quelle
05AB1E , 9 Bytes
Probieren Sie es online!
Gibt -1 für falsch aus.
quelle
MATL , 8 Bytes
Dies gibt die Nummer aus,
x
wenn sie existiert, oder gibt sonst nichts aus, was falsch ist.Probieren Sie es online!
Erläuterung
quelle
Japt , 11 Bytes
Probieren Sie es hier aus .
Ein grosses Dankeschön an ETHproductions für die Hilfe!
quelle
Python 3,
746664 Bytes-10 Bytes dank @ mbomb007, @FlipTack und @ nmjcman101
quelle
from math import*
. Auchreturn n==3**x-1and x
.STDOUT
, damit Sie die Rückkehr zu einem Ausdruck ändern können.import math
undmath.ceil
für ein einzelnes Byte verwenden. Sie können sich auch3**x-1==n and x
umx*(3**x-1==n)
Ruby, 30 Bytes
Gibt
nil
(einen falschen Wert) zurück, wenn keine Nummer gefunden wurde. [Online ausprobieren]quelle
C 56 Bytes
addiere eins zur Eingabe und dividiere dann wiederholt durch drei, bis ein Rest gefunden wird. Wenn eins erreicht ist, gib die Anzahl der Teilungen zurück, sonst -1
quelle
a%3<1
anstelle von!(a%3)
. Eins noch mit0
wegen Falschheit.a=--a?-1:n;
sparen Sie 5 Bytes. Wenn eine Non-Void-Funktion kein Return hat, wird nur die letzte Zuweisung verwendet. Auch was @Titus gesagt hat.a%3?0:(a/=3)
stattdessen vor!(a%3)&&(a/=3)
Bash / Unix-Dienstprogramme,
37-35ByteProbieren Sie es online!
Konvertiert mit dc zur Basis 3, überprüft, ob die resultierende Zeichenfolge alle 2 ist, zählt die Anzahl der Zeichen (einschließlich einer neuen Zeile) und subtrahiert dann mit bc 1.
Wenn die Zahl in der Basis 3 nicht alle 2s ist, gibt grep nichts aus (nicht einmal eine neue Zeile), sodass die Zeichenanzahl 0 ist und das Subtrahieren von 1 -1 ergibt.
quelle
C kompiliert mit Clang 3.8.1,
53,52,54, 51 Bytes@SteadyBox hat bereits eine Lösung in C gepostet, aber ich benutze einen anderen Ansatz.
@Danke an Jasen für die Unterstützung beim Speichern von Bytes.
quelle
log
kehrt das zurück,double
also könnte es vielleicht funktionieren.C, 42 Bytes, optimiert von Wade Tyler
Versuchen
C, 37 Bytes, ohne
return
Versuchen
n
ist global,(I)MUL
kann aber nur seinen dest-Operanden in einem Register haben, muss also inEAX
(die übliche Wahl) gestellt und dort verschoben werdenJavaScript 6, 32 Bytes
Wenn das "falsch" gleich sein muss, 33 Bytes:
quelle
Pyt ,
109 BytesErläuterung:
Mit der Inkrementierungsfunktion ein Byte gespeichert, anstatt explizit 1 hinzuzufügen
quelle
Python, 64 Bytes
Gibt aus,
False
ob die Nummer nicht in diesem Format geschrieben werden kann.Dies funktioniert auch in 64 Bytes und gibt einen leeren String als falsche Ausgabe aus:
Eine kreative Lösung für 65 Bytes, die
0
fälschlicherweise ausgibt:quelle
x
noch-1
.x
werdenn
.Pyth, 10 Bytes
Probieren Sie es hier aus!
quelle
Julia, 30 Bytes
Es ist eine einfache Funktion - sie erzeugt einen Vektor, der
true
nur an der entsprechenden Position in a steht3^a-1
, wobeia
ein Vektor Ganzzahlen zwischen 0 und enthältn
. Es findet die "erste" Position, die 1 ist,true
und subtrahiert sie (wenn alles istfalse
, wird der Wert 0 angenommen, und es wird -1 zurückgegeben).Wie
0:n
hat0
im ersten Spot, ermöglicht die subtrahieren 1 korrigiert für die Indizierung und die-1
falsche Antwort.quelle
Pyke,
96 BytesProbieren Sie es hier aus!
Alte 9-Byte-Version:
Probieren Sie es hier aus!
quelle
Pyth 8 Bytes
Versuch es hier
quelle