Square ett nummer mitt sätt

Gryphon 08/21/2017. 20 answers, 1.959 views
code-golf number

Folk fortsätter att berätta för mig att kvadraten av ett tal är numret multiplicerat med sig själv. Detta är uppenbart falskt. Det rätta sättet att kvadrata ett tal är att göra det till en fyrkant genom att stapla det ovanpå sig själv ett antal gånger lika med antalet siffror den har och sedan läsa alla siffror från den resulterande rutan, både horisontellt (från endast till höger) och vertikalt (från upp till nere bara) och sedan lägga till dem tillsammans. Så för nummer 123 skapar du först torget:

123
123
123 

Sedan tar du alla raderna och kolumnerna från torget och lägger till dem ihop:

123+123+123+111+222+333 

Vilket ger oss ett resultat av 1035 .

För negativa tal stacks du normalt (kom ihåg att du bara räknar antalet digits , så att negativa tecknet inte ingår i längden) och sedan läsa det horisontella numret normalt (med negativa tecken) och ignorera sedan de negativa tecknen för de vertikala siffrorna. Så för numret -144 vi torget:

-144
-144
-144 

Vilket ger oss -144-144-144+111+444+444 , vilket motsvarar 567

För siffror med en enda siffra är kvadraten alltid lika med antalet dubblade (läs en gång horisontellt och en gång vertikalt). Så 4 ger oss

4 

Vilket ger oss 4+4 , vilket är lika med 8 .

För siffror med decimaldelar, stack normalt (kom ihåg att endast digits räknas i antalet gånger du staplar numret, och därmed inte decimalpunkten räknas inte) och ignorera decimalsymbolerna när du läser de vertikala talen. Till exempel ger siffran 244.2 oss

244.2
244.2
244.2
244.2 

Som ger oss 244.2+244.2+244.2+244.2+2222+4444+4444+2222 , vilket är lika med 14308.8 .

Fraktionella eller komplexa siffror kan inte kvadreras.

Din uppgift:

Jag är trött på att kvadrera siffror min väg för hand, så jag har bestämt mig för att automatisera processen. Skriv mig ett program eller en funktion som tar en float eller en sträng, beroende på vad du föredrar, som inmatning och returnerar resultatet av att kvadrera det på min väg.

Exempel:

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 

Poängberäkning:

Mina händer blir trånga från att skriva ut alla dessa rutor, och min dator stöder inte kopiera / klistra in, så att inmatningen med minsta mängd kod för mig att skriva (mätt i byte av någon anledning?) Vinner!

5 Comments
Gryphon 07/29/2017
Jag inser att det inte var så länge i sandlådan (bara lite över en dag), men det hade redan 7 röster, så jag trodde det var nog redo att posta.
1 Leaky Nun 07/29/2017
"123.45" och "244.2" är inte giltiga flyter i sig själv eftersom datorn lagrar nummer i binärt. Detta är normalt inte ett problem förrän problemet är beroende av decimalrepresentationen.
3 Leaky Nun 07/29/2017
@Gryphon Det här är det där det misslyckas. 244.2 är inte ett flytnummer. Det kan inte konverteras till strängen "244.2" .
2 Leaky Nun 07/29/2017
@Gryphon Men beteenden som detta gör det väldigt obekvämt.
7 Gryphon 07/29/2017
Varför tre nära röster? Om 11 personer kan svara på frågan tror jag att det är nog ganska klart!

20 Answers


Erik the Outgolfer 07/29/2017.

05AB1E , 7 byte

þSDg×+O 

Prova det online!

Förklaring

þ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 förklaring när du kan snälla
1 Jonathan Allan 07/29/2017
Jag skulle också notera att den enskilda ledande nollpunkten är ett krav på ingången för -1 <ingång <1 (dvs 0,45 och .45 är olika ingångar men samma nummer, endast den förstnämnda är acceptabel)
Erik the Outgolfer 07/29/2017
@JonathanAllan Den senare hanteras inte ändå.
Erik the Outgolfer 07/29/2017
@JonathanAllan Done.

