Étant donné deux entiers supérieurs à un, A et B, affichez quatre expressions mathématiques dans cet ordre:
L'expression simple A ^ B (A à la puissance B). par exemple si A = 2 et B = 3
2^3
,.L'expansion de A ^ B en termes de multiplications répétées de A. par exemple
2*2*2
.L'expansion de A ^ B en termes d'additions répétées de A. par exemple
2+2+2+2
.L'expansion de A ^ B en termes d'additions répétées de 1. par exemple
1+1+1+1+1+1+1+1
.
Les quatre expressions peuvent être sorties de n'importe quelle manière raisonnable tant qu'elles sont en ordre et clairement distinctes. Par exemple, vous pouvez les mettre dans une liste ou les imprimer sur des lignes distinctes
2^3
2*2*2
2+2+2+2
1+1+1+1+1+1+1+1
ou peut-être sur une ligne séparée par des signes égaux:
2^3=2*2*2=2+2+2+2=1+1+1+1+1+1+1+1
Des espaces peuvent être insérés à côté des opérateurs mathématiques afin
2^3 = 2 * 2 * 2 = 2 + 2 + 2 + 2 = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
serait une sortie également valide lorsque A = 2 et B = 3.
Vous pouvez utiliser d' autres symboles pour ^
, *
et +
, mais seulement si les nouveaux symboles sont plus idiomatiques pour votre langue (par exemple , au **
lieu de ^
en Python).
Vous pouvez supposer que A et B sont suffisamment petits pour que A ^ B ne déborde pas du type entier par défaut de votre langue (étant donné que ce type a un maximum raisonnable, 255 au moins).
Le code le plus court en octets gagne.
Cas de test
Une sortie par ligne. L'entrée peut être déduite car la première expression est toujours A ^ B.
2^2 = 2*2 = 2+2 = 1+1+1+1
2^3 = 2*2*2 = 2+2+2+2 = 1+1+1+1+1+1+1+1
2^4 = 2*2*2*2 = 2+2+2+2+2+2+2+2 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
2^5 = 2*2*2*2*2 = 2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
3^2 = 3*3 = 3+3+3 = 1+1+1+1+1+1+1+1+1
3^3 = 3*3*3 = 3+3+3+3+3+3+3+3+3 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
3^4 = 3*3*3*3 = 3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
3^5 = 3*3*3*3*3 = 3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
4^2 = 4*4 = 4+4+4+4 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
4^3 = 4*4*4 = 4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
10^2 = 10*10 = 10+10+10+10+10+10+10+10+10+10 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
13^2 = 13*13 = 13+13+13+13+13+13+13+13+13+13+13+13+13 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
la source
=
à gauche3
.2^3
qu'un format d'entrée valide? Ou doit-il être séparé par un espace / virgule / saut de ligne ou quelque chose?Réponses:
Python 3.6 ,
8874 octets-2 octets grâce à Dada (utiliser
~
)-5 octets grâce à Erwan (utiliser les chaînes f de Python 3.6)
en ligne n'importe qui?
Comment?
Il s'agit d'une fonction sans nom prenant les deux entrées entières
a
etb
chacune supérieure à0
(même si la spécification ne concerne que celles supérieures à1
).Dans Python 3.6, une nouvelle fonctionnalité est disponible, à savoir les chaînes de caractères formatées ou "f-strings". Ceux-ci permettent la construction de chaînes évaluées au moment de l'exécution. Un leader
f
(ouF
) crée une telle construction, par exemplef"blah"
ouf'blah'
. À l'intérieur d'une chaîne f quelque chose entre une paire d'accolades,,{...}
est une expression à évaluer.En tant que tel
f"{a}^{b}={a}{f'*{a}'*~-b}={a}{f'+{a}'*~-a**~-b}=1"
évalue chacuna
,b
,a
,f'*{a}'*~-b
,a
, etf'+{a}'*~-a**~-b}
que les expressions, en gardant le^
,=
,=
et=1
sous forme de chaînes, tous qui obtient concaténés.Les expressions
a
etb
évaluent respectivement les représentations dea
etb
.Le
f'*{a}'
etf'+{a}'
à son tour sont également des chaînes f à l'intérieur de ces expressions, qui évaluent respectivementa
avec un interligne'*'
et un'+'
interlignePour créer le nombre requis d'
a
opérations et de s pour les portions*
et+
notez qu'il y aura desb
a
multiplications et desa**(b-1)
a
additions. Chaque cas nécessite alors un signe opérateur de moins que le nombre dea
s. Nous pouvons donc répéter les chaînes ff'*{a}
etf'+{a}'
(en utilisant*
) autant de fois qu'il y a d'opérateurs et ajouter chacun un seula
.(b-1)
est~-b
et(a**(b-1))-1
est~-a**~-b
.La même chose est faite pour les
1
s utilisant l'(a**b)-1
être~-**b
, mais nous n'avons pas besoin de la surcharge des chaînes f car1
est constante, donc une chaîne standard répétée est concaténée avec+
.Versions Python antérieures, 81:
Essayez-le en ligne!
la source
(b-1)
par~-b
?lambda a,b:f"{a}^{b}={(f'*{a}'*b)[1:]}={(f'+{a}'*a**~-b)[1:]}=1"+'+1'*~-a**b
Cubix,
238 234 217 151 110100 octets14 octets enregistrés grâce à ETHProductions
Étendu:
Essayez-le en ligne!
Essayez-le ici
Explication
Le code se compose de 8 étapes, avec deux boucles. Je vais passer en revue le code partie par partie.
Étape 1 (A ^ B)
Il s'agit du cube dont les parties non pertinentes pour la première étape ont été supprimées. Le point d'interrogation indique les non-opérations que l'IP visitera, pour rendre son chemin plus clair.
Maintenant, la pile ressemble à ceci:
A, B, A, B
Étape 2 (préparer la boucle d'impression)
La boucle d'impression prend 3 arguments (les 3 premiers éléments de la pile):
P
,Q
etR
.P
est le nombre de répétitions,Q
le séparateur (code de caractère) etR
le nombre à répéter. Heureusement, la boucle prend également en charge l'exigence que la chaîne résultante se termineR
, nonQ
.Nous voulons répéter
A*
exactement lesB
temps, donc le séparateur est*
. Notez que la pile commence en tant queA, B, A, B
. Encore une fois, j'ai supprimé toutes les instructions non pertinentes. L'IP commence auS
nord pointé.La pile est maintenant
A, B, B, *, A
.Étape 3/6/8 (la boucle d'impression)
Concept
L'IP entre dans la boucle
S
, pointant vers le nord, et quitte la boucle versE
, pointant à nouveau vers le nord. Pour cette explication, la pile est définie sur[..., A, B, C]
. Les instructions suivantes sont exécutées. Notez que l'IP ne peut pas quitter la boucle avant le point d'interrogation, donc les quatre premières instructions seront toujours exécutées.la mise en oeuvre
Voici à nouveau le cube, avec les parties non pertinentes supprimées. L'IP commence à
S
, pointant vers l'est.Comme vous pouvez le voir, l'IP passe par quatre instructions avant d'entrer dans la boucle. Puisque le code de caractère est à nouveau supprimé, nous atteignons la boucle avec la même pile exacte que celle que nous avons entrée dans cette partie.
À l'intérieur de la boucle, l'explication ci-dessus est valable.
Étape 4 (différenciation des IP)
Étant donné que nous utilisons la boucle ci-dessus plusieurs fois et qu'elles provoquent toutes la fin de l'IP au même endroit, nous devons différencier plusieurs exécutions. Tout d'abord, nous pouvons distinguer le séparateur (la première exécution a un
*
, tandis que les exécutions deux et trois ont un+
séparateur). Nous pouvons différencier les cycles 2 et 3 en vérifiant la valeur du nombre répété. Si tel est le cas, le programme doit se terminer.Première comparaison
Voici à quoi cela ressemble sur le cube. L'IP commence à S et pointe vers le nord. La pile contient
[..., * or +, A or 1, 0]
. Le numéro 1 indique où l'IP se terminera s'il s'agit de la première boucle (pointant vers le nord) et le numéro 2 indique où l'IP se terminera s'il s'agit de la deuxième (ou troisième) boucle (pointant vers l'est).Si l'IP est maintenant à
1
, la pile l'est[A, *, +, -1]
. Sinon, la pile l'est[A or 1, +, +, 0]
. Comme vous pouvez le voir, il y a toujours un inconnu dans la pile du deuxième cas, nous devons donc faire une autre comparaison.Deuxième comparaison
Parce que la propriété intellectuelle est passée à l' étape 5, les regards de la pile comme ceci:
[A^(B-1) or nothing, A or 1, +, +, 0]
. Si le premier élément l'estnothing
, le deuxième l'est1
, et l'inverse aussi. Le cube ressemble à ceci, avec l'IP commençant à S et pointant vers l'est. S'il s'agit de la deuxième boucle, l'IP finit parE
pointer vers l'ouest. Sinon, le programme frappe le@
et se termine.Les instructions exécutées qui ne font rien au flux de contrôle sont répertoriées ci-dessous.
La pile est maintenant
[A^B, +, A^(B-1), A-1]
, à condition que le programme ne se soit pas terminé.Étape 5 (préparation de "A +" (répétez A ^ (B-1)))
Malheureusement, Cubix n'a pas d'opérateur électrique, nous avons donc besoin d'une autre boucle. Cependant, nous devons d'abord nettoyer la pile, qui contient maintenant
[B, A, *, +, -1]
.Nettoyer
Voici à nouveau le cube. Comme d'habitude, l'IP commence à S (pointant vers le nord) et se termine à E, pointant vers l'ouest.
Calcul de A ^ (B-1)
Une autre boucle qui fonctionne à peu près comme la boucle d'impression, mais elle est un peu plus compacte. L'IP commence à
S
, pointant vers l'ouest, avec la pile[B, A, *]
. L'IP sort enE
pointant vers le nord.Le corps de la boucle est le suivant.
La pile résultante est
[A, A^(B-1), 0]
.Nettoyage de la pile (à nouveau)
Maintenant, nous devons revenir à la boucle d'impression, avec le haut de la pile contenant
[..., A^(B-1), +, A]
. Pour ce faire, nous exécutons ce qui suit. Voici à nouveau le cube,Étape 7 (préparation de la dernière boucle)
La pile est maintenant
[A^B, +, A^(B-1), A-1]
, l'IP commence àS
, va vers l'ouest et se termine àE
, va à droite.Les instructions exécutées:
La pile ressemble maintenant
[A^B, +, 1]
, et l'IP est sur le point d'entrer dans la boucle d'impression, nous avons donc terminé.la source
MATL , 46 octets
Essayez-le en ligne!
Allonger les limites de la "voie raisonnable" ici, mais les expressions sont séparées.
Explication
Première expression:
Deuxième expression:
Troisième expression:
Quatrième expression:
la source
JavaScript (ES7), 78 octets
Prend des entrées dans la syntaxe de currying
(a)(b)
. Génère une chaîne.Cas de test
Afficher l'extrait de code
la source
Rubis, 52 octets
la source
05AB1E , 30 octets
Explication:
Essayez-le en ligne!
la source
¹²'^ý ¹'*¹«²<׫¹²m¹÷¹s×S'+ý 1¹²m×S'+ý»
, pourquoi vous m'avez battu de 5 octets :(?¹²«¹²×¹¹²m©¹÷×1®×)vySN"^*++"èý,
est plus proche ;). Vous gagnez seulement par 1 maintenant;).C (gcc) ,
156149 bytes-2 octets si nous pouvons ignorer 0 puissances;
y=!!i
pourrait deveniry=1
Essayez-le en ligne!
la source
Java 7, 170 octets
Ungolfed:
Code de test:
Essayez ici.
Sortie:
la source
Pip ,
383534 octets33 octets de code, +1 pour l'
-n
indicateur.Prend A et B comme arguments de ligne de commande; imprime une expression par ligne. Essayez-le en ligne!
Explication
Ya**b
est le code de configuration: yanka**b
dans lay
variable. Après cela, nous avons une liste (en[]
) contenant nos quatre expressions:gJ'^
: prendre lag
liste complète des ar (ici, une liste contenanta
etb
) etJ
continuer sur^
aRLbJ'*
: UtilisationR
EPEATL
ist pour créer une liste avec desb
copies dea
, puisJ
OIN sur*
aRLy/aJ'+
: UtiliserRL
pour créer une listey/a
( par exemplea**(b-1)
) des copies dea
, puisJ
OIN sur+
1XyJ'+
:1
, chaîne multipliée pary
,J
huilée sur+
La liste est imprimée avec une nouvelle ligne comme séparateur grâce au
-n
drapeau.la source
Javascript
115113104 octetsMerci à @Neil et @TuukkaX pour avoir joué un octet chacun et @ETHproductions et Luke pour avoir joué au golf 9 octets
Essayez-le en ligne
la source
a=>b=>
.'=1'+'+1'.repeat
?.join
:a=>b=>[a+'^'+b,(a+'*').repeat(b-1)+a,(a+'+').repeat(Math.pow(a,b-1)-1)+a,1+'+1'.repeat(Math.pow(a,b)-1)].join`=`
.join()
...Gelée , 29 octets
Essayez-le en ligne!
Comment?
la source
tinylisp repl ,
178186 octetsL'utilisation de la repl enregistre 8 octets entre parenthèses de fermeture implicites à la fin des lignes. Définit une fonction
X
qui prend deux nombres et renvoie une liste d'expressions. Chaque expression est entre parenthèses, avec des espaces autour des opérateurs (en fait, c'est une liste de nombres et de symboles d'opérateurs):Espérons que ce format de sortie soit acceptable. Essayez-le en ligne! (avec plusieurs cas de test).
Explication
Nous avons besoin de deux fonctions de la bibliothèque standard:
list
et*
.Définissez une fonction
W
(abréviation de "tissage") qui prend un accumulateur_
, un nombreN
, un symboleS
et un comptage#
. Nous utiliserons cette fonction pour générer la plupart de nos expressions: par exemple,(W () 2 (q +) 3)
entraînera(2 + 2 + 2)
.Si le décompte est de 1
(e # 1)
, alors contre le nombre à l'avant de l'accumulateur(c N _)
et retournez-le. Sinon, récusez:(c S(c N _))
: le symbole et le numéro cons au devant de l'accumulateur précédent;N
etS
sont les mêmes;(s # 1)
: décompte - 1.L'idiome de l'accumulateur est nécessaire pour obtenir une récursion de queue appropriée , empêchant une erreur de profondeur de récursivité. (Ce changement est responsable du +8 au nombre d'octets. Le
13^2
cas ne fonctionnait pas dans la version précédente.)Malheureusement, la bibliothèque n'a pas de fonction d'exponentiation pour le moment, nous devons donc en définir une.
^
prendx
ety
. Siy
est véridique (non nul), nous récursions avecy-1
((s y 1)
) et multiplions le résultat parx
. Sinon,y
c'est zéro et on revient1
.(Remarque: Cette fonction n'utilise pas la récursion de queue appropriée. Je suppose que les exposants seront suffisamment petits pour que cela n'ait pas d' importance. Certaines expériences sur TIO ont indiqué un exposant maximum de 325, ce qui, à mon avis, devrait être suffisant pour cette question. Si le PO n'est pas d'accord, je le changerai.)
Enfin, la fonction qui nous intéresse,
X
, prendA
etB
et retourne une liste de quatre éléments:(list A(q ^)B)
: une liste contenantA
, un littéral^
, etB
;(W()A(q *)B)
: appelezW
pour obtenir une liste d'B
exemplaires deA
, entrelacés avec littéral*
;(W()A(q +)(^ A(s B 1)))
: appelezW
pour obtenir une liste d'A^(B-1)
exemplaires deA
, entrelacés avec littéral+
;(W()1(q +)(^ A B))
: appelezW
pour obtenir une liste d'A^B
exemplaires de1
, entrelacés avec littéral+
.la source
Brainfuck , 372 octets
Essayez-le en ligne!
Remarques
A**B
ne pas dépasser255
. En effet, brainfuck ne peut stocker que des valeurs d'un octet.10
devient:
,11
devient;
etc. C'est parce que Brainfuck ne peut accepter que des entrées d'un octet.Explication
Voici mon code quelque peu commenté. Je développerai cela plus tard.
la source
Pyth,
3231 octetsPrend l'entrée comme
[2,10]
, les sorties comme["2^10", "2*2*2*2*2*2*2*2*2*2", "2+2+...
Explication:
Essayez ici.
la source
Perl , 81 octets
78 octets de code +
-n
indicateur (compté comme 3 octets puisque le code contient$'
).Essayez-le en ligne!
la source
R, 147 octets
Fonction anonyme qui produit les sorties requises, eh bien, ligne par ligne. Cette solution utilise largement la
switch
fonction.La
switch
fonction prend une expression (icis
) qui correspond à un nombre ou à une chaîne de caractères (voir?switch
), suivie des alternatives correspondant às
. Si une alternative est manquante (par exempleswitch(s, a=, b= "PPCG")
, la prochaine alternative non manquante est évaluée (dans l'exemple, less="a"
sorties"PPCG"
).La
rep
fonction répète (réplique, en fait) son premier argument le nombre de fois indiqué dans le second argument.cat
, pour terminer, concaténer et imprimer les objets, avec un séparateur qui peut être choisi avec l'sep =
argument. La deuxièmecat
fonction est ici pour le saut de ligne.Ungolfed:
la source
CJam , 42 octets
Essayez-le en ligne!
la source
k, 44 octets
Cas de test.
la source
Cardinal 202 octets
Ne fonctionnera que pour les nombres dont la valeur calculée <256 en raison des limitations des valeurs pouvant être détenues par des pointeurs dans Cardinal
Essayez-le en ligne
Explication:
Étape 1
Reçoit deux nombres a et b en entrée et sort comme "a ^ b ="
Passe un pointeur avec la valeur active a et la valeur inactive b
Étape 2
Reçoit un pointeur avec une valeur active a et une valeur inactive b imprimant "a" + ("* a") (b-1) fois
Passe un pointeur avec une valeur active a ^ (b-1) à la partie suivante
Étape 3
Reçoit un pointeur avec une valeur de ^ (b-1) et sort "= a" + ("+ a") répété (a ^ (b-1) -1) fois + "="
Passe un pointeur de valeur a ^ b à la partie suivante
Étape 4
Reçoit un pointeur avec la valeur a ^ b et imprime "1" + ("+ 1") répété a ^ b-1 fois
la source
Rétine,
8988 octetsL'entrée est un nombre unaire séparé par des virgules.
Essayez-le en ligne!
la source