Les gens me disent que le carré d'un nombre est le nombre multiplié par lui-même. C'est évidemment faux. La bonne façon de mettre un nombre au carré est d'en faire un carré, en l'empilant au-dessus de lui-même un nombre de fois égal au nombre de chiffres qu'il a, puis en lisant tous les nombres du carré résultant, tous les deux horizontalement (à partir de de gauche à droite uniquement) et verticalement (de haut en bas uniquement), puis en les ajoutant ensemble. Donc, pour le nombre 123, vous créez d'abord le carré:
123
123
123
Ensuite, vous prenez toutes les lignes et colonnes du carré et les ajoutez ensemble:
123+123+123+111+222+333
Ce qui nous donne un résultat de 1035
.
Pour les nombres négatifs, vous empilez normalement (n'oubliez pas que vous ne comptez que le nombre de chiffres , donc le signe négatif n'est pas inclus dans la longueur), puis lisez les nombres horizontaux normalement (avec des signes négatifs), puis ignorez les signes négatifs pour les nombres verticaux. Donc, pour le nombre, -144
nous obtenons le carré:
-144
-144
-144
Ce qui nous donne -144-144-144+111+444+444
, ce qui équivaut567
Pour les nombres à un seul chiffre, le carré est toujours égal au nombre doublé (lu une fois horizontalement et une fois verticalement). Nous 4
donne donc
4
Ce qui nous donne 4+4
, ce qui est égal 8
.
Pour les nombres avec des parties décimales, empilez normalement (rappelez-vous que seuls les chiffres sont comptés dans le nombre de fois que vous empilez le nombre, et donc le point décimal n'est pas compté), et ignorez les symboles décimaux lors de la lecture des nombres verticaux. Par exemple, le nombre 244.2
nous donne
244.2
244.2
244.2
244.2
Ce qui nous donne 244.2+244.2+244.2+244.2+2222+4444+4444+2222
, ce qui est égal 14308.8
.
Les nombres fractionnaires ou complexes ne peuvent pas être mis au carré.
Ta tâche:
Je suis fatigué de quadriller les chiffres à la main, j'ai donc décidé d'automatiser le processus. Écrivez-moi un programme ou une fonction qui prend un flottant ou une chaîne, selon votre préférence, en entrée et renvoie le résultat de la mise au carré à ma façon.
Exemples:
123 -> 1035
388 -> 3273
9999 -> 79992
0 -> 0
8 -> 16
-6 -> 0
-25 -> 27
-144 -> 567
123.45 -> 167282.25
244.2 -> 14308.8
2 -> 4
-0.45 -> 997.65
0.45 -> 1000.35
Notation:
Mes mains sont à l'étroit en écrivant tous ces carrés, et mon ordinateur ne prend pas en charge le copier / coller, donc l'entrée avec le moins de code pour moi à taper (mesurée en octets pour une raison quelconque?) Gagne!
244.2
n'est pas un nombre flottant. Il ne peut pas être converti en chaîne"244.2"
.Réponses:
05AB1E , 7 octets
Essayez-le en ligne!
Explication
la source
Gelée ,
1312 octetsUn lien monadique acceptant une liste de caractères (un nombre décimal bien formé, le zéro de tête unique étant une exigence pour -1 <n <1 ) et renvoyant un nombre.
Essayez-le en ligne!
14 octets d'accepter et de numéros de rappel (entrée limitée à +/- 10 -5 par
ŒṘ
):ŒṘfØDẋ€L$ŒV+⁸S
.Comment?
la source
+€
par une version+
à 15 octets pour -1.Haskell,
5956 octetsL'entrée est considérée comme une chaîne.
Essayez-le en ligne!
Comment ça marche
la source
Japt v2 , 16 octets
Testez-le en ligne!
Explication
la source
C # (.NET de base),
150141133 octets9 octets enregistrés grâce à @TheLethalCoder8 octetssupplémentairesenregistrés grâce à @TheLethalCoder
Essayez-le en ligne!
Prend une chaîne en entrée et sort le nombre «carré» sous forme de flottant.
Ce code suit l'algorithme suivant:
Créez une nouvelle chaîne à partir de l'entrée, mais sans les décimales et les symboles, afin que nous puissions obtenir notre longueur et les nombres pour les colonnes à partir de là.
Calculez les entrées fois la longueur de la chaîne que nous avons créée au point 1.
Pour chaque colonne de notre «carré», créez une nouvelle chaîne avec le numéro de colonne et la longueur de la ligne et ajoutez-la à notre résultat.
Exemple:
Contribution:
-135.5
1355
, qui a une longueur de4
.-135.5 * 4 = -542
.1111
,3333
,5555
,5555
.Si nous résumons ces chiffres, nous obtenons
15012
, ce qui est exactement ce que notre programme affichera.la source
string.Replace()
, mais je suppose que c'est la seule façon dont cela fonctionne!i
etl
en flottant..Length
ne peut pas être implicitement convertie en flottant.a=>{var c=a.Replace(".","").Replace("-","");int i=0,l=c.Length;var r=float.Parse(a)*l;for(;i<l;)r+=int.Parse(new string(c[i++],l));return r;}
141 octets. Pourrait être en mesure de sauvegarder en prenant l'entrée comme unfloat
et en lançant une chaîne avecn+""
mais je n'ai pas vérifié.Brachylog , 23 octets
Essayez-le en ligne!
Brachylog ne va pas bien avec les flotteurs ...
Explication:
la source
Husk , 15 octets
Prend une chaîne et renvoie un nombre. Essayez-le en ligne!
Explication
C'est un peu ennuyeux que la fonction d'analyse intégrée
r
donne des erreurs d'analyse sur les entrées non valides au lieu de renvoyer une valeur par défaut, ce qui signifie que je dois filtrer explicitement les colonnes qui sont constituées de non-chiffres. S'il renvoyait 0 sur des entrées mal formées, je pourrais laisser tomberfΛ±
et enregistrer 3 octets.la source
Python 3 ,
95 94 87 8584 octetsSuite de test .
Python 3 , 78 octets
Suite de tests.
La deuxième approche est un portage vers Python 3 inspiré par la solution de @ officialaimm.
la source
Python 2 ,
8174 octets-7 octets grâce à @Mr. Xcoder :
'/'<i
Essayez-le en ligne!
Explication:
Say
123.45
est donné en entrée.[i for i in`x`if"/"<x]
donne une liste d'entiers stringifiés['1','2','3','4','5']
(qui l'est aussiz
). Maintenant, nous itérons à travers,[x]+z
c'est- à- dire[123.45,'1','2','3','4','5']
en multipliant chaque élément parlen(z)
, ici5
et en convertissant chacun en un flottant (de sorte que les chaînes se convertissent également en conséquence), ce qui donne[617.25,11111.0,22222.0,33333.0,44444.0,55555.0]
. Enfin, nous calculons lesum(...)
et obtenons167282.25
.la source
i.isdigit()
par"/"<i<":"
i.isdigit()
par"/"<i
, en fait, parce que les deux.
et-
ont des codes ASCII inférieurs aux chiffres, adn/
est entre euxJavaScript,
7562 octetsEssayez-le en ligne
-2 octets grâce à Arnauld
-5 octets grâce à Shaggy (je pensais que la fonction devait recevoir un nombre, mais maintenant je vois que beaucoup d'autres réponses reçoivent aussi une chaîne)
la source
Perl 5 ,
3733 + 1 (-p) =3834 octetsEssayez-le en ligne!
Utilisé quelques astuces du code de Dom pour raser 4 octets
A expliqué:
la source
-n
et-p
littéralement envelopperwhile(){...}
le code afin de}{
sortir de cela. Cela ne se définit pas,$_
mais si vous utilisez$\
comme variable, il sera toujours imprimé car il$\
est ajouté à chaque impression. Signifie que vous pouvez stocker un numéro ou quelque chose dans cela et ne pas en tenir compte$_
. Je ne suis pas sûr que c'était une excellente explication, mais consultez les conseils pour jouer au golf g dans le fil Perl , je suis sûr que cela vous expliquera mieux! Heureux d'avoir aidé votre score!Gelée , 17 octets
Essayez-le en ligne!
la source
Pyth, 18 octets
Essayez ici.
la source
Pyth ,
2120 octetsSuite de tests.
Utilise une approche complètement différente de la réponse de @ EriktheOutgolfer , qui m'a aidé à jouer au golf 1 octet dans le chat, de 22 à 21.
Explication
la source
Octave ,
10082 octetsMerci beaucoup @TomCarpenter de m'avoir appris que les affectations ont une valeur de retour et de m'avoir sauvé des
18
octets!Essayez-le en ligne!
Non golfé / Explication
La façon dont cela fonctionne est que nous devons essentiellement ajouter le nombre lui-même
n
fois, puis ajouter la somme des colonnes. La sommations' * logspace(0,n-1,n)
atteint la somme des colonnes, par exemple siv=-123.4
cette matrice sera:Nous avons donc juste besoin de
sum
le faire et nous avons terminé.la source
@(v)(n=nnz(s=strrep(num2str(abs(v)),'.','')-'0'))*v+sum(sum(s'*logspace(0,n-1,n)))
. Essayez-le en ligne!Swift 4 ,
139134 octetsSuite de tests.
Explication
func f(s:String)
- Définit une fonctionf
avec un paramètre String explicites
.let k=s.filter{"/"<$0}
- Filtre les chiffres: j'ai remarqué que les deux-
et.
ont des valeurs ASCII plus petites que tous les chiffres, et/
est entre.
,-
et0
. Par conséquent, je viens de vérifier s'il"/"
est plus petit que le caractère actuel, comme je l'ai fait dans ma réponse Python.print(...)
- Imprime le résultat.Float(s)!*Float(k.count)
- Convertit à la fois la chaîne et le nombre de chiffres en Float et les multiplie (Swift ne permet pas la multiplication Float et Int :()). Il ajoute donc le nombre dex
fois, oùx
est le nombre de chiffres qu'il contient.k.map{Int(String(repeating:$0,count:k.count))!
-k.map{}
correspondk
à la valeur actuelle$0
.String(repeating:$0,count:k.count)
prend chaque chiffre, crée une chaîne dex
chiffres identiques et leFloat(...)!
convertit en nombre à virgule flottante..reduce(0,+)
- Obtient la somme de la liste ci-dessus.Et
+
résume enfin les deux résultats.Prenons un exemple!
Disons que notre chaîne est
"0.45"
. Tout d'abord, nous filtrons les chiffres, nous nous retrouvons donc avec0, 4, 5
. Nous convertissons"0.45"
à flotteur et multiplier par le nombre de chiffres:0.45 * 3 = 1.35
. Ensuite , nous prenons chaque chiffre et la transformer en une chaîne à répéter ce chiffre jusqu'à ce qu'il remplisse la largeur du carré (combien de chiffres il y a):0, 4, 5 -> 000, 444, 555
. Nous résumons cela,000 + 444 + 555 = 999
. Ensuite , nous ajoutons simplement les résultats ensemble:1.35 + 999 = 1000.35
.la source
C #,
139137 octetsEnregistré 2 octets grâce à @Ian H.
Essayez-le en ligne!
Version complète / formatée:
la source
var d=(n+ ...
au lieu devar d = (n ...
.Mathematica, 107 octets
la source
PHP,
7888 +1 octetsExécuter en tant que tuyau avec
-nR
.Peut générer des avertissements en PHP 7.1. Répétez
$c,$e
avec$c>0?$c:0,$e
pour corriger.la source
Python 3 , 68
707377octetsEssayez-le en ligne!
Boucle sur chaque caractère numérique et le répète par le nombre total de caractères numériques, en fait un entier et ajoute cela à
n
. De cette façon, onn
obtient desd
temps ajoutés , la partie horizontale de la somme, ainsi que la répétition des chiffres, qui est la partie verticale. Utilisé à l'originestr.isdigit
mais>"/"
, grâce à d'autres dans ce fil, a économisé beaucoup d'octets. Enregistre deux octets en prenantn
comme chaîne, mais la sortie est plus compliquée.Essayez-le en ligne!
la source