Haskell a cette fonctionnalité soignée où vous pouvez lui donner trois nombres et en déduire une séquence arithmétique. Par exemple, [1, 3..27]
est équivalent à [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27]
.
C'est cool et tout sauf les séquences arithmétiques sont assez limitantes. Addition, pfft . La multiplication est là où elle en est. Ne serait-il pas plus cool s'il faisait des séquences géométriques comme le [1, 3..27]
retour [1, 3, 9, 27]
?
Défi
Écrivez un programme / une fonction qui prend trois entiers positifs a , b et c et produit où x est le plus grand entier ≤ c qui peut être représenté comme où n est un entier positif.[a, b, b × (b ÷ a), b × (b ÷ a)2, ..., x]
b × (b ÷ a)n
Autrement dit, la sortie doit être r , telle que:
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
Caractéristiques
- Les règles d'E / S standard s'appliquent .
- Les failles standard sont interdites .
- b sera toujours divisible par a .
- a < b ≤ c
- Ce défi ne consiste pas à trouver l'approche la plus courte dans toutes les langues, mais plutôt à trouver l' approche la plus courte dans chaque langue .
- Votre code sera noté en octets , généralement dans le codage UTF-8, sauf indication contraire.
- Les fonctions intégrées (Mathematica peut en avoir une: P) qui calculent cette séquence sont autorisées, mais il est recommandé d' inclure une solution qui ne repose pas sur une fonction intégrée.
- Des explications, même pour les langues "pratiques", sont encouragées .
Cas de test
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]
Dans quelques meilleurs formats:
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
Réponses:
Husk , 8 octets
L'entrée est dans l'ordre b, c, a . Essayez-le en ligne!
Explication
Le flux de contrôle dans ce programme est un peu difficile à suivre. Tout d'abord, b est alimenté à l'extrême droite
/
, produisant une fonction/b
qui se divise par b . Ensuite,~
divise le reste du programme en trois parties:~(↑)(≤)(Ṡ¡o//b)
. Cela alimente c to≤
et a toṠ¡o//b
et combine les résultats avec↑
. Le résultat de≤c
est une fonction qui vérifie si son argument est au plus c , et↑≤c
prend le préfixe le plus long des éléments pour lesquels cela est valable.Il reste à montrer comment
(Ṡ¡o//b)a
s'évalue à la liste infinie souhaitée. La partie entre parenthèses est divisée enṠ(¡)(o//b)
.Ṡ
Transmet ensuite un ào//b
, transmet le résultat à¡
, puis donne un à son deuxième argument. L'expression(o//b)a
donne une fonction qui prend un nombre et le divise par a / b , et¡
itère cette fonction sur son deuxième argument, qui est a .Voici une série de transformations qui visualisent l'explication:
Solution alternative utilisant des variables explicites dans l'ordre a, b, c :
la source
Python 2 , 42 octets
Essayez-le en ligne!
Approche récursive,
4241 octets-1 octet grâce aux ovs
Essayez-le en ligne!
la source
Proton , 35 octets
Essayez-le en ligne!
la source
JavaScript (ES6),
4137 octets4 octets enregistrés grâce à @Neil
Prend l'entrée comme
(b,c)(a)
.Cas de test
Afficher l'extrait de code
Commenté
la source
(b,c)=>g=a=>a>c?[]:[a,...g(b,b*=b/a)]
.Pari / GP , 38 octets
Essayez-le en ligne!
la source
Wolfram Language (Mathematica) , 22 octets
Essayez-le en ligne!
la source
Python 3,
93907473 octetsEssayez-le en ligne
Merci à Rod et à user202729 de m'avoir aidé à réduire pas mal d'octets!
la source
def + return -> lambda
. Conseils Python.import*
.while i<=c:i++
(à la place list comprehension + log) pour économiser beaucoup d'octetsOctave ,
3835 octetsEssayez-le en ligne!
Il s'avère que l'approche MATL de @ LuisMendo enregistre également 3 octets dans Octave, bien qu'elle se répète
log
trois fois.la source
Perl 6 ,
2624 octetsEssayez-le en ligne!
Opérateur de séquence de Perl 6
...
peut déduire nativement des séries géométriques.Mise à jour: ... C'est possible , mais dans cette situation, ne pas en déduire, c'est un peu plus court.
la source
05AB1E , 12 octets
Saisie dans l'ordre
c,b,a
Essayez-le en ligne!
Explication
la source
MATL , 17 octets
Essayez-le en ligne!
Juste pour faire rouler la balle en MATL. Je ne peux pas imaginer qu'il n'y ait pas de manière moins verbeuse de résoudre cela.
la source
Haskell, 35 octets
Essayez-le en ligne!
la source
exp<$>[...]
)MATL , 12 octets
Essayez-le en ligne! Ou vérifiez tous les cas de test .
Explication
la source
a
etc
(j'ai de nombreuses tentatives infructueuses en commençanty/i
), mais en utilisant cette méthode, vous gardez soigneusement tout ensemble.Perl, 38 octets
Inclure
+3
pour-n
(leuse 5.10.0
déverrouillage des fonctionnalités de Perl 5.10 est gratuit)Exécutez ensuite en tant que:
la source
Rouge , 50 octets
Essayez-le en ligne!
la source
Japt , 14 octets
Essayez-le
Explication
la source
Nettoyer , 63 octets
Essayez-le en ligne!
la source
TI-BASIC, 31 octets
Prend l'entrée de l'utilisateur et les sorties
Ans
. J'ai résolu pour n dans c = b n / a n-1 , obtenant n = 1 + ln (c / b) / ln (b / a). C'est la même chose que n = 1 + log b / a (c / b). Aux fins du golf, je commence ma séquence à -1 et la termine à n-1 plutôt que de 0 à n.la source
APL (Dyalog Unicode) , 38 octets
Essayez-le en ligne!
Préfixe Dfn. Prend les données en ordre
a b c
et utilise⎕IO←0
( I ndex O rigin)Merci à @ErikTheOutgolfer d'avoir rasé 6 octets avant même de l'avoir posté.
Comment?
la source
Stax , 14 octets CP437
16 octets lors du déballage,
Exécutez et déboguez en ligne!
Prend entrée sous la forme de
[b, a, c]
.Je suis sûr que @recursive a de meilleures solutions.
Explication
la source
SILOS , 73 octets
Essayez-le en ligne!
Nous avons lu les trois chiffres. Calculez le rapport commun par le deuxième nombre / premier. Ensuite, nous parcourons la série jusqu'à ce que nous soyons supérieurs à la limite supérieure.
la source
C (gcc), 82 octets
Essayez-le en ligne!
Calcule et imprime
r_n = b^n/a^(n-1)
jusqu'àr_n > c
.Doit être compilé avec
-lm
!la source
n;f(a,b,c){for(float r=n=0;r=pow(b/a,n++)*a,r<=c&&printf("%f ",r););}
APL (Dyalog) , 23 octets ( SBCS )
Cela prend les arguments ab à gauche et c à droite,
Essayez-le en ligne!
Il y a probablement un chemin plus court, mais je pensais que
÷\
c'était mignon.Expliqué:
{...}
La fonction autonome ⍺ esta b
,⍵
estc
. Disonsa b c = 2 6 100
⌽⍺
Inverse⍺
:6 2
⍵⍴
Répétez⍵
fois:6 2 6 2 6 2 6 2 ...
÷\
Réduire par division sur les préfixes:6 (6÷2) (6÷(2÷6)) (6÷(2÷(6÷2))).. = 6 3 18 9 54 ..
⍺,
Prepend⍺
:2 6 6 3 18 9 54 27 162 81 ...
⊣/⍵2⍴
Obtenez tous les autres éléments (plus quelques répétitions de fin):⍵2⍴
Créer une matrice de⍵
lignes et de2
colonnes à partir de2 6 6 3 18 9 54 ...
⊣/
Obtenez la première colonne⊆⊢
Divisez le tableau en blocs où⍵∘≥
⍵
est supérieur ou égal à tous les éléments⊃
Prenez le premier blocla source