Haskell hat diese nette (-aussehende) Funktion, mit der Sie drei Zahlen eingeben und daraus eine arithmetische Folge ableiten können. Zum Beispiel [1, 3..27]
ist äquivalent zu [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27]
.
Das ist cool und alles andere als arithmetische Sequenzen sind ziemlich einschränkend. Ergänzung pfft . Multiplikation ist da, wo es ist. Wäre es nicht cooler, wenn geometrische Sequenzen [1, 3..27]
zurückkehren würden [1, 3, 9, 27]
?
Herausforderung
Schreiben Sie ein Programm / eine Funktion , das / die drei positive ganze Zahlen a , b und c annimmt und ausgibt, wobei x die größte ganze Zahl ≤ c ist , die dargestellt werden kann als wobei n eine positive ganze Zahl ist.[a, b, b × (b ÷ a), b × (b ÷ a)2, ..., x]
b × (b ÷ a)n
Das heißt, die Ausgabe sollte r sein , so dass:
r0 = a
r1 = b
rn = b × (b ÷ a)n-1
rlast = greatest integer ≤ c that can be represented as b × (b ÷ a)n
where n is a positive integer
Spezifikationen
- Standard I / O - Regeln gelten .
- Standardlücken sind verboten .
- b wird immer durch teilbar sein ein .
- a < b ≤ c
- Bei dieser Herausforderung geht es nicht darum, den kürzesten Ansatz in allen Sprachen zu finden, sondern darum, den kürzesten Ansatz in jeder Sprache zu finden .
- Ihr Code wird in Bytes bewertet , normalerweise in der Codierung UTF-8, sofern nicht anders angegeben.
- Eingebaute Funktionen (Mathematica hat möglicherweise eins: P), die diese Sequenz berechnen, sind zulässig, es wird jedoch empfohlen, eine Lösung einzuschließen, die nicht auf einer eingebauten basiert.
- Erklärungen, auch für "praktische" Sprachen, sind erwünscht .
Testfälle
a b c r
1 2 11 [1, 2, 4, 8]
2 6 100 [2, 6, 18, 54]
3 12 57 [3, 12, 48]
4 20 253 [4, 20, 100]
5 25 625 [5, 25, 125, 625]
6 42 42 [6, 42]
In ein paar besseren Formaten:
1 2 11
2 6 100
3 12 57
4 20 253
5 25 625
6 42 42
1, 2, 11
2, 6, 100
3, 12, 57
4, 20, 253
5, 25, 625
6, 42, 42
Antworten:
Schale , 8 Bytes
Die Eingabe erfolgt in der Reihenfolge b, c, a . Probieren Sie es online!
Erläuterung
Der Kontrollfluss in diesem Programm ist etwas schwer zu verfolgen. Zunächst wird b ganz rechts eingespeist
/
, wodurch eine Funktion erzeugt wird/b
, die durch b dividiert wird . Als nächstes~
teilt den verbleibenden Programm in drei Teile:~(↑)(≤)(Ṡ¡o//b)
. Dies speist c zu≤
und a zuṠ¡o//b
und kombiniert die Ergebnisse mit↑
. Das Ergebnis von≤c
ist eine Funktion, die prüft, ob ihr Argument höchstens c ist , und↑≤c
das längste Präfix von Elementen verwendet, für die dies gilt.Es bleibt zu zeigen, wie
(Ṡ¡o//b)a
die gewünschte unendliche Liste ausgewertet wird. Der Teil in Klammern ist unterteilt inṠ(¡)(o//b)
. DannṠ
speist ein ano//b
, führt das Ergebnis zu¡
, und gibt dann ein in seine zweite Argument. Der Ausdruck(o//b)a
gibt eine Funktion an, die eine Zahl annimmt und durch a / b dividiert , und¡
iteriert diese Funktion bei ihrem zweiten Argument, nämlich a .Hier ist eine Reihe von Transformationen, die die Erklärung veranschaulichen:
Alternative Lösung unter Verwendung expliziter Variablen in der Reihenfolge a, b, c :
quelle
Python 2 , 42 Bytes
Probieren Sie es online!
Rekursiver Ansatz,
4241 Bytes-1 Byte dank ovs
Probieren Sie es online!
quelle
Proton , 35 Bytes
Probieren Sie es online!
quelle
JavaScript (ES6),
4137 Byte4 Bytes dank @Neil gespeichert
Übernimmt die Eingabe als
(b,c)(a)
.Testfälle
Code-Snippet anzeigen
Kommentiert
quelle
(b,c)=>g=a=>a>c?[]:[a,...g(b,b*=b/a)]
.Pari / GP , 38 Bytes
Probieren Sie es online!
quelle
Wolfram Language (Mathematica) , 22 Byte
Probieren Sie es online!
quelle
Python 3,
93907473 BytesProbieren Sie es online
Vielen Dank an Rod und user202729, die mir geholfen haben, einige Bytes zu reduzieren!
quelle
def + return -> lambda
. Python-Tipps.import*
.while i<=c:i++
(stattdessen Liste Verständnis + Protokoll) verwenden, um eine Menge von Bytes zu speichernOktave ,
3835 BytesProbieren Sie es online!
Es stellt sich heraus, dass der MATL-Ansatz von LuisMendo trotz
log
dreimaliger Wiederholung auch 3 Byte in Octave einspart .quelle
Perl 6 ,
2624 BytesProbieren Sie es online!
Der Sequenzoperator von Perl 6
...
kann geometrische Reihen nativ ableiten.Update: ... kann es , ist aber in dieser Situation nicht schlussfolgernd etwas kürzer.
quelle
05AB1E , 12 Bytes
Eingabe in der Reihenfolge
c,b,a
Probieren Sie es online!
Erläuterung
quelle
MATL , 17 Bytes
Probieren Sie es online!
Nur um den Ball in MATL ins Rollen zu bringen. Ich kann mir nicht vorstellen, dass es keinen weniger ausführlichen Weg gibt, dies zu lösen.
quelle
Haskell, 35 Bytes
Probieren Sie es online!
quelle
exp<$>[...]
)MATL , 12 Bytes
Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
quelle
a
undc
(ich habe mit vielen fehlgeschlagenen Versuchen angefangeny/i
), aber mit dieser Methode halten Sie alles sauber zusammen.Perl, 38 Bytes
Include
+3
for-n
(dasuse 5.10.0
Freischalten der Perl 5.10 Features ist kostenlos)Führen Sie dann Folgendes aus:
quelle
Rot , 50 Bytes
Probieren Sie es online!
quelle
Japt , 14 Bytes
Versuch es
Erläuterung
quelle
Sauber , 63 Bytes
Probieren Sie es online!
quelle
TI-BASIC, 31 Bytes
Nimmt Eingaben vom Benutzer auf und gibt sie aus
Ans
. Ich habe nach n in c = b n / a n-1 aufgelöst und n = 1 + ln (c / b) / ln (b / a) erhalten. Das ist das Gleiche wie n = 1 + log b / a (c / b). Zum Golfen beginne ich meine Sequenz bei -1 und beende sie bei n-1 anstatt bei 0 bis n.quelle
APL (Dyalog Unicode) , 38 Byte
Probieren Sie es online!
Präfix Dfn. Nimmt die Eingabe in die richtige Reihenfolge
a b c
und verwendet⎕IO←0
( I ndex O rigin)Vielen Dank an @ErikTheOutgolfer für das Rasieren von 6 Bytes, bevor ich es überhaupt gepostet habe.
Wie?
quelle
Stax , 14 Bytes CP437
16 Bytes beim Auspacken,
Online ausführen und debuggen!
Nimmt Eingaben in Form von
[b, a, c]
.Ich bin mir ziemlich sicher, dass @recursive bessere Lösungen bietet.
Erläuterung
quelle
SILOS , 73 Bytes
Probieren Sie es online!
Wir lesen die drei Zahlen. Berechnen Sie das gemeinsame Verhältnis aus der zweiten und der ersten Zahl. Dann durchlaufen wir die Reihe, bis wir größer als die Obergrenze sind.
quelle
C (gcc), 82 Bytes
Probieren Sie es online!
Berechnet und druckt
r_n = b^n/a^(n-1)
bisr_n > c
.Muss mit kompiliert werden
-lm
!quelle
n;f(a,b,c){for(float r=n=0;r=pow(b/a,n++)*a,r<=c&&printf("%f ",r););}
APL (Dyalog) , 23 Byte ( SBCS )
Dies nimmt Argumente ab links und c rechts,
Probieren Sie es online!
Es gibt wahrscheinlich einen kürzeren Weg, aber ich fand das
÷\
süß.Erklärt:
{...}
Anonome Funktion ⍺ ista b
,⍵
istc
. Sagen wira b c = 2 6 100
⌽⍺
Reverse⍺
:6 2
⍵⍴
Wiederholen Sie die⍵
Zeiten:6 2 6 2 6 2 6 2 ...
÷\
Reduzieren Sie durch Unterteilung nach Präfixen:6 (6÷2) (6÷(2÷6)) (6÷(2÷(6÷2))).. = 6 3 18 9 54 ..
⍺,
Voranstellen⍺
:2 6 6 3 18 9 54 27 162 81 ...
⊣/⍵2⍴
Holen Sie sich jedes andere Element (plus einige nachfolgende Wiederholungen):⍵2⍴
Erstellen Sie eine⍵
Zeilen- /2
Spaltenmatrix aus2 6 6 3 18 9 54 ...
⊣/
Holen Sie sich die erste Spalte⊆⊢
Teilen Sie das Array in Blöcke wo⍵∘≥
⍵
ist größer oder gleich allen Elementen⊃
Nehmen Sie den ersten solchen Blockquelle