Neliö numeroa minun tapaukseni

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

Ihmiset kertovat minulle, että numeron neliö on kerrottu itsessään. Tämä on tietenkin väärä. Oikea tapa neliöidään numero on tehdä se neliöksi, pinoamalla se itselleen useamman kerran kuin sen numeroiden määrä ja sitten lukemalla kaikki numerot tuloksena olevasta neliöstä sekä horisontaalisesti (alkaen vasemmalle oikealle) ja pystysuoraan (vain ylöspäin tai alaspäin) ja lisäät ne sitten yhteen. Joten, numero 123, luo ensin neliö:

123
123
123 

Sitten otat kaikki rivit ja sarakkeet neliöstä ja lisäät ne yhteen:

123+123+123+111+222+333 

Mikä antaa meille tuloksen 1035 .

Negatiivisille numeroille tallennat normaalisti (muista, että laski vain numeroiden määrä, joten negatiivinen merkki ei sisälly pituuteen) ja lue sitten vaakasuorat numerot normaalisti (negatiivisilla merkkeillä), ja ota sitten negatiiviset merkinnät pystysuorat numerot. Joten, numero -144 saamme neliön:

-144
-144
-144 

Mikä antaa meille -144-144-144+111+444+444 , mikä on 567

Jos numeroita on vain yksi numero, neliö on aina sama kuin kaksinkertainen määrä (lue kerran vaakasuunnassa ja kerran pystysuunnassa). Niin 4 antaa meille

4 

Mikä antaa meille 4+4 , mikä on 8 .

Jos numeroita on desimaaliluvuissa, pino on normaalisti (muista, että vain digits lasketaan kerrottuna numeroina, jolloin desimaalipistettä ei lasketa) ja sivuuttaa desimaalimerkit lukiessasi pystysuoria numeroita. Esimerkiksi numero 244.2 antaa meille

244.2
244.2
244.2
244.2 

Mikä antaa meille 244.2+244.2+244.2+244.2+2222+4444+4444+2222 , mikä vastaa 14308.8 .

Murtoluvut tai kompleksiluvut eivät voi olla neliöitä.

Sinun tehtäväsi:

Olen kyllästynyt neliöimään numeroita käsin, joten olen päättänyt automatisoida prosessin. Kirjoita minulle ohjelma tai toiminto, joka vie kellon tai merkkijonon, kumpi haluat, syötteeksi ja palauttaa tuloksen neliöimiseksi.

esimerkkejä:

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 

pisteytys:

Omat käteni ovat ahtaita kirjoittamasta kaikki nämä neliöt, ja tietokone ei tue kopioi / liitä, joten merkintä, jolla on vähiten määrä koodia minulle kirjoitettavaksi (mitattu tavuista jostain syystä?) Voittaa!

5 Comments
Gryphon 07/29/2017
Ymmärrän, että tämä ei ollut hiekkalaatikkoon kovin kauan (vain hieman yli päivässä), mutta sillä oli jo 7 upsota, joten luulen, että se oli todennäköisesti valmis lähettämään.
1 Leaky Nun 07/29/2017
"123.45" ja "244.2" eivät ole kelvollisia kellukkeita itsessään, koska tietokone tallentaa numeron binaarissa. Tämä ei yleensä ole ongelma, ennen kuin ongelma perustuu desimaalilukuun.
3 Leaky Nun 07/29/2017
@Gryphon Tämä on silloin, kun se epäonnistuu. 244.2 ei ole float-numero. Sitä ei voi muuntaa merkkijonoksi "244.2" .
2 Leaky Nun 07/29/2017
@Gryphon Mutta tälläinen käyttäytyminen tekee siitä erittäin hankalaa.
7 Gryphon 07/29/2017
Miksi kolme läheistä ääntä? Jos 11 henkilö voi vastata kysymykseen, luulen, että se on luultavasti melko selvä!

20 Answers


Erik the Outgolfer 07/29/2017.

05AB1E , 7 tavua

þSDg×+O 

Kokeile verkossa!

Selitys

þ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 selitys, kun voi miellyttää
1 Jonathan Allan 07/29/2017
Haluan myös huomata, että yksittäinen nolla on vaatimus tulolle -1 <tulo <1 (eli 0,45 ja .45 ovat erilaisia ​​tuloja mutta sama luku, vain ensimmäinen on hyväksyttävissä)
Erik the Outgolfer 07/29/2017
@JonathanAllan Jälkimmäistä ei käsitellä anyways.
Erik the Outgolfer 07/29/2017
@JonathanAllan Done.

