Square a Number my Way

Gryphon 09/10/2017. 20 answers, 1.959 views
code-golf number

Les gens continuent de me dire que le carré d'un nombre est le nombre multiplié par lui-même. C'est évidemment faux. La façon correcte de classer un nombre est de le faire en un carré, en l'empilant sur lui-même un nombre de fois égal au nombre de chiffres qu'il contient, puis en lisant tous les nombres du carré résultant, horizontalement (à partir de de gauche à droite uniquement) et verticalement (de haut en bas uniquement), puis en les ajoutant ensemble. Donc, pour le numéro 123, vous devez d'abord créer le carré:

123
123
123 

Ensuite, vous prenez toutes les lignes et les colonnes du carré, et ajoutez-les 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 comptez seulement le nombre de digits , donc le signe négatif n'est pas inclus dans la longueur), puis lisez les numéros horizontaux normalement (avec les signes négatifs), puis ignorez les signes négatifs pour les nombres verticaux. Donc, pour le numéro -144 nous obtenons le carré:

-144
-144
-144 

Ce qui nous donne -144-144-144+111+444+444 , ce qui équivaut à 567

Pour les nombres avec un seul chiffre, le carré est toujours égal au nombre doublé (lire une fois horizontalement et une fois verticalement). Donc, 4 nous donne

4 

Ce qui nous donne 4+4 , ce qui correspond à 8 .

Pour les nombres avec des parties décimales, empilez normalement (rappelez-vous que seuls les digits 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écimales lors de la lecture des nombres verticaux. Par exemple, le numéro 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 équivaut à 14308.8 .

Les nombres fractionnaires ou complexes ne peuvent pas être au carré.

Ta tâche:

Je suis fatigué de monter les numéros à la main, alors j'ai décidé d'automatiser le processus. Écris-moi un programme ou une fonction qui prend un flotteur ou une chaîne, selon ce que tu préfères, comme entrée et renvoie le résultat de mon quadrillage.

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 

Marquage:

Mes mains sont à l'étroit de l'écriture de tous ces carrés, et mon ordinateur ne prend pas en charge copier / coller, de sorte que l'entrée avec la moindre quantité de code pour que je tape (mesurée en octets pour une raison quelconque?) Gagne!

5 Comments
Gryphon 07/29/2017
Je me rends compte que ce n'était pas dans le bac à sable pendant très longtemps (seulement un peu plus d'une journée), mais il avait déjà 7 versions supérieures, alors je pensais qu'il était probablement prêt à publier.
1 Leaky Nun 07/29/2017
"123.45" et "244.2" ne sont pas valides en soi parce que l'ordinateur stocke le numéro en binaire. Ce n'est généralement pas un problème jusqu'à ce que le problème repose sur la représentation décimale.
3 Leaky Nun 07/29/2017
@Gryphon C'est là qu'il échoue. 244.2 n'est pas un numéro de flotteur. Il ne peut pas être converti en chaîne "244.2" .
2 Leaky Nun 07/29/2017
@Gryphon Mais des comportements comme celui -ci rendent cela très gênant.
7 Gryphon 07/29/2017
Pourquoi trois votes proches? Si 11 personnes peuvent répondre à la question, je pense que c'est probablement très clair!

20 Answers


Erik the Outgolfer 07/29/2017.

05AB1E , 7 octets

þSDg×+O 

Essayez-le en ligne!

Explication

þSDg×+O Implicit input
þ       Keep digits
 S      Get chars
  D     Duplicate
   g    Length
    ×   Repeat string(s)
     +  Add (implicit input added to all elements)
      O Sum 
4 comments
3 Jonathan Allan 07/29/2017
Ooo explication lorsque vous pouvez s'il vous plaît
1 Jonathan Allan 07/29/2017
Aussi, je remarque que le zéro unique unique est une exigence sur l'entrée pour -1 <entrée <1 (c'est-à-dire que 0,45 et .45 sont des entrées différentes, mais le même nombre, seul le premier est acceptable)
Erik the Outgolfer 07/29/2017
@JonathanAllan Ce dernier n'est pas traité de toute façon.
Erik the Outgolfer 07/29/2017
@JonathanAllan Fait.

Jonathan Allan 07/29/2017.

Jelly , 13 12 octets

fØDẋ€L$ŒV+VS 

Un lien monadique acceptant une liste de caractères (un nombre décimal bien formé, le zéro unique unique étant une exigence pour -1 < n < 1 ) et renvoyant un nombre.

Try it online!

