Kuadratkan Nomor Jalanku

32

Orang-orang terus mengatakan kepada saya bahwa kuadrat angka adalah angka yang dikalikan dengan sendirinya. Ini jelas salah. Cara yang benar untuk mengkuadratkan angka adalah dengan membuatnya menjadi kuadrat, dengan menumpuknya di atas dirinya sendiri beberapa kali sama dengan jumlah digit yang dimilikinya, dan kemudian membaca semua angka dari kuadrat yang dihasilkan, baik secara horizontal (dari hanya dari kiri ke kanan) dan vertikal (hanya dari atas ke bawah), dan kemudian menambahkannya bersama. Jadi, untuk angka 123, pertama-tama Anda membuat kotak:

123
123
123

Kemudian Anda mengambil semua baris dan kolom dari kotak, dan menambahkannya bersama-sama:

123+123+123+111+222+333

Yang memberi kita hasil 1035.

Untuk angka negatif, Anda menumpuk secara normal (ingat bahwa Anda hanya menghitung jumlah digit , sehingga tanda negatif tidak termasuk dalam panjangnya), dan kemudian baca angka horisontal secara normal (dengan tanda negatif), lalu abaikan tanda negatif untuk angka vertikal. Jadi, untuk nomornya -144kita mendapatkan kotak:

-144
-144
-144

Yang memberi kita -144-144-144+111+444+444, yang sama dengan567

Untuk angka dengan hanya satu digit, kuadrat selalu sama dengan angka dua kali lipat (dibaca sekali secara horizontal dan sekali secara vertikal). Jadi 4beri kami

4

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

Untuk angka dengan bagian desimal, susun secara normal (ingat bahwa hanya digit yang dihitung dalam berapa kali Anda menumpuk angka, dan oleh karena itu, angka desimal tidak dihitung), dan abaikan simbol desimal ketika membaca angka vertikal. Misalnya, nomor 244.2memberi kita

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.

Angka pecahan atau kompleks tidak dapat dikuadratkan.

Tugas Anda:

Saya bosan menghitung angka dengan cara saya sendiri, jadi saya memutuskan untuk mengotomatiskan prosesnya. Tuliskan saya program atau fungsi yang membutuhkan float atau string, mana yang Anda suka, sebagai input dan mengembalikan hasil kuadrat dengan cara 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

Mencetak:

Tangan saya semakin sempit karena menulis semua kotak itu, dan komputer saya tidak mendukung copy / paste, jadi entri dengan jumlah kode paling sedikit untuk saya ketik (diukur dalam byte untuk beberapa alasan?) Menang!

Gryphon - Pasang kembali Monica
sumber
1
"123.45" dan "244.2" tidak valid mengapung di dalam dan dari dirinya sendiri karena komputer menyimpan angka dalam biner. Ini biasanya bukan masalah sampai masalahnya bergantung pada representasi desimal.
Leaky Nun
@ LeakyNun, saya tidak benar-benar tahu apa yang Anda maksud dengan itu. Masalahnya bukan tidak terpecahkan (setidaknya dalam python), saya cukup yakin saya bisa melakukannya dengan cukup mudah, meskipun dalam jumlah besar byte. Akan tetapi, ini membutuhkan manipulasi string.
Gryphon - Pasang kembali Monica
@Gryphon Jadi kita harus mengambil input sebagai string?
Leaky Nun
3
@Gryphon Di sinilah ia gagal. 244.2bukan nomor pelampung. Itu tidak dapat dikonversi ke string "244.2".
Leaky Nun
3
@Gryphon Tapi perilaku seperti ini membuatnya sangat merepotkan.
Leaky Nun

Jawaban:

8

05AB1E , 7 byte

þSDg×+O

Cobalah online!

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
Erik the Outgolfer
sumber
3
Ooo penjelasan kalau bisa tolong
Jonathan Allan
1
Saya juga akan mencatat bahwa nol terkemuka tunggal adalah persyaratan pada input untuk -1 <input <1 (yaitu 0,45 dan 0,45 adalah input yang berbeda tetapi nomor yang sama, hanya yang pertama yang dapat diterima)
Jonathan Allan
@ JonathanAllan Yang terakhir tidak ditangani.
Erik the Outgolfer
@JonathanAllan Selesai.
Erik the Outgolfer
7