Jonathan Allan 07/29/2017.

Jelly , 13 12 tavua

fØDẋ€L$ŒV+VS 

Moniadinen linkki, joka hyväksyy merkkiluettelon (hyvin muodostettu desimaaliluku, yhden johtavan nollan vaatimus -1 < n < 1 ) ja numeron palauttaminen.

Try it online!

14 tavua hyväksyä ja palauttaa numerot (tulo rajoitettu +/-10-5 : lla ŒṘ ): ŒṘfØDẋ€L$ŒV+⁸S .

Millä tavalla?

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, voit korvata +€ + + 15-tavuisella versiolla -1.
Jonathan Allan 07/29/2017
Jo nyt, kiitos kuitenkin!
Erik the Outgolfer 07/29/2017
Umm ei 15-tavuisessa versiossa. EDIT: 3 sekuntia liian aikaisin oletan ...
Jonathan Allan 07/29/2017
Yup vain huomasi sanoit 15 tavun version - kiitos taas!

nimi 07/29/2017.

Haskell, 59 56 tavua

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

Tulo otetaan merkkijonona.

Kokeile verkossa!

Kuinka se toimii

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 tavua

o\d
l
¬xpV +V*Ng 

Testaa se verkossa!

Selitys

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 tavua

Saved 9 bytes thanks to @TheLethalCoder
Tallennettiin vielä 8 tavua @TheLethalCoderin ansiosta

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

Kokeile verkossa!

Ottaa merkkijonon syötteenä ja antaa 'neliön' numeron kelluvaksi.


Tämä koodi noudattaa seuraavaa algoritmia:

  1. Luo uusi merkkijono syötteestä, mutta ilman desimaalipisteitä ja symboleja, niin voimme saada pituus ja sarakkeiden numerot sieltä.

  2. Laske syöttöajat pisteen 1 luoman merkkijonon pituudella.

  3. Jokaisen neliön sarakkeen osalta luo uusi merkkijono sarakkeenumerolla ja rivin pituudella ja lisää se tulokseen.

Esimerkki:

Tulo: -135.5

  1. Jos korvataan desimaaleja ja symboleja, saadaan merkkijono 1355 , jonka pituus on 4 .
  2. -135.5 * 4 = -542 4: -135.5 * 4 = -542 .
  3. Nyt luodaan jokaiselle sarakkeelle uusia merkkijonoja, jäsennetään niitä ja lisätään ne tulokseen:
    1111 , 3333 , 5555 , 5555 .

Jos summaamme nämä numerot, saamme 15012 , mikä on juuri ohjelmamme tuotos.

5 comments
1 Dada 07/31/2017
Tervetuloa sivustolle ja mukava ensimmäinen vastaus (erityisesti selityksiä arvostetaan!)!
Ian H. 07/31/2017
@Dada Kiitos! Jopa kovaa olen melko string.Replace() bytes string.Replace() tavaroista kuin string.Replace() , mutta luulen string.Replace() ainoa tapa se toimii!
TheLethalCoder 07/31/2017
Saatat säästää joitakin tavuja asettamalla i ja l kelluu.
Ian H. 07/31/2017
@TheLethalCoder Ajateltiin, että myös, valitettavasti indeksointi ei toimi .Length , ja. .Length ei voi implisiittisesti muuntaa 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 tavua. Saatat säästää ottamalla syötteen float ja valetuksi merkkijonoon n+"" mutta en ole tarkistanut.

Erik the Outgolfer 07/29/2017.

Brachylog , 23 tavua

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

Kokeile verkossa!

Brachylog ei mene hyvin kellukkeihin ...

Selitys:

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

Huskata , 15 tavua

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

Ottaa merkkijonon ja palauttaa numeron. Kokeile verkossa!

Selitys

On vähän ärsyttävää, että sisäänrakennettu jäsentelytoiminto r antaa parsin virheitä virheellisissä panoksissa sen sijaan, että palautettaisiin oletusarvo, mikä tarkoittaa, että minun on nimenomaisesti suodatettava sarakkeet, jotka koostuvat ei-numeroista. Jos se palautti väärän fΛ± tulon 0, voisin pudota fΛ± ja tallentaa 3 tavua.

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

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