14 octets pour accepter et renvoyer des nombres (entrée limitée à +/-10-5 par ŒṘ ): ŒṘfØDẋ€L$ŒV+⁸S .

Comment?

fØDẋ€L$ŒV+VS - Link: list of characters         e.g. "-0.45"
 ØD          - yield digit characters                "0123456789"
f            - filter keep                           "045"
      $      - last two links as a monad:
     L       -   length (number of digit characters) 3
   ẋ€        -   repeat list for €ach digit          ["000","444","555"]
       ŒV    - evaluate as Python code (vectorises)  [0,444,555]
          V  - evaluate (the input) as Jelly code    -0.45
         +   - addition (vectorises)                 [-0.45,443.55,554.55]
           S - sum                                   997.65 
4 comments
Erik the Outgolfer 07/29/2017
Umm, vous pouvez remplacer +€ par + en version de 15 octets pour -1.
Jonathan Allan 07/29/2017
Déjà fait, merci cependant!
Erik the Outgolfer 07/29/2017
Umm n'est pas dans la version de 15 octets. EDIT: 3 secondes trop tôt, je suppose ...
Jonathan Allan 07/29/2017
Oui, vous avez remarqué que vous avez dit une version de 15 octets. Merci encore!

nimi 07/29/2017.

Haskell, 59 56 octets

f s|l<-filter(>'.')s=0.0+sum(read<$>(s<$l)++[c<$l|c<-l]) 

L'entrée est prise en tant que chaîne.

Essayez-le en ligne!

Comment ça marche

l<-filter(>'.')s      -- let l be the string of all the numbers of the input string
f s   = 0.0 + sum     -- the result is the sum of (add 0.0 to fix the type to float)
   read<$>            -- turn every string of the following list into a number
   s<$l               -- length of l times the input string followed by
   [c<$l|c<-l]        -- length of l times c for each c in l 

ETHproductions 07/29/2017.

Japt v2 , 16 octets

o\d
l
¬xpV +V*Ng 

Testez-le en ligne!

Explication

o\d    First line: Set U to the result.
o      Keep only the chars in the input that are
 \d      digits. (literally /\d/g)

l    Second line: Set V to the result.
l    U.length

¬xpV +V*Ng    Last line: implicitly output the result.
¬             Split U into chars.
 x            Sum after
  pV            repeating each V times.
     +V*Ng    Add V * first input (the sum of the horizontals) to the result. 

Ian H. 07/31/2017.

C # (Core .NET), 150 141 133 octets

Saved 9 bytes thanks to @TheLethalCoder
Sauvegardé 8 octets supplémentaires grâce à @TheLethalCoder

