Contexte:
Les opérations standard comme l’addition et la multiplication de base dans le monde réel fonctionnent comme suit:
12 + 123 = 135
et
12 * 123 = 1476
Ce n'est pas intéressant et ennuyeux! Beaucoup d'écoles interprètent déjà cela comme pratique, pratique, pratique d'algorithmes formels. Cela implique un régime mathématique mathématique assez rigide et ennuyeux et n’est pas ce que l’on envisage dans ce défi. Préparez-vous à vous amuser sur notre site bien-aimé.
Considérons le processus d’ajout de deux nombres entiers positifs, puis l’ajout de tous les chiffres du résultat. Répéter avec l'addition jusqu'à obtenir un seul chiffre. Par exemple:
- Le résultat de
12 + 123
est 135. - En ajoutant tous les chiffres de 135, nous obtenons
1 + 3 + 5 = 9
.
Le nombre d'étapes requis pour obtenir une valeur à un chiffre 9 dans cette addition répétée est égal à 2.
Comme avec le processus précédent de l'addition, la multiplication de deux nombres entiers positifs suit le même processus. Multipliez tous les chiffres de son résultat, puis répétez ce processus jusqu'à ce qu'il ne reste qu'un seul chiffre. Prenons l'exemple ci-dessus:
- Le résultat de
12 * 123
est 1476. - Multipliez tous les chiffres de 1476 que nous obtenons
1 * 4 * 7 * 6 = 168
. - Multiplie encore tous les chiffres de 168 que nous obtenons
1 * 6 * 8 = 48
. - Multiplie encore tous les chiffres de 48 que nous obtenons
4 * 8 = 32
. - Multiplie encore tous les chiffres de 32 obtenus
3 * 2 = 6
.
Le nombre d'étapes requis pour obtenir une valeur à un chiffre 6 cette multiplication répétée est 5.
Par souci de ce défi et en évitant toute utilisation abusive des notations mathématiques, je vous présente ces deux notations factices: (+)
et (*)
, mais vous pouvez utiliser la notation de votre choix , qui fonctionne comme suit:
- L'opération du processus d'addition répétée pour obtenir une valeur unique est
12 (+) 123 = 9
. - L'opération du processus de multiplication répétée pour obtenir une valeur unique est
12 (*) 123 = 6
.
Défi:
Le défi consiste à écrire un programme ou une fonction pouvant exécuter les deux opérations décrites dans la section Arrière-plan: (+)
et (*)
.
Contribution:
Les entrées du programme ou de la fonction sont deux entiers positifs et une opération soit (+)
et (*)
. Le format de l'entrée est un choix arbitraire du programmeur . Vous pouvez formater l'entrée, par exemple, a (+) b
ou F(a, (+), b)
ou tout autre format de votre choix.
Sortie:
La sortie du programme ou de la fonction doit contenir le résultat de l'opération et le nombre d'étapes requises avec le format freestyle que vous le souhaitez.
Cas de test (ignorer les formats d'entrée et de sortie):
81 (+) 31 --> (4 ; 2)
351 (+) 14568 --> (6 ; 3)
21 (*) 111 --> (8 ; 3)
136 (*) 2356 --> (0 ; 2)
Règles générales:
- C'est du code-golf , donc la réponse la plus courte en octets remporte le défi.
Ne laissez pas les esolangs vous dissuader de poster une réponse dans des langues normales. Profitez de ce défi en fournissant une réponse aussi courte que possible avec votre langage de programmation. Si vous postez une réponse intelligente et une explication claire, votre réponse sera appréciée (d'où les votes positifs) quel que soit le langage de programmation que vous utilisez. - Les règles standard s'appliquent à votre réponse. Vous êtes donc autorisé à utiliser STDIN / STDOUT, fonctions / méthode avec les paramètres appropriés, programmes complets, etc. Vous avez le choix.
- Si possible, votre programme peut gérer correctement les grands nombres. Sinon, ça ira.
la source
Réponses:
Dyalog APL ,
33323029 octetsCela étend APL pour inclure la notation de préfixe
+/A n₁ n₂
et×/A n₁ n₂
. (En fait, vous pouvez utiliser n’importe quelle opération à gauche de/A
.) Renvoie une liste de {résultat, nombre de répétitions}.TryAPL en ligne! (
⍎
a été imité avece
pour des raisons de sécurité.)Merci à @ ngn d'avoir sauvegardé un octet.
0 octet (en plaisanterie)
Dyalog APL prend déjà en charge les mathématiques Anastasiyan; au lieu de
(+)
et(×)
, il utilise+{n←0⋄n,⍺⍺{n+←1⋄⍺⍺/⍎¨⍕⍵}⍣=⍵⍺⍺⍨⍺}
et×{n←0⋄n,⍺⍺{n+←1⋄⍺⍺/⍎¨⍕⍵}⍣=⍵⍺⍺⍨⍺}
.Essayez
81 +{(⊃,≢)⍺⍺{∪⍵,⍨⍺⍺e¨⍕⊃⍵}⍣≡⍺⍺/⍺⍵} 31
et21 ×{n←0⋄n,⍺⍺{n+←1⋄⍺⍺/e¨⍕⍵}⍣=⍵⍺⍺⍨⍺} 111
.la source
⎕FR←1287
(utilisez IEEE 754-2008 128 bits décimal F loating point R ePresentation) et⎕PP←34
(utilisation 34 caractères P Rint P recision), vous pouvez utiliser des entiers ci - dessous 10³⁴.+{n←0⋄n,⍺⍺{n+←1⋄⍺⍺/⍎¨⍕⍵}⍣=⍵⍺⍺⍨⍺}
et×{n←0⋄n,⍺⍺{n+←1⋄⍺⍺/⍎¨⍕⍵}⍣=⍵⍺⍺⍨⍺}
encore tout à fait quelques octets? Je suis confus à propos de la façon dont il s'agit de 0 octets ..: S(+)
serait l'Anastasiyan +. Dyalog APL prend en charge les mathématiques Anastasiyan, mais il utilise un glyphe différent à plusieurs caractères, tout comme la*
puissance et vous avez besoin×
pour la multiplication, tandis/
que la réplication et le besoin÷
pour la division.(+)
vous en avoir une+{n←0⋄n,⍺⍺{n+←1⋄⍺⍺/⍎¨⍕⍵}⍣=⍵⍺⍺⍨⍺}
entrée, mais puisque OP a effectivement indiqué que tout format d’entrée ferait l'affaire, vous pouvez utiliser la fonction en tant que paramètre. Hmm, je me demande si cela est également possible dans d'autres langages de programmation qui prennent en charge les fonctions en entrée.Haskell, 108 octets
Définit la fonction
#
qui prend d' aborda
etb
puis l'opérateuro
. Fait amusant: cela fonctionne avec n'importe quel opérateur (en fait, n'importe quelle fonction) que vous voulez!la source
Integer
type de Haskell est illimité.Pyke, 16 octets
Essayez-le ici!
Prend se multiplier comme
B
et ajouter commes
. Les deux entrées numériques sont séparées par des virgules.la source
JavaScript (ES6), 59
Fonction récursive, le format de saisie est conçu pour simplifier l'appel récursif:
Tester
la source
Python 2, 60 octets
L' entrée est une chaîne du type
81+31
, la sortie est un tuple d'une chaîne de singleton et un compteur (par exemple,('4', 2)
.Testez-le sur Ideone .
la source
f(['81', '31'],'+')
un octet supplémentaire peut être sauvegardé, mais cela donne l'impression d'étirer un peu trop les règles ...operator.add
ouoperator.mul
respectivement;)Pyth, 16
Prend les entrées comme
"+ 123 12"
pour l'addition et"* 123 12"
pour la multiplication. Les sorties aimentresult<linefeed>steps
.Essayez-le ici ou lancez une suite de tests , mais notez que cela dépend de eval, de sorte que seule la variante d’addition fonctionnera dans l’interprète en ligne. La multiplication fonctionne correctement avec l'interpréteur hors ligne.
Ceci utilise la fonction de réduction cumulative pour créer une liste de résultats intermédiaires, donc pour
"+ 351 14568"
nous[14919, 24, 6]
. Cela fonctionne car les nombres à un chiffre sont un point fixe de l'addition et de la multiplication d'Anastasiya. Ensuite, nous obtenons juste le dernier élément du tableau ainsi que la longueur du tableau.Cela fonctionnera pour des nombres arbitrairement grands, au moins jusqu'à ce que vous manquiez de mémoire.
la source
R,
175167164140134127 127126119 octetsUngolfed:
ifelse
est de retour ! Ouais !Nop
Utilisation:
Merci beaucoup à @plannapus pour avoir joué 24 octets!
-7 octets grâce à une bonne idée de @Vlo !
la source
strtoi
! 4 octets de plus vous me faites battre.05AB1E ,
2015 octetsExplication
L'opérateur est 1 pour l'addition, 0 pour la multiplication.
Essayez-le en ligne
la source
Gelée ,
11 à10 octetsL'entrée est une paire de nombres et soit
+
ou×
.Essayez-le en ligne! ou vérifier tous les cas de test .
Comment ça marche
la source
Code machine ARM, 48 octets
Décharge Hex:
Cette fonction ne dépend d'aucun appel système ni d'aucune fonction de bibliothèque. C'est le code Thumb-2, qui est un codage d'instruction de longueur variable (2 ou 4 octets) pour ARM 32 bits. Ainsi, la valeur maximale qu'il peut traiter est 2 ^ 32-1. 2 octets pourraient être supprimés s'ils n'étaient pas conformes à l'AAPCS ( 46 octets ), car nous n'aurions pas à empiler les registres au début.
Ungolfed assembly (syntaxe GNU):
Test de script en C:
la source
R,
130124 caractèresUne approche quelque peu différente de celle de @ Frédéric :
Indenté, avec nouvelles lignes:
La ligne 4 a probablement besoin de plus d'explications:
Cas de test:
la source
f
à la fois le nom de la fonction et l'un de ses arguments :)Octave, 85 octets
MATLAB, 123, 114, 105, 94 octetsDécidé de traduire cela en Octace, de tirer parti de l'indexation directe et des capacités incrémentielles. Prend l'entrée sur le formulaire:,
f(a,operator)
oùa = [number1, number2]
,operator==1
donne le produit etoperator==2
donne la somme.Explications:
g={@prod,@sum}{o}
: Choisit la fonction, le produit ou la somme appropriés et les affecte àg
x=g(a)
prend la somme ou le produit des intrantsi=1; ... i++
: Incrementer pour compter le nombre d'étapesSuppression de deux nouvelles lignes, d'un espace, et placement des deux nombres entrés dans un vecteur au lieu d'arguments séparés. Cela a sauvé 9 octets, grâce à pajonk! Supprimé
k=@(x)...
pour sauver encore 11 octets grâce à beaker =) Enfin, traduit le tout en Octave pour sauver encore 9 octets ...la source
Java,
164159146 octetsLe premier argument est juste le compteur, toujours 0
Le second argument est la méthode, 0 pour ADD et 1 pour MULTIPLY.
Le troisième argument est un tableau de chaînes, qui contient les valeurs à ajouter / multiplier.
Ungolfed
merci à @Kevin Cruijssen d'avoir coupé quelques octets.
merci à @milk pour avoir rasé 5 octets.
Programme de test
la source
m==0
peut êtrem<1
etInteger.parseInt
peut êtreInteger.decode
.j
variable à la fin? Deux(r+"")
fois en ligne, on dirait que cela raserait quelques octets.Gelée , 17 octets
Essayez-le en ligne!
Avec des arguments comme
x y 1
, ceci calcule la somme d'Anastasiyax (+) y
.Avec des arguments comme
x y 0
, ceci calcule le produit Anastasiyax (*) y
.La sortie est donnée comme
[number of steps, result]
.la source
Python,
160146129 octetsPublierai une explication bientôt.
La saisie est sous la forme
12+12
ou5*35
(avec normale+
et*
signes), et suppose que ce sont les deux seuls opérateurs.Il peut gérer des entrées numériques aussi importantes que la mémoire de votre ordinateur le permet.
Je suis presque certainement convaincu que cela peut être plus loin.
EDIT:
1631 octets enregistrés grâce à @Copper.la source
"+" if "+" in s else "*"
à"*+"["+"in s]
, puis au lieu de l’affecter àt
, ajoutez-le simplement dans l’exec
appel.R, 110 octets
Utilisation du séparateur de @plannapus.
function(A,F,B){r=Reduce;x=r(F,A,B);y=1;while(x>9){m=nchar(x);x=r(F,x%%10^(1:m)%/%10^(1:m-1));y=y+1};cat(x,y)}
Sortie
edit: je ne peux pas compter.
la source
Clojure 126 octets
La fonction s'appelle comme suit:
Voici le code ungolfed:
N'oubliez pas que Clojure est encore nouveau pour moi, ce n'est donc probablement pas la meilleure solution. Le défi était amusant tout de même. De plus, le code a fonctionné avec de très grands nombres sans aucune difficulté.
la source
Perl 6 53 octets
Puisque
( 12, &[+], 123 )
est acceptable pour l'entrée, je peux le réduire à 53 octets.(
&[+]
est l'abréviation de&infix:<+>
"révérence" à l'opérateur d'addition infixe numérique)Si le deuxième argument devait être une chaîne,
(+)
ce serait 87 octets.Explication:
Tester:
Utilisation normale:
la source
Python 2,
10797 octetsUne fonction anonyme qui prend en entrée via l'argument d'un premier opérande
a
, un opérateuro
('+'
ou'*'
) et un deuxième opérandeb
, et renvoie une liste du formulaire[result, steps]
.Comment ça marche
La fonction anonyme crée une chaîne en concaténant les opérandes avec l'opérateur entre eux, puis l'évalue. c'est la première étape décrite dans la question. Ensuite, cette valeur et l'opérateur sont passés à la fonction récursive
g
. Ici, un compteuri
, qui est incrémenté pour chaque appel récursif, est utilisé. Si l'entrée est inférieure à10
, un seul chiffre doit avoir été atteint, c'est donc cela quii
est retourné. Sinon, l'entrée est convertie en chaîne et chaque caractère de cette chaîne est joint à l'opérateur, ce qui donne le calcul souhaité, qui est ensuite évalué et passé à la fonction de manière récursive.Essayez sur Ideone
la source
Groovy, 102 octets
Degolfed
Explication
Basé sur l'excellente solution de @Sean Bean pour Java.
p
: La fermeture (fonction, lambda, peu importe) qui implémente la solutiont
: La profondeur de l'appel en cours (nombre d'itérations)p
doit toujours être invoquée avect=1
m
: Opération à effectuer0
pour "ajouter",1
pour "multiplier"d
: La liste des opérandes, chaque opérande est un objet Stringe
: Les éléments ded
, chacun converti en un entierr
: La somme ou le produit dee
, en fonction de l'opérationm
r > 9
:r > 9
), réinvoquez, incrémentez la profondeurt
et convertissez-lesr
en une liste de chaînes de chiffres (et renvoyez le résultat).r
ett
sous forme de liste.Programme de test
Résultats
la source
Haskell,
7670 octetsRetourne une liste de deux éléments avec le résultat et le nombre d'étapes. Fonctionne pour les grands nombres arbitraires. Exemple d'utilisation:
(351#14568)(+)
->[6,3]
.Edit: Merci à @BlackCap pour 6 octets.
la source
(-48+).fromEnum
parread.pure
R, 91 octets
En utilisant le code de @ Vlo, qui utilise le séparateur de @ plannapus, et quelques idées générées en jouant au golf, la réponse de Frédéric est la réponse la plus courte à ce jour. (Un nombre inhabituellement élevé de réponses R ici aujourd'hui ...)
De manière cruciale, cela nécessite que la saisie de l'opérateur soit
sum
pour (+) ouprod
pour (*). Selon les règles du défi, cela semble aller.Avec indentation:
Les principales différences avec la réponse de @ Vlo sont les suivantes:
Reduce
, nous nous appuyons sur l'argument d'entrée en tant que fonction et nous l'appelons simplement explicitement. (Oui pour les fonctions étant des objets de première classe!)T
, qui est évaluée àTRUE
(aka1
), mais puisque ce n'est pas une variable réservée, nous pouvons la modifier. AinsiT+T
est2
. Nous utilisons donc cela comme notre compteur.cat
inverser la sortie, nous la renvoyons simplement sous forme de vecteur avecc
. En plus d'économiser deux octets, le fait que la sortie soit forcée dans un vecteur garantit saT
classenumeric
. Si nous utilisonscat
etT
n’avons pas été incrémentés, nous obtenons une sortie erronée du type1 TRUE
.la source
while
boucle comme suit, en changeantF
d'être quelque chose d' autre pour éviter les conflits de nom:function(A,O,B){x=O(A,B);while({F=F+1;x>9})x=O(x%/%10^(1:nchar(x)-1)%%10;c(x,F)}}
. C'est incroyable le nombre de figures de golf que nous avons proposées ces dernières années :)T
et duF
compteur dans une fonction est en réalité invalide, car cela signifie que la fonction ne peut être appelée qu'une seule fois. Donc, cette réponse (et plusieurs de mes autres!) Ne sont pas valides, à moins d'indication expliciterm(T)
à la fin. Je vais continuer à chercher ce méta-post afin de pouvoir être sûr de ne pas l'avoir rêvé.T
etF
astuce est parfaitement valable tant que vous ne modifiez pasT
ouF
dans l'environnement global. par exemple,f=function(){T=T+1;T}
revient systématiquement2
. Je pense que ceci est le meta post auquel vous faites référence.Ruby, 55 octets
Appel récursif. Très différent de la réponse JavaScript de @ edc65, mais comme je l’optimisais, il est finalement devenu un port direct développé presque indépendamment de leur réponse, moins une optimisation finale consistant à vérifier le résultat évalué à la place de la longueur de la liste des opérandes passées. , ce qui m'a permis de dépasser leur nombre d'octets.
L'entrée est une chaîne représentant l'opérateur et un tableau contenant les opérandes.
Essayez-le en ligne.
la source
i=0
et j'ai en quelque sorte oublié de refactoriser.Perl, 38 octets
Comprend +2 pour
-ap
Exécutez avec l'entrée sur STDIN et les espaces autour de l'opérateur:
La sortie est un chiffre et les étapes séparées par
+A
amath.pl
:Si la sortie des étapes dans unary est correcte, cette version de 35 octets fonctionne mieux:
la source
Mathematica,
10594 octetsCode.
Usage.
Explication.
Les deux fonctions
x
(pour (+)) ety
(pour (*)) sont créées en même temps en remplaçant les paramètresf
eto
enavec leurs valeurs appropriées. Pour
x
,f
devient#1 + #2
eto
devientPlus
; cary
, respectivement ils deviennent#1 #2
etTimes
. Réécriture de la fonctionx
pour la dernière partie de l'explication:la source
Java 7,
203195192 octetsIl utilise
long
(valeur maximale de 2 63 -1). S'il utilisait à laint
place (valeur maximale de 2 31 -1), il ne contiendrait qu'un octet en moins ( 191 octets ):Il peut probablement être joué un peu plus au golf. Avoir à imprimer les étapes ainsi que la réponse pour les deux opérateurs prend cependant quelques octets.
Utilise 0 (pour
(+)
) et 1 (pour(*)
).Ungolfed & code de test:
Essayez ici.
Sortie:
la source