Jonathan Allan 07/29/2017.

Jelly , 13 12 bytes

fØDẋ€L$ŒV+VS 

En monadisk länk som accepterar en lista med tecken (ett välformat decimaltal, den enda ledande nollpunkten är ett krav på -1 < n < 1 ) och returnerar ett tal.

Try it online!

14 byte för att acceptera och returnera nummer (ingång begränsad till +/-10-5 med ŒṘ ): ŒṘfØDẋ€L$ŒV+⁸S .

Hur?

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, du kan ersätta +€ med + i 15-byte-versionen för -1.
Jonathan Allan 07/29/2017
Redan gjorde tack tack!
Erik the Outgolfer 07/29/2017
Umm inte i 15-byte versionen. EDIT: 3 sekunder för tidigt antar jag ...
Jonathan Allan 07/29/2017
Yup märkte bara att du sa 15 byte-versionen - tack igen!

nimi 07/29/2017.

Haskell, 59 56 byte

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

Inmatningen tas som en sträng.

Prova det online!

Hur det fungerar

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 byte

o\d
l
¬xpV +V*Ng 

Testa det på nätet!

Förklaring

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 # (. NET Core), 150 141 133 byte

Saved 9 bytes thanks to @TheLethalCoder
Sparade ytterligare 8 byte tack vare @TheLethalCoder

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

Prova det online!

Tar en sträng som en inmatning och matar ut det "kvadrerade" numret som en flotta.


Denna kod följer följande algoritm:

  1. Skapa en ny sträng från inmatningen, men utan decimalpunkter och symboler, så kan vi få vår längd och siffrorna för kolumnerna därifrån.

  2. Beräkna inmatningstiderna längden på strängen som vi skapade vid punkt 1.

  3. För varje kolumn i vår "kvadrat", skapa en ny sträng med kolonnnumret och radlängden och lägg till det i vårt resultat.

Exempel:

Input: -135.5

  1. Om vi ​​ersätter decimalpunkter och symboler får vi strängen 1355 , som har en längd av 4 .
  2. Inmatningstiderna 4: -135.5 * 4 = -542 .
  3. Nu skapar vi nya strängar för varje kolumn, analyserar dem och lägger till dem i vårt resultat:
    1111 , 3333 , 5555 , 5555 .

Om vi ​​summerar dessa nummer får vi 15012 , vilket är exakt vad vårt program kommer att ge ut.

5 comments
1 Dada 07/31/2017
Välkommen på webbplatsen och trevligt första svar (särskilt förklaringarna uppskattas!)!
Ian H. 07/31/2017
@Dada Tack! Ännu tuffa, jag är ganska obehagad av byterna som jag fått från saker som string.Replace() , men jag antar att det är det enda sättet det fungerar!
TheLethalCoder 07/31/2017
Kan spara några bitar genom att ställa i och l att flyta.
Ian H. 07/31/2017
@TheLethalCoder Tanken med det också, tyvärr indexering fungerar inte med floats, och. .Length kan inte implicit konverteras till float.
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 byte. Det kan vara möjligt att spara genom att skriva in som en float och casting till en sträng med n+"" men jag har inte kontrollerat.

Erik the Outgolfer 07/29/2017.

Brachylog , 23 byte

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

Prova det online!

Brachylog går inte bra med flottor ...

Förklaring:

{∋ịṫ}ᶠ⟨≡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.

Skal , 15 byte

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

Tar en sträng och returnerar ett nummer. Prova det online!

Förklaring

Det är lite irriterande att den inbyggda parsningsfunktionen r ger parsfel på ogiltiga ingångar istället för att returnera ett standardvärde, vilket innebär att jag måste explicit filtrera bort kolumnerna som består av icke-siffror. Om det returneras 0 på felaktiga ingångar kunde jag släppa fΛ± och spara 3 byte.

