Der Gewinner (ziemlich offensichtlich) ist Dennis ♦, der Jelly mit 10 Bytes verwendet hat!
Diese Herausforderung wird es hier weiterhin geben, die Ergebnisse werden jedoch nicht mehr berücksichtigt.
Der Antriebsstrang einer Zahl ist ein Konzept von John Conway (der auch für Conways Game of Life bekannt ist, aber darum geht es nicht). Es ist wie folgt definiert:
Für jede Zahl ... ist der Antriebsstrang der Zahl ... (dh jede zweite Ziffer von links nach rechts ist eine Potenz der vorhergehenden Ziffer). Dieser Vorgang wird wiederholt, bis das Ergebnis eine einzelne Ziffer ist.
BEISPIELE
2592 => (2^5)(9^2) = 2592 <= Cannot be further decomposed
135 => (1^3)5 = 5
1234 => (1^2)(3^4) = 81 => (8^1) = 8
1100 => (1^1)(0^0) = 1 # (0^0) = 1
-42 => -42 # Negative numbers output the input
Ihre Herausforderung besteht darin, für eine beliebige Zahl n
in der Eingabe powertrain(n)
(dh n
nachdem die Zerlegung des Antriebsstrangs abgeschlossen ist) als Ausgabe zurückzugeben.
Dies ist Codegolf, daher gewinnt die kürzeste Anzahl an Bytes.
HAFTUNGSAUSSCHLUSS:
- Sie können eine ungerade Anzahl von Ziffern in der Eingabe haben, die letzte Ziffer hat einfach keine Potenz.
- 0 ^ 0 ist 1, denn wenn es 0 wäre, würden viele Zahlen sofort zu 0 oder 1 zusammenfallen.
- Wenn die Zahl in irgendeinem Teil des Berechnungsprozesses unzerstörbar ist (z. B. wenn sie damit endet
2592
), können Sie die Zahl einfach ausgeben. - Wenn die Eingabe
< 10
(dh alle einstelligen Zahlen und Negative) ist, geben Sie die Eingabe aus.
Ich werde wahrscheinlich nach ein paar Stunden einen Gewinner bekannt geben .
Aktuelle Rangliste:
- Jelly ( Dennis ♦ ): 10
- Pyth ( DenkerAffe ): 16
- MATL ( Don Müsli ): 21
- Perl ( Ton Hospel ): 42
- Haskell ( Damien ): 64
- Javascript ES6 ( edc65 ): 71
- Mathematica ( Murphy ): 74
- Mathematica ( LegionMammal978 ) und Haskell ( Renzeee ): 77
- Python 2 ( Mathematiker ): 111
- Python 3 ( Erwan ): 161
- Java 8 ( blau ): 229
- Oracle SQL 11.2 ( Jeto ): 456
- Befunge '93 ( Lex ): 490
1100
und-42
Es ist leicht, Regeln für Randfälle zu übersehen, wenn sie in den Testfällen nicht angezeigt werden.Antworten:
Jelly,
15141210 BytesProbieren Sie es online!
Wie es funktioniert
quelle
n
Zeiten verkürzt werden , aber ich habe keinen Beweis, dass es für alle möglichen Eingaben funktioniert.D*2/Pµ¡
Haskell,
6764 Bytes(>> = (==)) >> = bis $ p.show eine unbenannte Funktion ist, die eine Ganzzahl als Eingabe verwendet und ihren Antriebsstrang zurückgibt .
3 Bytes dank Zgarb gespart
quelle
((==)=<<g)
spart zwei Bytes über(\n->g n==n)
.(>>=(==))>>=
sieht wirklich aus wie ein Zug!Perl, 42
48BytesEnthalten Sie +2 für
-lp
(Sie können das auch fallen lassen,-l
aber ich mag Zeilenumbrüche)Mit Eingabe auf STDIN ausführen, z
powertrain.pl
:(Bei älteren Perls können Sie auch den Abstand zwischen dem regulären Ausdruck und bis löschen.)
Dies wird den Fixpunkt nicht verarbeiten können,
24547284284866560000000000
aber ein so großer Wert wird sowieso nicht funktionieren, da zu diesem Zeitpunkt Perl auf Exponentialschreibweise umgestellt wurde.Die obige Version funktioniert in der Tat schnell (höchstens
2592
Schleifen) für alle Zahlen, die Perl ohne Exponentialschreibweise darstellen kann, da nachgewiesen ist, dass es keine festen Punkte zwischen2592
und gibt24547284284866560000000000
( https://oeis.org/A135385 ).Dies setzt jedoch etwas Unbewiesenes voraus. Im Prinzip könnte es eine Reduzierung geben, die mehr als
X=10^7
Schritte dauert (es wird vermutet, dass kein nicht festgelegter Punkt mehr als 16 Schritte dauert, https://oeis.org/A133503 ), deren Wert unterX
(aber über10^7
) sinkt und dann steigt nochmal. In diesem Fall muss ich auf Folgendes zurückgreifen:Erläuterung
Der Code setzt
**
und*
(abwechselnd) zwischen den Ziffernso
2592
wird2**5*9**2
und12345
wird1**2*3**4*5
. Dies sind gültige Perl-Ausdrücke, mit denen ausgewertet werden kann(
0**0
ist1
in Perl). Dann legen Sie einfach eine Schleife um das mit einem Zähler, der es abläuft. Da die Werte mit Ausnahme der Fixpunkte extrem schnell sinken, konvergiert die Antriebsstrangreihe, bevor der Zähler die Chance erhält, wirklich in Gang zu kommenquelle
Pyth,
25181116 BytesProbieren Sie es hier aus!
714 Bytes mit Hilfe von @Jakube gespeichertErläuterung
quelle
Python 2, 111 Bytes
Die Idee ist, eine Zeichenfolge zu erstellen, bei der die Ziffern
n
durch abwechselnde Operationen zwischen*
und**
und danneval
diese Zeichenfolge getrennt werden. (Andere Lösungen verwenden dieselbe Idee. Siehe beispielsweise die Perl-Antwort von Ton Hospel .)Die Operation wechselt also zwischen
'**'[0:]
, was ist**
und'**'[-1:]
was ist gerecht*
.Am Ende der
for
-Schleife endet die Zeichenfolge jedoch mit einer Operation (der einen oder anderen). Daher müssen wir entweder die letzte Operation löschen oder eine weitere Ziffer hinzufügen, damit die Zeichenfolge einen Sinn ergibt.Glücklicherweise
1
funktioniert das Anhängen eines am Ende, unabhängig davon, welche Operation zuletzt ausgeführt wurde. (Wenn Sie möchten,1
ist dies eine einseitige Identität von rechts, sowohl für die Multiplikation als auch für die Potenzierung. Eine andere Art, dies zu sagen, ist diepowertrain(n) == powertrain(10*n + 1)
für allen>0
.)eval
Entspricht das Ergebnis von zufällig der Eingabe (wie in einem Längenzyklus1
), wird die Funktion beendet. Andernfalls ruft die Funktion das Ergebnis auf. (Es wird für immer an jedem Zyklus der Länge hängen> 1
, aber nach den Kommentaren des OP darf ich davon ausgehen, dass es keine solchen Zyklen gibt.)(Note: the above explanation works for single-digit positive integers, since a single-digit input
n
will be completed ton**1
which will result in a1
-cycle. However, we also need to accept non-positive input, so there's a condition at the beginning that short-circuits if the input is less than1
. We could eliminate that line, and save 17 bytes, if the input were guaranteed to be non-negative.)quelle
Java 8,
265244229 BytesDies ist meine erste Antwort, aber ich habe diese Seite eine Weile gelesen und denke, ich weiß, was ich tue. Zumindest schlägt es befunge und SQL ...
Wie andere Antworten auch, funktioniert dies leider nicht für 24547284284866560000000000, da in Java Einschränkungen für die Größe von ganzen Zahlen eingebaut sind.
36 Bytes dank @JackAmmo gespeichert
Ungolfed Erklärung
quelle
if(n<10)return n;else{...}
the else is unneccessary since logically everything in that else block would only run anyway when n<10 is false. Removing the else and the 2 matching braces will save you 6 bytes. There's a similar situation with your last if...elseif(n==t)return n;else return p(t);
remove the else and the space after it to save another 5 bytes. In fact you can shorten it even further if you use the triadic operator instead of the if...else like soreturn n==t?n:p(t);
int t=i=1,s=(int)Math.log10(n)+1,r[]=new int[s];for(;i<=s;){...}for(i=0;...)...
JavaScript (ES6) 71
A recursive function, stopping when a repetition is found. This could not work for longer loops (2 or more value repeating) but it seems this could not happen, at least in the limited range of javascript number precision (17 digits)
Test
quelle
+'1'
to kill two birds with one stone!replace
was 1 byte longer:f=n=>`${n}1`.replace(/../g,([x,y])=>r*=Math.pow(x,y),r=1)&&n-r?f(r):n
Mathematica, 77 bytes
Anonymous function. Not too complicated.
quelle
Befunge
720490 bytesCouldn't resist to do one more after the Never tell me the odds thing. So, I've optimized the "ASCII-fier" of the previous one. In this case I saw no need to let the instruction pointer run over the digits to read them, so I haven't taken the effort to make them human readable. So it's more of a digitifier, now.
Again, if you guys want an explanation, let me know in the comments, I'll try to create some helpful descriptions. You can copy paste the code into the interpreter. I've found that the example 24547284284866560000000000 outputs 0, but that seems to be a problem with getting such a large value from a point on the grid, as you can clearly see the correct value being stored in the final steps.
This version also supports negative input. It's a great improvement on the previous version, if I say so myself. At least 1 bug was fixed and the size was reduced greatly.
quelle
Haskell,
1007977 bytesNot golfed:
This function splits the input into digits and does the trick via
i
.EDIT: Thanks to nimi for some tips.
quelle
i(a:[])=a
isi[a]=a
, b) no need formax 1
, because0^0 = 1
in Haskell, c) replace(:[])
withpure
, d) move thelet
withing
into a separate function and replace theif ... then ... else
with guards:h=i.map(read.pure).show ; g x|x==h x=x|1<2=h x
pure
is not in Prelude, but the rest of the tips work, thanks. I was trying to do it with guards, but ended up using;
before the guard and that didn't work, but now I know how it should work.pure
is in the Prelude that comes with base-4.8.2.0. Don't know when it was introduced. You don't need the( )
ini([a])=a
.Mathematica, 74 bytes
Explanation
This solution uses a helper function
f
, which takes the digits of the number as arguments and applies one iteration of the power train operation. The last line is a pure function that is crafted to exploit theReplaceRepeated
function (or//.
for short), which applies a rule to an expression (in this case the argument#
of the pure function) until it doesn't change anymore. The rulei_/;i>0:>f@@IntegerDigits@i
replaces anything non-negative with the functionf
applied to its decimal digits.quelle
:=
)SetDelayed::write: Tag Times in n f[a_,b_,c___] is Protected. >>
,Set::write: Tag Times in 1 f[n_] is Protected. >>
The second error disappears when i use:=
vs=
.;
s instead of the line-breaks:0~f~0=f[]=1;f@n_=n;f[a_,b_,c___]:=f[c]a^b;#//.i_/;i>0:>f@@IntegerDigits@i&
MATL, 21 bytes
It may take a few seconds to produce the output.
EDIT (July 30, 2016): the linked code replaces
9L
by1L
to adapt to recent changes in the language.Try it online!
This uses the following two tricks to reduce byte count at the expense of code efficiency:
n
times instead of waiting until a cycle is found. This is acceptable as per OP's comments.1
would have to be appended to complete the final power operation. Instead of that, the number of added1
is the number of digits. This ensures an even number, so all power operations can be done (even if the last ones are unnecessary1^1
operations).Code:
quelle
a, b, a, b
ad infinitum (more than one term). If one term is repeated, then you should output that number. Sorry if that wasn't really clear.2592
into the input, it doesn't seem to output anything for quite a while.Python 3,
169161 bytesUngoldfed
Results
quelle
;
This way you saves you the intendation whitespaces. Also you can put the body of the for loop on that same line.def f(s,o=[['1',s]["-"in s]],n=int):
while s not in o:
o+=[s];s+=1*(len(s)%2<1);r=1
for i,j in zip(s[::2],s[1::2]):r*=n(i)**n(j)
s=str(r)
return o[-1]
o=[['1',s]["-"in s]]
in default argument don't work for me it raise a error ` s not defined`Oracle SQL 11.2, 456 bytes
Un-golfed
v is a recursive view, parameters are
n : number to split in 2 digits parts
c : number of 2 digits parts
i : current 2 digits part to compute
f : string concatenating the powers with * as separator
t : evaluation of f
The DECODEs switch to the next number to split and compute when all the parts of the current number are done.
XMLTABLE(f) takes an expression an evaluates it, putting the result in the pseudo column "column_value". It's the golfed version of http://tkyte.blogspot.fr/2010/04/evaluating-expression-like-calculator.html
CYCLE is the oracle build in cycle detection and is used as the exit condition.
Since the result for :1<10 is :1 and v returns no row for those cases, SUM forces a row with NULL as the value. NVL returns :1 as the result if the row is null.
quelle