Jelly ,  13  12 byte

fØDẋ€L$ŒV+VS

Tautan monadik yang menerima daftar karakter (angka desimal yang terbentuk dengan baik, angka nol di depan menjadi persyaratan untuk -1 <n <1 ) dan mengembalikan angka.

Cobalah online!

14 byte untuk menerima dan nomor kembali (input terbatas 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
Jonathan Allan
sumber
Umm, Anda bisa mengganti +€dengan +dalam versi 15-byte untuk -1.
Erik the Outgolfer
Sudah melakukannya, terima kasih!
Jonathan Allan
Umm tidak dalam versi 15 byte. EDIT: 3 detik terlalu awal saya kira ...
Erik the Outgolfer
Yup baru saja memperhatikan Anda mengatakan versi 15 byte - terima kasih lagi!
Jonathan Allan
6

Haskell, 59 56 byte

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

Input diambil sebagai string.

Cobalah online!

Bagaimana itu bekerja

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   
nimi
sumber
5

Japt v2 , 16 byte

o\d
l
¬xpV +V*Ng

Uji secara online!

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.
Produksi ETH
sumber
4

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

Disimpan 9 byte berkat @TheLethalCoder
Menyimpan 8 byte lainnya berkat @TheLethalCoder

a=>{var c=(a+"").Replace(".","").Replace("-","");int i=0,l=c.Length;var r=a*l;for(;i<l;)r+=int.Parse(new string(c[i++],l));return r;}

Cobalah online!

Mengambil string sebagai input dan menampilkan angka 'kuadrat' sebagai pelampung.


Kode ini mengikuti algoritma berikut:

  1. Buat string baru dari input, tetapi tanpa titik dan simbol desimal, sehingga kita bisa mendapatkan panjang dan angka untuk kolom dari sana.

  2. Hitung input kali panjang string yang kami buat di titik 1.

  3. Untuk setiap kolom di 'kotak' kami, buat string baru dengan nomor kolom dan panjang baris dan tambahkan ke hasil kami.

Contoh:

Memasukkan: -135.5

  1. Jika kita mengganti titik desimal dan simbol kita mendapatkan string 1355, yang memiliki panjang 4.
  2. The kali masukan 4: -135.5 * 4 = -542.
  3. Sekarang kita membuat string baru untuk setiap kolom, menguraikannya dan menambahkannya ke hasil kami:
    1111, 3333, 5555, 5555.

Jika kita menjumlahkan angka-angka ini, kita dapatkan 15012, yang akan dihasilkan oleh program kita.

Ian H.
sumber
1
Selamat datang di situs ini, dan jawaban pertama yang bagus (penjelasannya sangat dihargai!)!
Dada
@Dada Terima kasih! Bahkan tangguh saya agak tidak senang dengan byte yang saya peroleh dari hal-hal seperti string.Replace(), tapi saya kira itulah satu-satunya cara kerjanya!
Ian H.
Mungkin dapat menyimpan beberapa byte dengan mengatur idan lmengapung.
TheLethalCoder
@TheLethalCoder Memikirkan hal itu juga, sayangnya pengindeksan tidak berfungsi dengan float, dan .Lengthtidak dapat secara implisit dikonversi menjadi float.
Ian H.
1
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 byte Mungkin dapat menyimpan dengan mengambil input sebagai floatdan melemparkan ke string dengan n+""tetapi saya belum memeriksa.
TheLethalCoder
3

Brachylog , 23 byte

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

Cobalah online!

Brachylog tidak cocok dengan pelampung ...

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)
Erik the Outgolfer
sumber
3

Sekam , 15 byte

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

Mengambil string dan mengembalikan nomor. Cobalah online!

Penjelasan

Agak menyebalkan bahwa fungsi parsing rbawaan memberikan kesalahan parse pada input yang tidak valid alih-alih mengembalikan nilai default, yang berarti bahwa saya harus secara eksplisit menyaring kolom yang terdiri dari non-digit. Jika mengembalikan 0 pada input yang salah bentuk, saya bisa menjatuhkan fΛ±dan menyimpan 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
Zgarb
sumber
3

Python 3 , 95 94 87 85 84 byte