§+ȯṁ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 byte

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

Test Suite .

Python 3 , 78 byte

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

Test svit.

Det andra tillvägagångssättet är en port till Python 3 inspirerad av @ officialaimms lösning.


ThePirateBay 07/31/2017.

JavaScript, 75 62 byte

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

Prova det online

-2 bytes thanks to Arnauld
-5 bytes thanks to Shaggy (Jag måste dock få ett nummer, men nu ser jag att många andra svar tar emot sträng också)


Xcali 08/05/2017.

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

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

Prova det online!

Användte några knep från Doms kod för att raka 4 byte

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
Klarade sig med ett mycket liknande tillvägagångssätt, men lyckades få ett par byte av med $ \ och avsluta slingan: prova online!
Xcali 08/05/2017
Använd lite inspiration från dig att raka mina ner. Vad är "} {" konstruktionen i slutet av din? Jag är inte bekant med den där.
Dom Hastings 08/05/2017
Det är en jag lärde mig från den här webbplatsen, i grund och botten -n och -p bokstavligen ett while(){...} runt koden så }{ bryter ut det. Detta försvinner $_ men om du använder $\ som din variabel kommer det fortfarande att skrivas ut eftersom $\ bifogas varje utskrift. Betyder att du kan lagra nummer eller något i det och bortse från $_ . Inte säker på att det var en bra förklaring, men kolla tipsen för golf g i Perl- tråden, jag är säker på att det kommer att förklara det bättre! Glad att ha hjälpt din poäng men!

Erik the Outgolfer 07/29/2017.

Gelé , 17 byte

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

Prova det online!


Erik the Outgolfer 07/29/2017.

Pyth, 18 bytes

s+RvQsM*RF_lB@jkUT 

Prova det här.


Mr. Xcoder 07/29/2017.

Pyth , 21 20 bytes

K@jkUTQ+smv*lKdK*lKv 

Test svit.

Använder ett helt annat tillvägagångssätt från @ EriktheOutgolfers svar , vilket hjälpte mig golf 1 byte i chatt, från 22 till 21.


Förklaring

  K@jkUTQ+s.ev*lKbK*lKv   K @ jkUTQ - Filtrerar siffrorna och tilldelar dem till en variabel K.           m - Karta.  Itererad genom siffrorna med en variabel d             v - Utvärdera (konvertera till float).              * lKd - Multiplicerar varje strängsiffra med längden på K.          s - Summa         + - Summa                   * lKvQ - Multiplicerar numret med längden på siffrorna String 

officialaimm 07/30/2017.

Python 2 , 81 74 bytes

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

  • Tar in heltal eller float, returnerar float.
 lambda x:sum(float(i*len(z))for z in[[i for i in`x`if"/" 

Prova det online!

Förklaring:

Säg 123.45 anges som inmatning. [i for i in`x`if"/" ger en lista över strängade heltal ['1','2','3','4','5'] (vilket också är z ). Nu viar det genom [x]+z dvs [123.45,'1','2','3','4','5'] , multiplicera varje element med len(z) , här 5 och konvertera var och en till en Float (så att strängar också konverterar i enlighet därmed), vilket ger [617.25,11111.0,22222.0,33333.0,44444.0,55555.0] . Slutligen beräknar vi sum(...) och erhåller 167282.25 .

4 comments
Mr. Xcoder 07/29/2017
78 byte . Ersätt i.isdigit() med "/"
1 Mr. Xcoder 07/29/2017
74 byte . Du kan ersätta i.isdigit() med "/" , faktiskt, eftersom båda . och - har lägre ASCII-koder än siffror, adn / är mellan dem
officialaimm 07/29/2017
@ Mr.Xcoder Tack så mycket!
Mr. Xcoder 07/29/2017
Varsågod. Jag har portat det till Python 3 som ett alternativ till mitt svar

Bruce Forte 07/30/2017.

Oktav , 100 82 byte

Tack mycket @TomCarpenter för att lära mig att uppdragen har ett returvärde och sparar mig 18 byte!

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

Prova det online!

Ungolfed / Förklaring

 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 

Så här fungerar det att vi i princip behöver lägga till numret själv n gånger och sedan lägga till summan av kolumnerna. Summing s' * logspace(0,n-1,n) uppnår summan av kolumner, till exempel om v=-123.4 den matrisen kommer att vara:

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

Så vi behöver bara sum det och vi är klara.

1 comments
1 Tom Carpenter 07/30/2017
Du kan spara 18 byte genom att smashing det hela till en anonym funktion @(v)(n=nnz(s=strrep(num2str(abs(v)),'.','')-'0'))*v+sum(sum(‌​s'*logspace(0,n-1,n)‌​)) . Prova det online!

Mr. Xcoder 07/30/2017.

Swift 4 , 139 134 bytes

 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,+))} 

Test svit.


Förklaring

  • func f(s:String) - Definierar en funktion f med en explicit String parameter s .

  • let k=s.filter{"/"<$0} - Filtrerar siffrorna: Jag märkte att både - och . har mindre ASCII-värden än alla siffror, och / är mellan . , - och 0 . Därför kontrollerade jag bara om "/" är mindre än nuvarande tecken, som jag gjorde i mitt Python-svar.

  • print(...) - Skriver ut resultatet.

  • Float(s)!*Float(k.count) - Konverterar både strängen och antalet siffror till Float och multiplicerar dem (Swift tillåter inte Float och Int multiplication :()). Så lägger man till numret x gånger, där x är antalet siffror den innehåller.

  • k.mapNO maps over k with the current value $0 . - k.map{} kartor över k med nuvarande värde $0 . String(repeating:$0,count:k.count) tar varje siffra, skapar en sträng av x identiska siffror och Float(...)! omvandlar den till ett flytande punktnummer.

  • .reduce(0,+) - Hämtar summan av listan ovan.

  • Och slutligen + summerar de två resultaten.


Låt oss ta ett exempel!

Säg att vår sträng är "0.45" . Först av, vi filtrerar siffrorna, så vi är kvar med 0, 4, 5 . Vi konverterar "0.45" till Float och multiplicerar med antalet siffror: 0.45 * 3 = 1.35 . Sedan tar vi varje siffra och vänder den till en sträng som upprepar den siffran tills den fyller kvadratens bredd (hur många siffror finns det): 0, 4, 5 -> 000, 444, 555 . Vi summerar detta, 000 + 444 + 555 = 999 . Sedan lägger vi bara till resultaten tillsammans: 1.35 + 999 = 1000.35 .


TheLethalCoder 07/31/2017.

C #, 139 137 byte

 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.

Prova det online!

Full / formaterad version:

 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
Du kan spara 2 byte i början genom att använda var d=(n+ ... istället för var d = (n ...
TheLethalCoder 07/31/2017
@IanH. Glömt att ta bort alla utrymmen -_- Det är vad jag får för att svara när jag gör ett supportsamtal.

Jenny_mathy 08/09/2017.

Mathematica, 107 byte

(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 byte

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

Kör som rör med -nR .

Kan ge varningar i PHP 7.1. Ändra $c,$e med $c>0?$c:0,$e att fixa.


C McAvoy 07/31/2017.

Python 3 , 68 70 73 77 byte

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

Prova det online!

Slingrar över varje siffertecken och upprepar det med antalet siffror totalt, gör det till ett heltal och lägger till det till n . På så sätt får n tillsatt d gånger, den horisontella delen av summan, tillsammans med cifferrepetitionen, vilken är den vertikala delen. Ursprungligen använde str.isdigit men >"/" , tack vare andra i den här tråden, sparade mycket byte. Sparar två byte genom att ta n som en sträng, men utsignalen är messigare.

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

Prova det online!

Related questions

Hot questions

Language

Popular Tags