Test Suite .

Python 3 , 78 tavua

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

Test Suite.

Toinen lähestymistapa on portti Python 3: lle, joka on inspiroinut @ officialaimmin ratkaisun.


ThePirateBay 07/31/2017.

JavaScript, 75 62 tavua

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

Kokeile sitä verkossa

-2 bytes thanks to Arnauld
-5 bytes thanks to Shaggy (minä vaikka funktio on saatava numero, mutta nyt näen, että monet muut vastaukset saavat myös merkkijonoa)


Xcali 08/05/2017.

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

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

Kokeile verkossa!

Käytti joitakin temppuja Domin koodista ajaa 4 tavua

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
Tuli hyvin samanlaiseen lähestymistapaan, mutta onnistui saamaan muutaman tavun käytöstä $ \ ja sulkemalla silmukan: kokeile sitä verkossa!
Xcali 08/05/2017
Käytti jotain inspiraatiota sinut ajamaan kaivoksen alas. Mikä on "} {" rakentaminen lopussa sinun? En tunne sitä.
Dom Hastings 08/05/2017
Se olen oppinut tästä sivustosta, pohjimmiltaan -n ja -p kirjaimellisesti kääritä while(){...} ympärillä koodia niin }{ katkeaa siitä. Tämä katkaisee $_ mutta jos käytät muuttujaa $\ , se tulostuu silti, koska $\ lisätään jokaiseen tulostukseen. Voit tallentaa numeron tai jotain siinä ja jättää huomiotta $_ . En ole varma, että tämä oli hieno selitys, mutta tutustu Vihjeitä golfia Perl thread, olen varma, että selittää sen paremmin! Olen iloinen voidessasi auttaa sinua pisteet!

Erik the Outgolfer 07/29/2017.

Jelly , 17 tavua

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

Kokeile verkossa!


Erik the Outgolfer 07/29/2017.

Pyth, 18 tavua

s+RvQsM*RF_lB@jkUT 

Kokeile täältä.


Mr. Xcoder 07/29/2017.

Pyth , 21 20 tavua

K@jkUTQ+smv*lKdK*lKv 

Testisarja.

Käyttää täysin erilainen lähestymistapa @ EriktheOutgolferin vastauksesta , joka auttoi golfia 1 tavua chatissa, 22-21 .


Selitys

  K@jkUTQ+s.ev*lKbK*lKv   K @ jkUTQ - Suodattaa numerot ja määrittää ne muuttujalle K.           m - Kartta.  Löytyy numeroiden läpi muuttujalla d             v - Arvioi (muunna floatiksi).              * lKd - Kertoo jokaisen String-numeron pituudella K.          s - Summa         + - Summa                   * lKvQ - Moninkertaistaa luvun lukumäärän pituudella 

officialaimm 07/30/2017.

Python 2 , 81 74 tavua

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

  • Ottaa kokonaisluku tai float, palaa float.
 lambda x:sum(float(i*len(z))for z in[[i for i in`x`if"/" 

Kokeile verkossa!

Selitys:

Sano 123.45 annetaan syötteenä. [i for i in`x`if"/" antaa listan haaroitetuista kokonaislukuista ['1','2','3','4','5'] (joka on myös z ). Nyt weerate läpi [x]+z eli [123.45,'1','2','3','4','5'] , kertoo kukin elementti len(z) 5 ja muuntamalla kukin Float (niin, että myös merkkijonot muunnetaan vastaavasti), jolloin saadaan [617.25,11111.0,22222.0,33333.0,44444.0,55555.0] . Lopuksi lasketaan sum(...) ja saadaan 167282.25 .

4 comments
Mr. Xcoder 07/29/2017
78 tavua . Korvaa i.isdigit() "/"
1 Mr. Xcoder 07/29/2017
74 tavua . Voit korvata i.isdigit() "/" , itse asiassa, koska molemmat . ja - niillä on alempia ASCII-koodeja kuin numeroilla, adn / on niiden välissä
officialaimm 07/29/2017
@ Mr.Xcoder Kiitos paljon!
Mr. Xcoder 07/29/2017
Ole hyvä. Olen siirtänyt sen Python 3: lle vaihtoehtona vastauksestani

Bruce Forte 07/30/2017.

Octave , 100 82 tavua

Kiitos paljon @TomCarpenterin opettamasta minulle, että tehtävillä on palautusarvo ja säästää minua 18 tavua!

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

Kokeile verkossa!

Ungolfed / Selitys

 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 

Näin se toimii, että meidän on periaatteessa lisättävä numero itsessään n kertaa, ja lisää sitten sarakkeiden summa. s' * logspace(0,n-1,n) saavuttaa sarakkeiden summan, esimerkiksi jos v=-123.4 matriisi on:

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

Joten meidän täytyy vain sum sen ja olemme valmiit.

1 comments
1 Tom Carpenter 07/30/2017
Voit tallentaa 18 tavua sumuttamalla sen kaikki nimettömään funktioon @(v)(n=nnz(s=strrep(num2str(abs(v)),'.','')-'0'))*v+sum(sum(‌​s'*logspace(0,n-1,n)‌​)) . Kokeile verkossa!

Mr. Xcoder 07/30/2017.

Swift 4 , 139 134 tavua

 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 Suite.


Selitys

  • func f(s:String) - Määrittää funktion f jolla on eksplisiittinen String-parametri s .

  • let k=s.filter{"/"<$0} - Suodattaa numerot: Huomasin, että molemmat - ja . on pienempiä ASCII-arvoja kuin kaikki numerot, ja / on välillä . , - ja 0 . Näin ollen vain tarkistin, jos "/" on pienempi kuin nykyinen merkki, kuten tein Python-vastauksessani.

  • print(...) - Tulostaa tuloksen.

  • Float(s)!*Float(k.count) - Muuntaa sekä merkkijonon että numeroiden numeron Float(s)!*Float(k.count) ja kertoo ne (Swift ei salli Float- ja Int-kertolaskua :()). Joten se lisää numero x kertaa, missä x on sen numeroiden määrä.

  • k.mapNO maps over k with the current value $0 . - k.map{} karttoja yli k , kun nykyinen arvo on $0 . String(repeating:$0,count:k.count) vie jokaisen numeron, luo Stringin x identtiset numerot ja Float(...)! muuntaa sen Floating-point numeroon.

  • .reduce(0,+) - .reduce(0,+) yllä olevan luettelon summan.

  • Ja lopuksi + summaa kaksi tulosta.


Otetaan esimerkki!

Sano Stringin olevan "0.45" . Ensin, suodatamme numerot, joten jäämme 0, 4, 5 . Muunnetaan "0.45" Floatiksi ja kerrotaan numeromäärällä: 0.45 * 3 = 1.35 . Sitten otetaan jokainen numero ja käännetään merkkijonoksi, joka toistaa kyseisen numeron, kunnes se täyttää neliön leveyden (kuinka monta numeroa on): 0, 4, 5 -> 000, 444, 555 . Summaamme tämän, 000 + 444 + 555 = 999 . Sitten lisätään tulokset yhteen: 1.35 + 999 = 1000.35 .


TheLethalCoder 07/31/2017.

C #, 139 137 tavua

 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.

Kokeile verkossa!

Täysi / muotoiltu versio:

 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
Voit tallentaa 2 tavua alussa käyttämällä var d=(n+ ... sijasta var d = (n ...
TheLethalCoder 07/31/2017
@IanH. Unohda poistaa kaikki tilat -_- Saan tämän vastaamaan samalla tukipuhelun aikana.

Jenny_mathy 08/09/2017.

Mathematica, 107 tavua

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

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

Suorita putkena -nR .

Saatat saada varoituksia PHP 7.1: ssä. Korvaa $c,$e arvolla $c,$e $c>0?$c:0,$e .


C McAvoy 07/31/2017.

Python 3 , 68 70 73 77 tavua

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

Kokeile verkossa!

Piirtää jokaisen merkkilohkon yli ja toistaa sen numerojoukon kokonaislukumäärän mukaan, tekee sen kokonaislukuun ja lisää sen arvoon n . Tällä tavoin n saadaan lisää d kertaa, summan vaakasuora osa sekä numeron toisto, joka on pystysuora osa. Alunperin käytettiin str.isdigit mutta >"/" , kiitos muiden ketjun käyttäjille, tallentanut paljon tavua. Tallentaa kaksi tavua ottamalla n merkkijonona, mutta tulos on messier.

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

Kokeile verkossa!

Related questions

Hot questions

Language

Popular Tags