a=>{var c=(a+"").Replace(".","").Replace("-","");int i=0,l=c.Length;var r=a*l;for(;i 

Essayez-le en ligne!

Prend une chaîne en tant qu'entrée et émet le numéro 'carré' en tant que flotteur.


Ce code suit l'algorithme suivant:

  1. 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 chiffres pour les colonnes à partir de là.

  2. Calculez les temps d'entrée de la longueur de la chaîne que nous avons créée au point 1.

  3. 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:

Entrée: -135.5

  1. Si nous remplaçons les points et symboles décimales, nous obtenons la chaîne 1355 , qui a une longueur de 4 .
  2. Les temps d'entrée 4: -135.5 * 4 = -542 .
  3. Maintenant, nous créons de nouvelles chaînes pour chaque colonne, analysons-les et ajoutez-les à notre résultat:
    1111 , 3333 , 5555 , 5555 .

Si nous additionnons ces chiffres, nous obtenons 15012 , ce qui est exactement ce que notre programme produira.

5 comments
1 Dada 07/31/2017
Bienvenue sur le site et bonne réponse (les explications en particulier sont appréciées!)!
Ian H. 07/31/2017
@Dada Merci! Même difficile, je suis plutôt désagréable par les octets que j'ai obtenus à partir de trucs comme string.Replace() , mais je suppose que c'est la seule façon de fonctionner!
TheLethalCoder 07/31/2017
Peut être en mesure d'enregistrer certains octets en définissant i et l en flottes.
Ian H. 07/31/2017
@TheLethalCoder A pensé à cela aussi, malheureusement, l'indexation ne fonctionne pas avec les flotteurs, et .Length ne peut pas être converti implicitement en flotteur.
1 TheLethalCoder 07/31/2017
a=>{var c=a.Replace(".","").Replace("-","");int i=0,l=c.Length;var r=float.Parse(a)*l;for(;i 141 octets. Peut être en mesure de sauvegarder en prenant une entrée en tant que float et en lançant une chaîne avec n+"" mais je n'ai pas vérifié.

Erik the Outgolfer 07/29/2017.

Brachylog , 23 octets

{∋ịṫ}ᶠ⟨≡zl⟩j₎ᵐ;[?]zcịᵐ+ 

Essayez-le en ligne!

Brachylog ne va pas bien avec les flotteurs ...

Explication:

{∋ịṫ}ᶠ⟨≡zl⟩j₎ᵐ;[?]zcịᵐ+ Takes string (quoted) input, with '-' for the negative sign
     ᶠ                  Return all outputs (digit filter)
{   }                    Predicate (is digit?)
 ∋                        An element of ? (input)
  ị                       Convert to number (fails if '-' or '.')
   ṫ                      Convert back to string (needed later on)
      ⟨   ⟩             Fork
       ≡                 Identity
         l               Length
                        with
        z                Zip
             ᵐ          Map
            ₎            Subscript (optional argument)
           j              Juxtapose (repeat) (this is where we need strings)
              ;         Pair with literal
               [ ]       List
                ?         ?
                  z     Zip
                   c    Concatenate (concatenate elements)
                     ᵐ  Map
                    ị    Convert to number
                      + Add (sum elements) 

Zgarb 07/29/2017.

Husk , 15 bytes

§+ȯṁrfΛ±TṁrSR#± 

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 invalides au lieu de renvoyer une valeur par défaut, ce qui signifie que je dois filtrer explicitement les colonnes qui ne contiennent pas de chiffres. Si elle a renvoyé 0 sur les entrées mal formées, je pourrais supprimer fΛ± et enregistrer 3 octets.

§+ȯṁrfΛ±TṁrSR#±  Implicit input, e.g. "-23"
             #±  Count of digits: 2
           SR    Repeat that many times: ["-23","-23"]
         ṁr      Read each row (parse as number) and take sum of results: -46
  ȯṁrfΛ±T        This part is also applied to the result of SR.
        T        Transpose: ["--","22","33"]
     fΛ±         Keep the rows that contain only digits: ["22","33"]
   ṁr            Parse each row as number and take sum: 55
§+               Add the two sums: 9 

Mr. Xcoder 07/29/2017.

Python 3 , 95 94 87 85 84 octets

 def f(i):l=[x for x in i if"/" 

Test Suite .

Python 3 , 78 octets

 lambda x:sum(float(i*len(z))for z in[[i for i in str(x)if"/" 

Suite de tests.

La deuxième approche est un port vers Python 3 inspiré de la solution @ officialaimm.


ThePirateBay 07/31/2017.

JavaScript, 75 62 octets

a=>(b=a.match(/\d/g)).map(b=>a+=+b.repeat(c),a*=c=b.length)&&a 

Essayez-le en ligne

-2 bytes thanks to Arnauld
-5 bytes thanks to Shaggy (même si la fonction doit recevoir un nombre, mais maintenant je vois que beaucoup d'autres réponses reçoivent une chaîne aussi)


Xcali 08/05/2017.

Perl 5 , 37 33 + 1 (-p) = 38 34 octets

 $_*=@n=/\d/g;for$\(@n){$_+=$\x@n} 

Essayez-le en ligne!

Utilisé quelques astuces du code de Dom pour raser 4 octets

Explained:

 @n=/\d/g;    # extract digits from input
$_*=@n;      # multiply input by number of digits
for$\(@n){   # for each digit:
  $_+=       # add to the input
  $\x@n}     # this digit, repeated as many times as there were digits
             # taking advantage of Perl's ability to switch between strings
             # and numbers at any point 
3 comments
Dom Hastings 07/31/2017
Je suis passé avec une approche très similaire, mais j'ai réussi à supprimer quelques octets en utilisant $ \ et à quitter la boucle: essayez-le en ligne!
Xcali 08/05/2017
Utilisé une certaine inspiration de vous pour raser les miens. Quelle est la construction "} {" à la fin de la vôtre? Je ne suis pas familier avec celui-là.
Dom Hastings 08/05/2017
C'est ce que j'ai appris de ce site, fondamentalement -n et -p littéralement envelopper un while(){...} autour du code donc }{ éclate ça. Cela désactive $_ mais si vous utilisez $\ comme votre variable, il sera toujours imprimé puisque $\ est ajouté à chaque impression. Cela signifie que vous pouvez stocker un nombre ou quelque chose dans ce domaine et ne pas tenir compte de $_ . Je ne suis pas sûr que ce soit une excellente explication, mais vérifiez les Conseils pour jouer au golf dans le fil de Perl , je suis sûr que ça va l'expliquer mieux! Heureux d'avoir aidé votre score!

Erik the Outgolfer 07/29/2017.

Jelly , 17 octets

ŒṘfØDẋ€L©$ŒV;ẋ®$S 

Essayez-le en ligne!


Erik the Outgolfer 07/29/2017.

Pyth, 18 octets

s+RvQsM*RF_lB@jkUT 

Essayez-le ici.


Mr. Xcoder 07/29/2017.

Pyth , 21 20 octets

K@jkUTQ+smv*lKdK*lKv 

Suite de tests.

Utilise une approche complètement différente de la réponse de @ EriktheOutgolfer , qui m'a aidé à golf 1 octet en conversation, du 22 au 21.


Explication

  K@jkUTQ+s.ev*lKbK*lKv   K @ jkUTQ - Filtrer les chiffres et les affecter à une variable K.           m - Carte.  Iteré par les chiffres avec une variable d             v - Evaluer (convertir en flotteur).              * lKd - Multiplie chaque chiffre String par la longueur de K.          s - Somme         + - Somme                   * lKvQ - Multipie le nombre par la longueur des chiffres Chaîne 

officialaimm 07/30/2017.

Python 2 , 81 74 octets

-7 bytes thanks to @Mr. Xcoder -7 bytes thanks to @Mr. Xcoder : '/'

  • Prend en entier ou flotteur, renvoie le flotteur.
 lambda x:sum(float(i*len(z))for z in[[i for i in`x`if"/" 

Essayez-le en ligne!

Explication:

Say 123.45 est donné en entrée. [i for i in`x`if"/" donne une liste d'entiers stringés ['1','2','3','4','5'] (qui est également z ). Maintenant, nous itérons dans [x]+z ie [123.45,'1','2','3','4','5'] , en multipliant chaque élément par len(z) , ici 5 et en convertissant chacun à un Float (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 la sum(...) et obtenons 167282.25 .

4 comments
Mr. Xcoder 07/29/2017
78 octets . Remplacez i.isdigit() par "/"
1 Mr. Xcoder 07/29/2017
74 octets . Vous pouvez remplacer i.isdigit() par "/" , en fait, car les deux . et - ont des codes ASCII plus bas que les chiffres, adn / entre eux
officialaimm 07/29/2017
@ Mr.Xcoder Merci beaucoup!
Mr. Xcoder 07/29/2017
Vous êtes les bienvenus. Je l'ai porté à Python 3 comme alternative à ma réponse

Bruce Forte 07/30/2017.

Octave , 100 82 octets

Merci beaucoup @ TomCarpenter pour m'avoir enseigné que les missions ont une valeur de retour et qui me sauve 18 octets!

 @(v)(n=nnz(s=strrep(num2str(abs(v)),'.','')-'0'))*v+sum(sum(s'*logspace(0,n-1,n))) 

Essayez-le en ligne!

Ungolfed / Explication

 function f=g(v)
  s=strrep(num2str(abs(v)),'.','')-'0';  % number to vector of digits (ignore . and -)
  n=nnz(s);                              % length of that vector
  f=n*v+sum(sum(s'*logspace(0,n-1,n)))   % add the number n times and sum the columns of the square
end 

La façon dont cela fonctionne est que nous avons essentiellement besoin d'ajouter le nombre lui-même n fois, puis d'ajouter la somme des colonnes. s' * logspace(0,n-1,n) atteint la somme des colonnes, par exemple si v=-123.4 cette matrice sera:

 [ 1     10    100   1000;
  2     20    200   2000;
  3     30    300   3000;
  4     40    400   4000 ] 

Nous devons donc sum et nous avons terminé.

1 comments
1 Tom Carpenter 07/30/2017
Vous pouvez enregistrer 18 octets en le broutant dans une fonction anonyme @(v)(n=nnz(s=strrep(num2str(abs(v)),'.','')-'0'))*v+sum(sum(‌​s'*logspace(0,n-1,n)‌​)) . Essayez-le en ligne!

Mr. Xcoder 07/30/2017.

Swift 4 , 139 134 octets

 func f(s:String){let k=s.filter{"/"<$0};print(Float(s)!*Float(k.count)+k.map{Float(String(repeating:$0,count:k.count))!}.reduce(0,+))} 

Suite de tests.


Explication

  • func f(s:String) - Définit une fonction f avec un paramètre de chaîne explicite s .

  • let k=s.filter{"/"<$0} - Filter les chiffres: j'ai remarqué que les deux - et . ont des valeurs ASCII plus petites que tous les chiffres, et / sont entre . , - et 0 . Par conséquent, je viens de vérifier si "/" est plus petit que le personnage 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 pour Float et les multiplie (Swift ne permet pas la multiplication Float et Int :()). Donc, il ajoute le nombre x fois, où x est le nombre de chiffres qu'il contient.

  • k.mapNO maps over k with the current value $0 . - k.map{} cartes sur k avec la valeur actuelle $0 . String(repeating:$0,count:k.count) prend chaque chiffre, crée une chaîne de x chiffres identiques et Float(...)! le convertit en un numéro de point flottant.

  • .reduce(0,+) - Obtient la somme de la liste ci-dessus.

  • Et enfin + résume les deux résultats.


Prenons un exemple!

Dites que notre chaîne est "0.45" . Tout d'abord, nous filtrons les chiffres, donc nous sommes laissés avec 0, 4, 5 . Nous convertit "0.45" en Flottant et multipliez par le nombre de chiffres: 0.45 * 3 = 1.35 . Ensuite, nous prenons chaque chiffre et le transformons en String en répétant ce chiffre jusqu'à ce qu'il remplisse la largeur du carré (combien de chiffres il y a-t-il): 0, 4, 5 -> 000, 444, 555 . Nous supposons cela, 000 + 444 + 555 = 999 . Ensuite, nous ajoutons les résultats ensemble: 1.35 + 999 = 1000.35 .


TheLethalCoder 07/31/2017.

C #, 139 137 octets

 using System.Linq;n=>{var d=(n+"").Where(char.IsDigit);return d.Sum(i=>int.Parse(new string(i,d.Count())))+new int[d.Count()].Sum(_=>n);} 

Saved 2 bytes thanks to @Ian H.

Essayez-le en ligne!

Version complète / formatée:

 namespace System.Linq
{
    class P
    {
        static void Main()
        {
            Func f = n =>            {
                var d = (n + "").Where(char.IsDigit);
                return d.Sum(i => int.Parse(new string(i, d.Count()))) + new int[d.Count()].Sum(_ => n);
            };

            Console.WriteLine(f(123));
            Console.WriteLine(f(-144));
            Console.WriteLine(f(4));
            Console.WriteLine(f(244.2));

            Console.ReadLine();
        }
    }
} 
2 comments
Ian H. 07/31/2017
Vous pouvez enregistrer 2 octets au début en utilisant var d=(n+ ... au lieu de var d = (n ... .
TheLethalCoder 07/31/2017
@IanH. J'ai oublié de supprimer tous les espaces -_- C'est ce que je reçois pour répondre tout en faisant un appel de support.

Jenny_mathy 08/09/2017.

Mathematica, 107 octets

(t=Length[s=#&@@RealDigits[#]//.{a___, 0}:>{a}];If[IntegerPart@#==0,t++];t#+Tr[FromDigits@Table[#,t]&/@s])& 

Titus 08/11/2017.

PHP, 78 88 +1 octets

 for($e=preg_match_all("#\d#",$n=$argn);~$c=$n[$i++];)$s+=str_repeat($c,$e);echo$s+$n*$e; 

Exécutez comme tuyau avec -nR .

Peut générer des avertissements en PHP 7.1. Repace $c,$e avec $c>0?$c:0,$e pour réparer.


C McAvoy 07/31/2017.

Python 3 , 68 70 73 77 octets

 lambda n:sum(float(n)+int(_*sum(x>"/"for x in n))for _ in n if"/"<_) 

Essayez-le en ligne!

Loops sur chaque caractère de chiffre et le répète par le nombre de caractères de chiffres en général, en fait un entier et ajoute que n . De cette façon, n est ajouté d fois, la partie horizontale de la somme, ainsi que la répétition des chiffres, qui est la partie verticale. À l'origine utilisé str.isdigit mais >"/" , grâce à d'autres dans ce fil, a sauvé beaucoup d'octets. Enregistre deux octets en prenant n comme chaîne, mais la sortie est plus désordonnée.

 lambda n:sum(n+int(_*sum(x>"/"for x in str(n)))for _ in str(n)if"/"<_) 

Essayez-le en ligne!

Related questions

Hot questions

Language

Popular Tags