Square a Number my Way

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

Orang ramai memberitahu saya bahawa kuadrat nombor adalah nombor didarab dengan sendirinya. Ini jelas salah. Cara yang betul untuk mengikat nombor adalah untuk membuatnya menjadi persegi, dengan menyusunnya di atasnya beberapa kali bersamaan dengan bilangan digit yang dimilikinya, dan kemudian membaca semua nombor dari dataran yang dihasilkan, secara mendatar (dari kiri ke kanan sahaja) dan menegak (dari atas ke bawah sahaja), dan kemudian menambahnya bersama-sama. Oleh itu, untuk nombor 123, anda mula-mula membuat persegi:

123
123
123 

Kemudian anda mengambil semua baris dan lajur dari alun-alun, dan tambahnya bersama-sama:

123+123+123+111+222+333 

Yang memberi kita hasil 1035 .

Untuk nombor negatif, anda menumpukan secara normal (ingat bahawa anda hanya mengira bilangan digits , jadi tanda negatif tidak termasuk dalam panjang), dan kemudian membaca nombor mendatar secara normal (dengan tanda negatif), dan kemudian mengabaikan tanda-tanda negatif untuk nombor menegak. Jadi, untuk nombor -144 kita dapat persegi:

-144
-144
-144 

Yang memberikan kita -144-144-144+111+444+444 , yang sama dengan 567

Untuk nombor yang hanya mempunyai satu digit, persegi selalu sama dengan angka dua kali ganda (dibaca sekali mendatar dan sekali secara menegak). Jadi 4 memberikan kita

4 

Yang memberikan kita 4+4 , yang sama dengan 8 .

Untuk nombor dengan bahagian perpuluhan, timbulkan secara normal (ingat bahawa hanya digits yang dikira dalam bilangan kali anda menyusun nombor, dan oleh itu titik perpuluhan tidak dikira), dan mengabaikan simbol perpuluhan ketika membaca nombor menegak. Sebagai contoh, nombor 244.2 memberikan kami

244.2
244.2
244.2
244.2 

Yang memberi kita 244.2+244.2+244.2+244.2+2222+4444+4444+2222 , yang sama dengan 14308.8 .

Nombor pecahan atau kompleks tidak boleh dikecilkan.

Tugas anda:

Saya bosan dengan mengecilkan nombor saya dengan tangan, jadi saya telah memutuskan untuk mengautomasikan proses itu. Tuliskan saya program atau fungsi yang mengambil apungan atau rentetan, mengikut mana yang anda suka, sebagai input dan mengembalikan hasilnya memihak saya.

Contoh:

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 

Pemarkahan:

Tangan saya semakin sempit daripada menulis semua kotak itu, dan komputer saya tidak menyokong salinan / paste, jadi entri dengan jumlah paling sedikit kod untuk saya menaip (diukur dalam bait untuk sebab tertentu?) Menang!

5 Comments
Gryphon 07/29/2017
Saya menyedari bahawa ini tidak berada dalam kotak pasir untuk sekian lama (hanya sedikit lebih dari satu hari), tetapi ia sudah mempunyai 7 upvotes, jadi, saya fikir ia mungkin bersedia untuk menyiarkannya.
1 Leaky Nun 07/29/2017
"123.45" dan "244.2" tidak terapung dalam dan dari dirinya sendiri kerana komputer menyimpan nombor dalam binari. Ini biasanya tidak menjadi masalah sehingga masalah bergantung pada perwakilan perpuluhan.
3 Leaky Nun 07/29/2017
@Gryphon Di sinilah ia gagal. 244.2 bukan nombor terapung. Ia tidak boleh ditukar kepada rentetan "244.2" .
2 Leaky Nun 07/29/2017
@Gryphon Tetapi tingkah laku seperti ini menjadikannya sangat menyusahkan.
7 Gryphon 07/29/2017
Mengapa tiga undi rapat? Jika 11 orang boleh menjawab soalan itu, saya fikir ia mungkin cukup jelas!

20 Answers


Erik the Outgolfer 07/29/2017.

05AB1E , 7 bait

þSDg×+O 

Cuba dalam talian!

Penjelasan

þ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 penjelasan apabila anda boleh sila
1 Jonathan Allan 07/29/2017
Juga saya perhatikan bahawa sifar utama tunggal adalah keperluan pada input untuk -1 <input <1 (iaitu 0.45 dan .45 adalah input yang berbeza tetapi nombor yang sama, hanya yang pertama boleh diterima)
Erik the Outgolfer 07/29/2017
@JonathanAllan Yang terakhir tidak ditangani anyways.
Erik the Outgolfer 07/29/2017
@JonathanAllan Selesai.

