Bei einer gegebenen Zahl n (0 <= n <= 2642245) prüfen Sie, ob n und n 3 den gleichen Satz von Ziffern haben, und geben Sie dementsprechend einen Wahrheits- oder Falschwert aus.
Lassen Sie uns zum Beispiel die Zahl 100 überprüfen.
100 3 ist 1000000.
Die Ziffernfolge in 100 lautet {0, 1}.
Der Ziffernsatz in 1000000 ist {0, 1}.
Daher sollten 100 einen wahrheitsgemäßen Wert angeben.
Testfälle
0 -> True
1 -> True
10 -> True
107624 -> True
251894 -> True
251895 -> False
102343 -> False
Denken Sie daran, das ist Code-Golf , also gewinnt der Code mit den wenigsten Bytes.
code-golf
number
decision-problem
Oliver Ni
quelle
quelle
2103869 -> True
. Diese (oder eine größere) ist erforderlich, um eine Sprache mit einemlong
Datentyp zu testen .Antworten:
Python 3,
3632 BytesIch denke, das funktioniert nur in Python 3.5 und höher. Dank Copper sind vier Bytes vergangen.
quelle
set(`x`)
2097152
(sys.maxint**(1/3.)
) und kleiner als ist,sys.maxint+1
wird zurückgegeben,False
wenn Sie verwendenrepr()
. repl.it/EXs2/1 . Longs haben eineL
am Ende.lambda x:{*str(x)}=={*str(x**3)}
in Python 3.5+ tun .==
durch^
. Zwei gleiche Mengen führen dazu,{}
was falsch ist.05AB1E , 6 Bytes
05AB1E verwendet die CP-1252- Codierung.
Probieren Sie es online!
Erläuterung
quelle
C 73 Bytes
Erzeugt den Satz über Bits. Gibt
0
für den gleichen Satz zurück, alles andere für verschiedene Sätze.Ungolfed:
quelle
1 <<
Beim Setzen der Bits mit fehlt der ungolfed Codek |= 1 << i % 10
. Tolle Lösung!0
Dürfen wir als wahr betrachten? Ich denke, dasstrcmp
funktioniert so, also scheint es in C vernünftig.int
größer als 64-Bit sind. (Auch 64-Bit mit Vorzeichen ist nicht ausreichend, 64-Bit ohne Vorzeichen jedoch). Es gibt also keine wirklichen Implementierungen von C, von denen ich weiß, wo dies die Anforderungen der Frage erfüllt. (Es funktioniert ordnungsgemäß mitunsigned long long
oder nurunsigned long
in Implementierungen, bei denen es sich um einen 64-Bit-Typ handelt). GNU C definiert__int128_t
auf 64-Bit-Maschinen (ohne Header) ...Perl, 31 + 2 (
-pl
Flag) =2521183433 BytesVerwenden von:
Ausgabe:
1\n
oder0\n
.Vielen Dank an @Dada für 3 Bytes, Gabriel Benamy für 1 Byte und @Zaid für Fehlermeldungen.
quelle
perl -pe '$_=$_**3!~/[^$_]/'
10
:(-l
Flagge benötigt.&&
in ein*
, um ein Byte zu speichernMathematica, 34 Bytes
Direkte Implementierung (unbenannte Funktion eines Integer-Arguments).
quelle
Gelee , 8 Bytes
Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
quelle
CJam, 8 Bytes
Testsuite.
Erläuterung
quelle
JavaScript ES6,
5551 BytesDanke an Downgoat für 3 Bytes! Sie können ein Byte speichern, indem Sie auf ES7 konvertieren und
n**3
anstelle von verwendenn*n*n
.Einfach genug.
quelle
==
es nicht einmal auf Arrays funktioniert.n*n*n
zun**3
, aber ich denke , das könnte ES7 und nicht ES6 sein.2103869
, und für das Problem sind explizit Lösungen erforderlich2642245
.C #,
241208205201193233222220212203177159 Bytes (109 Alternative)Die Lambdas müssen speziell den
ulong
Typ verwenden:Vielen Dank an @Corak und @Dennis_E für das Speichern einiger Bytes und an @TimmyD für das Finden eines Problems mit meiner ursprünglichen Lösung. Vielen Dank an @SaxxonPike für den Hinweis auf das ulong / long / decimal / etc-Problem (das mir tatsächlich auch einige Bytes erspart hat).
Es gibt auch eine 109-Byte- Lösung mit HashSets, ähnlich den Java-Antworten hier, aber ich bleibe bei meiner ursprünglichen Lösung für meine Punktzahl.
quelle
p<0
anstelle von überprüfenp==1
?n=>{Func<string,int[]>x=s=>{var a=new int[10];foreach(var c in s)a[int.Parse(c+"")]++;return a;};var i=x(n);var j=x((long)Math.Pow(int.Parse(n),3)+"");for(var k=0;k<10;)if(i[k]>0^j[k++]>0)return 0>1;return 1>0;};
int.Parse(c+"")
mitc-'0'
long
anstelle von verwendetulong
und dieser Testfall verwendet das MSB.)Java 8, 154 Zeichen
So genannt:
Ausgänge:
Eine sehr Java-8-y-Antwort, die sowohl ein Lambda als auch Streams verwendet, einschließlich einiger ausgefallener Konvertierungen von Zahl zu Zeichenfolge.
Leider müssen wir
BigInteger.pow(3)
anstelle vonMath.pow(a,3)
Math.pow nicht präzise Doubles verwenden, die falsche Werte mit großen Zahlen zurückgeben (beginnend mit2103869
).quelle
static Y y
Ding ist eine seltsame Initialisierungssyntax. Wird es automatisch zugewiesen,y.n
weil die Schnittstelle genau ein Mitglied hat?@FunctionalInterface
Annotation hinzu (Schnittstelle mit nur einer Methode, siehe javadoc), wodurch Lambdas anstelle der üblichen anonymen Typinstanziierung funktionieren.Y y = new Y() { @Override public boolean n(int x) { return Arrays.equals((a+"").chars().distinct().sorted().toArray(),(new BigInteger(a+"").pow(3)+"").chars().distinct().sorted().toArray()); } }
und derstatic
Modifikator ist nur dazu da, den Aufrufy.n(int)
von der statischen Hauptmethode aus zuzulassen .BASH,
6959 BytesAKTUALISIEREN
Eine andere gute Möglichkeit, dies in bash zu tun, ist die Verwendung von tr (62 Bytes, kann aber wahrscheinlich ein bisschen mehr zusammengedrückt werden).
BEARBEITEN: Einige weitere Optimierungen (Thx! @Manatwork)
Golf gespielt
Prüfung
0 - für Erfolg (Exit-Code) 1 - für Misserfolg (Exit-Code)
quelle
T <<< 11
. Wird sagen, die Ziffernsätze sind die gleichen, nur weil 11 ** 3 == 1331 die Ziffern enthält, die in der ursprünglichen Nummer nicht zweimal vorhanden sind.-w
explizit hinzugefügt habenfold
. Wennuniq
ohne Optionen verwendet wird,sort -u
kann es ersetzen. Und füttere den 2. S-Aufruf mit Here-String. Und ich denke, es ist nicht nötig, die Formel zu zitieren, die an übergeben wurdebc
.cmp
anstelle vondiff
1 Byte verwenden und speichern.x86-64-Maschinencodefunktion, 40 Byte.
Oder 37 Bytes, wenn 0 gegen Nicht-Null als "wahr" zulässig ist, wie strcmp.
Vielen Dank an Karl Napfs C-Antwort für die Bitmap-Idee, die x86 mit BTS sehr effizient umsetzen kann .
Funktionssignatur:
_Bool cube_digits_same(uint64_t n);
unter Verwendung der x86-64-System-V-ABI. (n
in RDI boolescher Rückgabewert (0 oder 1) in AL)._Bool
wird von ISO C11 definiert und wird normalerweise verwendet#include <stdbool.h>
, umbool
mit derselben Semantik wie C ++ zu definierenbool
.Einsparpotential:
All dies ist möglich, wenn dies ein Inline-Asm-Fragment anstelle einer Funktion wäre, was es für Inline-Asm zu 35 Bytes machen würde .
LOOP scheint die kleinste Möglichkeit zu sein, sich einmal zu wiederholen. Ich habe mir auch nur das Wiederholen der Schleife angesehen (ohne REX-Präfixe und ein anderes Bitmap-Register), aber das ist etwas größer. Ich habe auch versucht, PUSH RSI und
test spl, 0xf
/jz
zu verwenden, um eine Schleife auszuführen (da das ABI erfordert, dass RSP vor CALL auf 16B ausgerichtet ist, sodass es durch einen Tastendruck ausgerichtet und durch einen anderen erneut falsch ausgerichtet wird). Da es keinetest r32, imm8
Codierung gibt, bestand die kleinste Möglichkeit darin, mit einem 4B-TEST-Befehl (einschließlich eines REX-Präfix) nur das Low-Byte von RSP gegen ein imm8 zu testen. Gleiche Größe wie LEA + LOOP, jedoch mit zusätzlichen PUSH / POP-Anweisungen.Getestet für alle n im Testbereich im Vergleich zur C-Implementierung von steadybox (da ein anderer Algorithmus verwendet wird). In den beiden von mir untersuchten Fällen mit unterschiedlichen Ergebnissen war mein Code korrekt und die von steadybox waren falsch. Ich denke, mein Code ist für alle n korrekt.
Die einzigen gedruckten Zeilen haben c = 1 asm = 0: falsch-positiv für den C-Algorithmus.
Wurde auch mit einer
uint64_t
Version von Karls C-Implementierung desselben Algorithmus getestet und die Ergebnisse stimmen für alle Eingaben überein.quelle
objdump -drwC -Mintel
der Objektdatei und Kopieren von Kommentaren.) In dieser Sprache ist die Optimierung der Codegröße im wirklichen Leben nützlich. (Aber auch dann, nur in seltenen Fällen wie Bootloadern oder Demos. Normalerweise lohnt es sich, nur dann Codegröße zu sparen, wenn die Leistung im bereits zwischengespeicherten Fall nicht beeinträchtigt wird, aber dann ist es nützlich, Engpässe und Cache-Ausfälle zu vermeiden.)Haskell, 47 Bytes
Sehr langsam. Testen Sie mit
c<-['0'..'9']
.Testet jedes Zeichen auf Einbeziehung in die Zeichenfolgendarstellung von
n
und erstellt eine Liste der enthaltenen Zeichen . Prüft ebenfalls fürn^3
und ob die Listen gleich sind.quelle
nub
(bekommt eindeutige Elemente) undsort
, aber beide erfordern den langwierigen Importimport Data.List
. Trotzdem kommt es sehr nah an 48 Byte:import Data.List;q=sort.nub.show;f n=q n==q(n^3)
.nub
die Ordnung beim ersten Auftreten bei, dhnub [3,1,3,2,1,2] == [3,1,2]
. Es wird nicht in einen Settyp konvertiert (es gibt keinen), sondern es wird eine Liste angezeigt.Dyalog APL , 10 Bytes
⍕≡
ist die Textdarstellung des Arguments identisch mit⍕∪
die Vereinigung der Textdarstellung des Arguments und(⍕*∘3)
die Textdarstellung des gewürfelten Arguments?TryAPL online!
Hinweis: Setzen Sie für große Zahlen
⎕PP←34 ⋄ ⎕FR←1287
(34 signifikante Stellen, 128-Bit-Gleitkommazahlen)quelle
Clojure, 35 Bytes
quelle
Java 7,
185178 ZeichenAnrufen als:
Ausgabe:
(Ich bin mir nie sicher, ob ich auch Importe und Methodendefinitionen zählen muss ... Ich habe es so oder so gesehen. Der Code selbst wäre jedoch nur 141 Bytes lang.)
quelle
static
zwar entfernen .static
.Gelee , 8 Bytes
Probieren Sie es online!
Erläuterung:
quelle
*3ṢQ⁼ṢQ$
funktioniert wie vorgesehen, da die schnellen$
Gruppen die beiden Atome zu einer monadischen Kette verbinden.Pyth, 10 Bytes
Da wir mit Pyth-Antworten nicht genug Abwechslung haben, wollen wir nicht nur eine, sondern zwei weitere hinzufügen! Beide haben eine Größe von 10 Byte und wurden als Beispieleingabe getestet
106239
(bei einigen anderen Antworten ist dies fehlgeschlagen).Erläuterung:
Versuchen Sie die erste Antwort mit einer Online-Testsuite.
Zweite Antwort:
Erläuterung:
Versuchen Sie die zweite Antwort mit einer Online-Testsuite.
quelle
Kotlin: 46/88/96 Bytes
Die Frage gibt nicht an, woher die Eingabe stammt. Hier sind die üblichen 3 Eingabequellen.
Funktion: 46 Bytes
main () mit dem ersten Programmargument: 88 Bytes
fun main(a:Array<String>){val i=a[0].toLong();println("$i".toSet()=="${i*i*i}".toSet())}
main () mit Standardeingabe: 96 Bytes
fun main(a:Array<String>){val i=readLine()!!.toLong();println("$i".toSet()=="${i*i*i}".toSet())}
quelle
Haskell,
5452 BytesDanke @Laikoni für das Speichern von zwei Bytes.
quelle
a%b=all(
elema)b
als Funktion deklarieren und dann mit aufrufen,b%a&&a%b
sollten Sie zwei Bytes sparen.JavaScript (ES6), 44 Byte
Port of @ KarlNapfs ausgezeichnete C-Antwort. ES7 speichert ein Byte über
n**3
. Funktioniert aufgrund der eingeschränkten numerischen Genauigkeit von JavaScript nur bis 208063; Wenn Sie es nur benötigen, um bis zu 1290 zu arbeiten, können Sie ein weiteres Byte speichern.quelle
Perl 6 , 22 Bytes
Erweitert:
Der Operator Symmetric Set difference 「ic ⊖ gibt ein leeres Set zurück, wenn beide Seiten äquivalente Sets sind (verwandelt eine Liste automatisch in ein Set). An diesem Punkt muss es nur noch logisch invertiert werden.
quelle
$_
mit nur.
C ++, 82 Bytes
Die Funktion t (a) liefert die Antwort. Verwendet ein Int als Set. Schön gedruckt:
quelle
#include<set>
undusing namespace std;
in den Code und die Byteanzahl des Golfspiels aufnehmen#include<set>
stattalgorithm
R
657970 BytesNimmt
n
von stdin, teiltn
undn^3
in einzelne Ziffern auf und vergleicht die beiden Sätze. Verwendet dasgmp
Paket, um große Ganzzahlen zu verarbeiten (danke an Billywob für den Hinweis auf dieses Manko). Jetzt verwendetsubstring
zu zerschneidenn
undn^3
dank @MickyT für den Vorschlag. (Frühere Versionen verwendetscan
undgsub
auf eine hackige Weise.)quelle
n
), es sei denn, Sie verwenden eine Art BigInt-Paket. Siehe?.Machine
Details auf der größten ganzen Zahl und schweben usw. dies zum Beispiel zu sehen , vergleichen ,2600001^3
in R zu Wolframalphagmp
Paket dieses Problem lösen könnte.gmp::as.bigz()
, um große ganze Zahlen zu verarbeiten.s=substring;setequal(s(n<-gmp::as.bigz(scan()),p<-1:1e4,p),s(n^3,p,p))
substring
dass man das so machen kann (ich habe es immer nur benutztsubstr
). Die Antwort wurde bearbeitet, um Ihren Vorschlag jetzt zu berücksichtigen.C ++ 14, 93 Bytes
Port meiner C-Antwort , funktioniert für große Nummern (Anruf mit
L
Suffix).quelle
Haskell, 47 Bytes
Anwendungsbeispiel:
f 102343
->False
.Verwendet Sets aus dem
Data.Set
Modul. Die Hilfsfunktions
wandelt eine Zahl in eine Zeichenfolgendarstellung um und erstellt dann eine Menge aus den Zeichen.quelle
s$n^3
?(s n==s) (n^3)
was einen Tippfehler gibt.Brachylog , 11 Bytes
Probieren Sie es online!
Vielen Dank an @DestructibleWatermelon für den Hinweis auf ein Problem mit meiner ursprünglichen Antwort.
Erläuterung
quelle
PowerShell v2 +,
94 bis93 Byte(Newline zur Verdeutlichung, nicht in bytecount enthalten)
Die erste Zeile definiert
f
alsfilter
(ähnlich genug für eine Funktion, damit wir hier nicht auf Einzelheiten eingehen), die Eingaben nimmt$n
und Folgendes ausführt:Die zweite Zeile nimmt die Eingabe
$args
, führtf
auf, und überprüft , ob es-eq
ual zuf
auf ausgeführt in$x
Würfel geschnitten. Beachten Sie die explizite[bigint]
Besetzung, ansonsten erhalten wir das Ergebnis in wissenschaftlicher Notation zurück, was offensichtlich nicht funktioniert.Das boolesche Ergebnis verbleibt in der Pipeline, und die Ausgabe ist implizit.
Ein Byte dank @ConnorLSW gespeichert
quelle
"$n"[0..99]
stattdessen[char[]]"$n"
ein Byte speichern, da die größte zu verarbeitende Zahl nur etwa 20 Zeichen lang ist.char[]
Konvertierung ein Kinderspiel. Der Rest Ihres Codes ist so gut wie ich es mir vorstellen kann. Wenn es eine Möglichkeit gäbe, Arrays zu vergleichen, könnten Sie dies tun Verwenden Sie so etwas wie("$n"[0..99]|group).Name
zum Sparen von Lasten, abercompare
nicht gerade schnell und einfach zum Golfen.Groovy, 35
51Zeichen / ByteIch war traurig, Groovy nicht dabei zu haben, und hier ist mein ursprünglicher 51-Byte-Versuch:
def x(def n){"$n".toSet()=="${n.power(3)}".toSet()}
Neu geschrieben als anonymer 35-Byte-Abschluss und mit
**
zur Potenzierung, dank manatwork:{"$it".toSet()=="${it**3}".toSet()}
Einige Testfälle für die ursprüngliche Funktion:
Eine benannte Schließung
c
könnte wie folgt aufgerufen werden:println c.call(107624)
. Die anonyme 35-Byte-Schließung könnte folgendermaßen lauten:println ({"$it".toSet()=="${it**3}".toSet()}(107624))
Ausgänge:
Bitte beachten Sie: Ich habe gerade erfahren, dass es so etwas wie Codegolf gibt, also habe ich es hoffentlich richtig gemacht!
quelle
def c={"$it".toSet()=="${it.power(3)}".toSet()}
**
Operator zur Potenzierung.x(107624)
durchc.call(107624)
**
bringt es auf schöne 35 Zeichen / Bytes:{"$it".toSet()=="${it**3}".toSet()}
Ruby, 48 Bytes
quelle