def f(i):l=[x for x in i if"/"<x];k=len(l);print(k*float(i)+sum(int(x*k)for x in l))

Test Suite .

Python 3 , 78 byte

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

Test Suite.

Pendekatan kedua adalah port ke Python 3 yang terinspirasi oleh solusi @ officialaimm.

Tuan Xcoder
sumber
3

Python 2 , 81 74 byte

-7 byte terima kasih kepada @Mr. Xcoder :'/'<i

  • Dibawa dalam bilangan bulat atau float, mengembalikan float.
lambda x:sum(float(i*len(z))for z in[[i for i in`x`if"/"<i]]for i in[x]+z)

Cobalah online!

Penjelasan:

Say 123.45diberikan sebagai input. [i for i in`x`if"/"<x]memberikan daftar bilangan bulat yang dirubah ['1','2','3','4','5'](yang juga z). Sekarang kita beralih melalui [x]+zyaitu [123.45,'1','2','3','4','5'], mengalikan setiap elemen dengan len(z), di sini 5dan mengkonversi masing-masing menjadi Float (sehingga string juga mengkonversi sesuai), menghasilkan [617.25,11111.0,22222.0,33333.0,44444.0,55555.0]. Akhirnya kami menghitung sum(...)dan mendapatkan 167282.25.

officialaimm
sumber
78 byte . Ganti i.isdigit()dengan"/"<i<":"
Tn. Xcoder
1
74 byte . Anda dapat menggantinya i.isdigit()dengan "/"<i, pada kenyataannya, karena keduanya .dan -memiliki kode ASCII lebih rendah dari angka, dan /ada di antara keduanya
Tn. Xcoder
Sama-sama. Saya telah mengirimnya ke Python 3 sebagai alternatif untuk jawaban saya
Tn. Xcoder
3

JavaScript, 75 62 byte

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

Cobalah online

-2 byte terima kasih kepada Arnauld
-5 byte terima kasih kepada Shaggy (saya pikir fungsinya harus menerima angka, tetapi sekarang saya melihat bahwa banyak jawaban lain menerima string juga)


sumber
3

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

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

Cobalah online!

Menggunakan beberapa trik dari kode Dom untuk mencukur 4 byte

Dijelaskan:

@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
Xcali
sumber
Datang dengan pendekatan yang sangat mirip, tetapi berhasil mendapatkan beberapa byte menggunakan $ \ dan keluar dari loop: coba online!
Dom Hastings
Gunakan beberapa inspirasi dari Anda untuk mencukur saya. Apa konstruksi "} {" di bagian akhir Anda? Saya tidak terbiasa dengan yang itu.
Xcali
Itu yang saya pelajari dari situs ini, pada dasarnya -ndan -psecara harfiah membungkus while(){...}kode sehingga }{keluar dari itu. Ini terhapus $_tetapi jika Anda menggunakan $\ sebagai variabel Anda masih akan dicetak sejak saat itu$\ ditambahkan ke setiap cetak. Berarti Anda dapat menyimpan nomor atau sesuatu di dalamnya dan mengabaikannya $_. Tidak yakin itu penjelasan yang bagus, tetapi lihat Tips untuk bermain golf di thread Perl , saya yakin itu akan menjelaskannya dengan lebih baik! Senang telah membantu skor Anda!
Dom Hastings
2

Jelly , 17 byte

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

Cobalah online!

Erik the Outgolfer
sumber
2

Pyth , 21 20 byte

K@jkUTQ+smv*lKdK*lKv

Suite uji.

Menggunakan pendekatan yang sama sekali berbeda dari jawaban @ EriktheOutgolfer , yang membantu saya bermain golf 1 byte dalam obrolan, dari 22 hingga 21.


Penjelasan

K@jkUTQ+s.ev*lKbK*lKv

K @ jkUTQ - Memfilter digit dan menetapkannya ke variabel K.
         m - Peta. Iterasi melalui digit dengan variabel d
           v - Evaluate (convert to float).
            * lKd - Mengalikan setiap digit String dengan panjang K.
        s - Jumlah
       + - Jumlah
                 * lKvQ - Mengalikan angka dengan panjang string Digit
Tuan Xcoder
sumber
2

Oktaf , 100 82 byte

Terima kasih banyak @TomCarpenter karena mengajari saya bahwa tugas memiliki nilai balik dan menyelamatkan saya 18byte!

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

Cobalah online!

Tidak Terikat / 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 kerjanya adalah pada dasarnya kita perlu menambahkan angka itu sendiri nkali dan kemudian menambahkan jumlah kolom. Penjumlahan s' * logspace(0,n-1,n)mencapai jumlah kolom, misalnya jika v=-123.4matriks itu adalah:

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

Jadi kita hanya perlu melakukannya sumdan kita sudah selesai.

ბიმო
sumber
1
Anda dapat menyimpan 18 byte dengan cara smushing semuanya menjadi fungsi anonim @(v)(n=nnz(s=strrep(num2str(abs(v)),'.','')-'0'))*v+sum(sum(s'*logspace(0,n-1,n))). Cobalah online!
Tom Carpenter
1

Swift 4 , 139 134 byte

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)- Menentukan fungsi fdengan parameter String eksplisits .

  • let k=s.filter{"/"<$0}- Memfilter digit: Saya perhatikan keduanya -dan .memiliki nilai ASCII yang lebih kecil dari semua digit, dan /berada di antara ., -dan 0. Oleh karena itu, saya hanya memeriksa apakah "/"lebih kecil dari karakter saat ini, seperti yang saya lakukan dalam jawaban Python saya.

  • print(...) - Mencetak hasilnya.

  • Float(s)!*Float(k.count)- Mengonversi String dan jumlah digit ke Float dan mengalikannya (Swift tidak memungkinkan penggandaan Float dan Int :()). Jadi itu menambah jumlah xkali, di mana xjumlah digit yang dikandungnya.

  • k.map{Int(String(repeating:$0,count:k.count))!- k.map{}memetakan kdengan nilai saat ini $0. String(repeating:$0,count:k.count)mengambil setiap digit, membuat String xdengan angka yang identik dan Float(...)!mengubahnya menjadi angka Floating-point.

  • .reduce(0,+) - Mendapat jumlah daftar di atas.

  • Dan akhirnya +merangkum dua hasil.


Mari kita ambil contoh!

Katakanlah String kita "0.45". Pertama, kami memfilter digit, jadi kami tinggal bersama 0, 4, 5. Kami mengkonversi "0.45"ke Float dan kalikan dengan jumlah digit: 0.45 * 3 = 1.35. Kemudian kita mengambil setiap digit dan mengubahnya menjadi String mengulangi digit yang sampai memenuhi lebar persegi (berapa banyak digit ada): 0, 4, 5 -> 000, 444, 555. Kami menjumlahkan ini 000 + 444 + 555 = 999,. Kemudian kita hanya menambahkan hasil bersama-sama: 1.35 + 999 = 1000.35.

Tuan Xcoder
sumber
1

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);}

Disimpan 2 byte berkat @Ian H.

Cobalah online!

Versi Lengkap / Terformat:

namespace System.Linq
{
    class P
    {
        static void Main()
        {
            Func<double, double> 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();
        }
    }
}
TheLethalCoder
sumber
Anda dapat menyimpan 2 byte di awal dengan menggunakan var d=(n+ ...alih-alih var d = (n ....
Ian H.
@IanH. Lupa menghapus semua spasi -_- Itulah yang saya dapat untuk menjawab saat melakukan panggilan dukungan.
TheLethalCoder
1

Mathematica, 107 byte

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

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;

Jalankan sebagai pipa dengan -nR .

Dapat menghasilkan peringatan di PHP 7.1. Ganti $c,$edengan $c>0?$c:0,$euntuk memperbaiki.

Titus
sumber
0

Python 3 , 68 70 73 77 byte

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

Cobalah online!

Simpulkan setiap karakter digit dan ulangi dengan jumlah karakter digit secara keseluruhan, buat menjadi bilangan bulat, dan tambahkan ke n. Dengan cara ini nditambahkan dkali, bagian horizontal dari penjumlahan, bersama dengan pengulangan digit, yang merupakan bagian vertikal. Awalnya digunakan str.isdigittetapi >"/", terima kasih kepada orang lain di utas ini, menyelamatkan banyak byte. Menghemat dua byte dengan mengambil nsebagai string, tetapi hasilnya lebih berantakan.

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

Cobalah online!

C McAvoy
sumber