Jonathan Allan 07/29/2017.

Jeli , 13 12 bait

fØDẋ€L$ŒV+VS 

Pautan monadik yang menerima senarai aksara (nombor perpuluhan yang terbentuk dengan baik, satu sifar utama menjadi satu keperluan untuk -1 < n < 1 ) dan mengembalikan nombor.

Try it online!

14 bait untuk menerima dan mengembalikan nombor (input terhad pada +/-10-5 oleh ŒṘ ): ŒṘfØDẋ€L$ŒV+⁸S .

Bagaimana?

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, anda boleh menggantikan +€ dengan + dalam versi 15-bait untuk -1.
Jonathan Allan 07/29/2017
Sudah, terima kasih!
Erik the Outgolfer 07/29/2017
Umm tidak dalam versi 15-bait. EDIT: 3 saat terlalu awal saya fikir ...
Jonathan Allan 07/29/2017
Yup hanya melihat anda berkata versi 15 byte - terima kasih sekali lagi!

nimi 07/29/2017.

Haskell, 59 56 bait

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

Input diambil sebagai rentetan.

Cuba dalam talian!

Bagaimana ia berfungsi

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 bytes

o\d
l
¬xpV +V*Ng 

Uji dalam talian!

Penjelasan

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 bytes

Saved 9 bytes thanks to @TheLethalCoder
Disimpan lagi 8 bait terima kasih kepada @TheLethalCoder

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

Cuba dalam talian!

Mengambil tali sebagai input dan mengeluarkan nombor 'kuasa dua' sebagai apungan.


Kod ini mengikuti algoritma berikut:

  1. Buat rentetan baru dari input, tetapi tanpa titik perpuluhan dan simbol, supaya kita boleh mendapatkan panjang dan nombor untuk lajur dari sana.

  2. Kira masa input panjang rentetan yang kita buat pada titik 1.

  3. Untuk setiap lajur di 'persegi' kami, buat rentetan baru dengan nombor lajur dan panjang baris dan tambahkannya kepada hasil kami.

Contoh:

Input: -135.5

  1. Sekiranya kita menggantikan titik dan simbol perpuluhan, kita akan mendapat rentetan 1355 , yang mempunyai panjang 4 .
  2. Masa input 4: -135.5 * 4 = -542 .
  3. Kini kami membuat rentetan baru untuk setiap lajur, mengurai dan menambahkannya kepada hasil kami:
    1111 , 3333 , 5555 , 5555 .

Sekiranya kita jumlahkan jumlah ini kita akan mendapat 15012 , yang sebenarnya adalah program kami yang akan dikeluarkan.

5 comments
1 Dada 07/31/2017
Selamat datang di laman web ini, dan jawapan pertama yang bagus (penjelasannya khususnya dihargai!)!
Ian H. 07/31/2017
@Dada Terima kasih! Walaupun sukar saya agak tidak menyenangkan oleh bait yang saya peroleh dari barangan seperti string.Replace() , tetapi saya rasa itulah satu-satunya cara ia berfungsi!
TheLethalCoder 07/31/2017
Boleh menyimpan beberapa bait dengan menetapkan i dan l ke apung.
Ian H. 07/31/2017
@TheLethalCoder Pemikiran yang juga, pengindeksan sedih tidak berfungsi dengan terapung, dan. .Length tidak boleh secara implisit diubah menjadi terapung.
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 bait. Mungkin dapat menyelamatkan dengan mengambil masukan sebagai float dan pemutus ke tali dengan n+"" tetapi saya tidak memeriksa.

Erik the Outgolfer 07/29/2017.

Brachylog , 23 bait

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

Cuba dalam talian!

Brachylog tidak baik dengan terapung ...

Penjelasan:

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

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

Mengambil rentetan dan mengembalikan nombor. Cuba dalam talian!

Penjelasan

Ia agak menjengkelkan bahawa fungsi parsing terbina dalam memberikan ralat parse pada input tidak sah dan bukannya mengembalikan nilai lalai, yang bermaksud bahawa saya perlu menyaring secara jelas kolom-kolom yang terdiri daripada bukan digit. Jika ia mengembalikan 0 pada input salah, saya boleh menurunkan fΛ± dan simpan 3 bait.

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

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

Test Suite .

Python 3 , 78 bait

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

Test Suite.

Pendekatan kedua ialah port ke Python 3 yang diilhamkan oleh penyelesaian @ rasmi.


ThePirateBay 07/31/2017.

JavaScript, 75 62 bait

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

Cuba dalam talian

-2 bytes thanks to Arnauld
-5 bytes thanks to Shaggy (saya walaupun fungsi mesti menerima nombor, tetapi sekarang saya melihat banyak jawapan lain menerima rentetan juga)


Xcali 08/05/2017.

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

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

Cuba dalam talian!

Menggunakan beberapa helah dari kod Dom untuk mencukur 4 bait

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
Datang dengan pendekatan yang hampir sama, tetapi berjaya mendapatkan beberapa bait dengan menggunakan $ \ dan keluar dari gelung: cuba dalam talian!
Xcali 08/05/2017
Digunakan beberapa inspirasi daripada anda untuk mencukur saya. Apa itu "} {" dibina di hujung kamu? Saya tidak kenal dengannya.
Dom Hastings 08/05/2017
Itulah yang saya pelajari dari laman web ini, pada dasarnya -n dan -p harfiah membungkus while(){...} sekitar kod itu }{ keluar daripada itu. Ini unsets $_ tetapi jika anda menggunakan $\ sebagai pembolehubah anda, ia masih akan dicetak sejak $\ ditambahkan pada setiap cetakan. Bermakna anda boleh menyimpan nombor atau sesuatu di dalamnya dan mengabaikan $_ . Tidak pasti itu adalah penjelasan yang hebat, tetapi periksa Tips untuk bermain golf dalam thread Perl , saya pasti akan menjelaskannya dengan lebih baik! Gembira dapat membantu skor anda sekalipun!

Erik the Outgolfer 07/29/2017.

Jeli , 17 bait

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

Cuba dalam talian!


Erik the Outgolfer 07/29/2017.

Pyth, 18 bait

s+RvQsM*RF_lB@jkUT 

Cuba di sini.


Mr. Xcoder 07/29/2017.

Pyth , 21 20 bait

K@jkUTQ+smv*lKdK*lKv 

Suite ujian.

Menggunakan pendekatan yang sama sekali berbeza daripada jawapan @ EriktheOutgolfer , yang membantu saya golf 1 bait dalam sembang, dari 22 hingga 21.


Penjelasan

  K@jkUTQ+s.ev*lKbK*lKv   K @ jkUTQ - Penapis digit dan menyerahkannya kepada pemboleh ubah K.           m - Peta.  Dihidupkan melalui digit dengan pembolehubah d             v - Menilai (menukar kepada terapung).              * lKd - Mengalikan setiap angka String dengan panjang K.          s - Jumlah         + - Jumlah                   * lKvQ - Mengalikan bilangan dengan panjang rentetan digit 

officialaimm 07/30/2017.

Python 2 , 81 74 bytes

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

  • Mengambil integer atau terapung, mengembalikan terapung.
 lambda x:sum(float(i*len(z))for z in[[i for i in`x`if"/" 

Cuba dalam talian!

Penjelasan:

Katakan 123.45 diberikan sebagai input. [i for i in`x`if"/" memberikan senarai bilangan bulat bertulis ['1','2','3','4','5'] (yang juga z ). Sekarang kita melewati [x]+z iaitu [123.45,'1','2','3','4','5'] , mengalikan setiap elemen dengan len(z) , di sini 5 dan menukarkan setiap satu ke Terapung (supaya rentetan juga menukar dengan sewajarnya), menghasilkan [617.25,11111.0,22222.0,33333.0,44444.0,55555.0] . Akhirnya kami mengira sum(...) dan memperoleh 167282.25 .

4 comments
Mr. Xcoder 07/29/2017
78 bait . Gantikan i.isdigit() dengan "/"
1 Mr. Xcoder 07/29/2017
74 bait . Anda boleh menggantikan i.isdigit() dengan "/" , sebenarnya, kerana kedua-duanya . dan - mempunyai kod ASCII yang lebih rendah daripada digit, dan ad di antara mereka
officialaimm 07/29/2017
@ Mr.Xcoder Terima kasih banyak!
Mr. Xcoder 07/29/2017
Sama-sama. Saya telah memindahkannya ke Python 3 sebagai alternatif kepada jawapan saya

Bruce Forte 07/30/2017.

Octave , 100 82 bytes

Terima kasih banyak @TomCarpenter kerana mengajar saya bahawa tugasan mempunyai nilai kembali dan menyelamatkan saya 18 bait!

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

Cuba dalam talian!

Unggued / Penjelasan

 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 

Cara ini berfungsi ialah kita pada dasarnya perlu menambah bilangan itu sendiri n kali dan kemudian tambah jumlah ruang. s' * logspace(0,n-1,n) mencapai jumlah tiang, contohnya jika v=-123.4 matriks ialah:

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

Jadi kita hanya perlu sum dan kita sudah selesai.

1 comments
1 Tom Carpenter 07/30/2017
Anda boleh menyimpan 18 bait dengan menghancurkan semuanya ke fungsi anonim @(v)(n=nnz(s=strrep(num2str(abs(v)),'.','')-'0'))*v+sum(sum(‌​s'*logspace(0,n-1,n)‌​)) . Cuba dalam talian!

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


Penjelasan

  • func f(s:String) - Menetapkan fungsi f dengan parameter String yang jelas.

  • let k=s.filter{"/"<$0} - Penapis digit: Saya perhatikan bahawa kedua-duanya - dan . mempunyai nilai ASCII yang lebih kecil daripada semua digit, dan / antara . , - dan 0 . Oleh itu, saya hanya memeriksa jika "/" adalah lebih kecil daripada watak semasa, seperti yang saya lakukan dalam jawapan Python saya.

  • print(...) - Mencetak hasilnya.

  • Float(s)!*Float(k.count) - Menukar kedua-dua String dan bilangan digit ke Float dan mengalikannya (Swift tidak membenarkan Float dan pendaraban Int :()). Jadi ia menambah nombor x kali, di mana x ialah bilangan digit yang terkandung.

  • k.mapNO maps over k with the current value $0 . - k.map{} peta di atas k dengan nilai semasa $0 . String(repeating:$0,count:k.count) mengambil setiap digit, mewujudkan Rentetan x angka yang sama dan Float(...)! menukarnya ke nombor Terapung.

  • .reduce(0,+) - Dapat jumlah senarai di atas.

  • Dan akhirnya + jumlah hasilnya.


Mari ambil contoh!

Katakan String kita ialah "0.45" . Pertama, kami menapis digit, jadi kami ditinggalkan dengan 0, 4, 5 . Kami menukar "0.45" ke Float dan darab dengan bilangan digit: 0.45 * 3 = 1.35 . Kemudian kita mengambil setiap digit dan mengubahnya menjadi String yang mengulangi digit itu sehingga ia mengisi lebar kuadrat (berapa digit terdapat): 0, 4, 5 -> 000, 444, 555 . Kami jumlah ini, 000 + 444 + 555 = 999 . Kemudian kami tambahkan hasilnya bersama-sama: 1.35 + 999 = 1000.35 .


TheLethalCoder 07/31/2017.

C #, 139 137 bait

 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.

Cuba dalam talian!

Versi Penuh / Format:

 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
Anda boleh menyimpan 2 bait pada mulanya dengan menggunakan var d=(n+ ... bukan var d = (n ...
TheLethalCoder 07/31/2017
@IanH. Lupa untuk mengalih keluar semua ruang -_- Itulah yang saya dapat untuk menjawab sementara melakukan panggilan sokongan.

Jenny_mathy 08/09/2017.

Mathematica, 107 bait

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

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

Jalankan sebagai paip dengan -nR .

Boleh memberi amaran dalam PHP 7.1. Ganti $c,$e dengan $c>0?$c:0,$e untuk memperbaiki.


C McAvoy 07/31/2017.

Python 3 , 68 70 73 77 bytes

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

Cuba dalam talian!

Gelung ke atas setiap watak digit dan mengulanginya dengan bilangan digit digit secara keseluruhan, menjadikannya menjadi integer, dan menambahkannya kepada n . Dengan cara ini n akan ditambah d kali, bahagian mendatar jumlah, bersama dengan pengulangan angka, yang merupakan bahagian menegak. Asalnya digunakan str.isdigit tetapi >"/" , terima kasih kepada orang lain dalam benang ini, menyimpan banyak bait. Menjimatkan dua byte dengan mengambil n sebagai rentetan, tetapi outputnya menjadi lebih kacau.

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

Cuba dalam talian!

Related questions

Hot questions

Language

Popular Tags