Beri nomor dengan cara saya

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

Orang-orang terus mengatakan kepada saya bahwa kuadrat angka adalah angka yang dikalikan dengan sendirinya. Ini jelas salah. Cara yang benar untuk membuat kuadrat angka adalah membuatnya menjadi persegi, dengan menumpuknya di atas dirinya sendiri beberapa kali sama dengan jumlah digit yang dimilikinya, dan kemudian membaca semua angka dari persegi yang dihasilkan, secara horisontal (dari kiri ke kanan saja) dan secara vertikal (dari atas ke bawah saja), dan kemudian menambahkannya bersama. Jadi, untuk nomor 123, Anda pertama kali 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 bilangan negatif, Anda menumpuk secara normal (ingat bahwa Anda hanya menghitung jumlah digits , sehingga tanda negatif tidak termasuk dalam panjangnya), dan kemudian membaca bilangan horizontal secara normal (dengan tanda negatif), lalu mengabaikan tanda negatif untuk angka vertikal. Jadi, untuk angka -144 kita mendapatkan kuadratnya:

-144
-144
-144 

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

Untuk angka dengan hanya satu digit, kuadrat selalu sama dengan angka dua kali lipat (baca satu kali secara horizontal dan satu kali secara vertikal). Jadi 4 memberi kita

4 

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

Untuk angka dengan bagian desimal, tumpuk secara normal (ingat bahwa hanya digits yang dihitung dalam berapa kali Anda menumpuk angka, dan karena itu titik desimal tidak dihitung), dan abaikan simbol desimal saat membaca angka vertikal. Misalnya, jumlah 244.2 memberi 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 lelah mengkuadratkan nomor dengan cara saya, jadi saya memutuskan untuk mengotomatiskan prosesnya. Tuliskan saya program atau fungsi yang menggunakan pelampung atau tali, pilih yang Anda inginkan, sebagai masukan dan kembalikan hasil mengkuadratkannya 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 sesak karena menulis semua kotak itu, dan komputer saya tidak mendukung copy / paste, sehingga entri dengan kode paling sedikit untuk saya ketik (diukur dalam byte untuk beberapa alasan?) Menang!

5 Comments
Gryphon 07/29/2017
Saya menyadari bahwa ini bukan di kotak pasir untuk waktu yang lama (hanya sedikit lebih dari satu hari), tetapi sudah memiliki 7 upvotes, jadi, saya pikir itu mungkin siap untuk dikirim.
1 Leaky Nun 07/29/2017
"123.45" dan "244.2" bukan pelampung yang valid di dalam dan dari dirinya sendiri karena komputer menyimpan angka dalam biner. Ini biasanya bukan masalah sampai masalah bergantung pada representasi desimal.
3 Leaky Nun 07/29/2017
@Gryphon Di sinilah gagal. 244.2 bukan angka mengambang. Ini tidak dapat dikonversi ke string "244.2" .
2 Leaky Nun 07/29/2017
@Gryphon Tetapi perilaku seperti ini membuatnya sangat tidak nyaman.
7 Gryphon 07/29/2017
Mengapa tiga suara dekat? Jika 11 orang dapat menjawab pertanyaan itu, saya pikir itu mungkin cukup jelas!

20 Answers


Erik the Outgolfer 07/29/2017.

05AB1E , 7 byte

þSDg×+O 

Coba 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 
4 comments
3 Jonathan Allan 07/29/2017
Ooo penjelasan kapan kamu bisa tolong
1 Jonathan Allan 07/29/2017
Juga saya akan mencatat bahwa nol tunggal terkemuka adalah persyaratan pada input untuk -1 <input <1 (yaitu 0,45 dan .45 adalah input yang berbeda tetapi jumlah yang sama, hanya yang pertama diterima)
Erik the Outgolfer 07/29/2017
@JonathanAllan Yang terakhir tidak ditangani.
Erik the Outgolfer 07/29/2017
@JonathanAllan Selesai.

Jonathan Allan 07/29/2017.

Jelly , 13 12 byte

fØDẋ€L$ŒV+VS 

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

Try it online!

14 byte untuk menerima dan mengembalikan angka (masukan 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 
4 comments
Erik the Outgolfer 07/29/2017
Umm, Anda dapat mengganti +€ dengan + dalam versi 15-byte untuk -1.
Jonathan Allan 07/29/2017
Sudah, terima kasih!
Erik the Outgolfer 07/29/2017
Umm tidak dalam versi 15-byte. EDIT: 3 detik terlalu dini kurasa ...
Jonathan Allan 07/29/2017
Yup hanya memperhatikan Anda mengatakan versi 15 byte - terima kasih lagi!

nimi 07/29/2017.

Haskell, 59 56 byte

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

Masukan diambil sebagai string.

Coba 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 

ETHproductions 07/29/2017.

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. 

Ian H. 07/31/2017.

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

Saved 9 bytes thanks to @TheLethalCoder
Disimpan lagi 8 byte berkat @TheLethalCoder

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

Coba online!

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


Kode ini mengikuti algoritma berikut:

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

  2. Hitung waktu masukan panjang string yang kita buat pada titik 1.

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

Contoh:

Masukan: -135.5

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

Jika kita menjumlahkan angka-angka ini, kita akan mendapatkan 15012 , yang persis seperti yang akan dihasilkan program kita.

5 comments
1 Dada 07/31/2017
Selamat datang di situs, dan jawaban pertama yang bagus (penjelasannya sangat dihargai!)!
Ian H. 07/31/2017
@Dada Terima kasih! Bahkan keras saya agak tidak senang dengan byte yang saya peroleh dari hal-hal seperti string.Replace() , tapi saya rasa itulah satu-satunya cara kerjanya!
TheLethalCoder 07/31/2017
Mungkin dapat menghemat beberapa byte dengan menetapkan i dan l untuk mengapung.
Ian H. 07/31/2017
@TheLethalCoder Pemikiran itu juga, sayangnya pengindeksan tidak bekerja dengan pelampung, dan. .Length tidak dapat secara implisit dikonversi menjadi mengambang.
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 bytes. Mungkin bisa menyimpan dengan mengambil input sebagai float dan casting ke string dengan n+"" tapi saya belum diperiksa.

Erik the Outgolfer 07/29/2017.

Brachylog , 23 byte

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

Coba 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) 

Zgarb 07/29/2017.

Sekam , 15 byte

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

Mengambil string dan mengembalikan angka. Coba online!

Penjelasan

Agak mengganggu bahwa fungsi parsing built-in r memberikan kesalahan parse pada input yang tidak valid bukannya mengembalikan nilai default, yang berarti bahwa saya harus secara eksplisit memfilter kolom yang terdiri dari non-digit. Jika kembali 0 pada input yang salah, 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 

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

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


ThePirateBay 07/31/2017.

JavaScript, 75 62 bita

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

Coba online

-2 bytes thanks to Arnauld
-5 bytes thanks to Shaggy (saya meskipun fungsinya harus menerima angka, tapi sekarang saya melihat bahwa banyak jawaban lainnya menerima string juga)


Xcali 08/05/2017.

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

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

Coba online!

Menggunakan beberapa trik dari kode Dom untuk mencukur 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
Datang dengan pendekatan yang sangat mirip, tetapi berhasil mendapatkan beberapa byte off menggunakan $ \ dan keluar dari loop: coba secara online!
Xcali 08/05/2017
Gunakan beberapa inspirasi darimu untuk mencukur milikku. Apa yang dimaksud dengan konstruksi "} {" di ujung Anda? Saya tidak akrab dengan yang satu itu.
Dom Hastings 08/05/2017
Ini yang saya pelajari dari situs ini, pada dasarnya -n dan -p benar-benar membungkus while(){...} sekitar kode jadi }{ pecah dari itu. Ini unsets $_ tetapi jika Anda menggunakan $\ sebagai variabel Anda, itu masih akan dicetak karena $\ ditambahkan ke setiap cetak. Berarti Anda dapat menyimpan nomor atau sesuatu di dalamnya dan mengabaikan $_ . Tidak yakin itu adalah penjelasan yang bagus, tetapi periksa Tips untuk bermain golf di thread Perl , saya yakin itu akan menjelaskannya dengan lebih baik! Senang telah membantu skor Anda!

Erik the Outgolfer 07/29/2017.

Jelly , 17 byte

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

Coba online!


Erik the Outgolfer 07/29/2017.

Pyth, 18 byte

s+RvQsM*RF_lB@jkUT 

Coba di sini.


Mr. Xcoder 07/29/2017.

Pyth , 21 20 byte

K@jkUTQ+smv*lKdK*lKv 

Test suite.

Menggunakan pendekatan yang benar-benar 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 - Menyaring digit dan menugaskannya 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 - Sum         + - Jumlah                   * lKvQ - Mengalikan angka dengan panjang String 

officialaimm 07/30/2017.

Python 2 , 81 74 byte

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

  • Membawa dalam integer atau float, return float.
 lambda x:sum(float(i*len(z))for z in[[i for i in`x`if"/" 

Coba online!

Penjelasan:

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

4 comments
Mr. Xcoder 07/29/2017
78 bita . Ganti i.isdigit() dengan "/"
1 Mr. Xcoder 07/29/2017
74 bita . Anda dapat mengganti i.isdigit() dengan "/" , pada kenyataannya, karena keduanya . dan - memiliki kode ASCII yang lebih rendah daripada digit, dan ada 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 untuk jawaban saya

Bruce Forte 07/30/2017.

Oktaf , 100 82 byte

Terima kasih banyak @TomCarpenter karena telah mengajarkan saya bahwa tugas memiliki nilai pengembalian dan menghemat saya 18 byte!

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

Coba online!

Ungolfed / Explanation

 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 bahwa pada dasarnya kita perlu menambahkan angka itu sendiri n kali dan kemudian menambahkan jumlah kolom. Summing s' * logspace(0,n-1,n) mencapai jumlah kolom, misalnya jika v=-123.4 matriks itu akan menjadi:

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

Jadi kita hanya perlu sum dan selesai.

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

Mr. Xcoder 07/30/2017.

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) - Mendefinisikan fungsi f dengan parameter String eksplisit s .

  • let k=s.filter{"/"<$0} - Menyaring digit: Saya perhatikan bahwa keduanya - dan . memiliki nilai ASCII yang lebih kecil dari semua digit, dan / adalah 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 mengizinkan Float dan Int multiplication :()). Jadi itu menambah jumlah x kali, di mana x adalah jumlah digit yang dikandungnya.

  • k.mapNO maps over k with the current value $0 . - k.map{} memetakan lebih dari k dengan nilai saat ini $0 . String(repeating:$0,count:k.count) ambil setiap digit, buat String x digit identik dan Float(...)! mengonversinya menjadi angka Floating-point.

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

  • Dan akhirnya + menjumlahkan dua hasil.


Mari kita ambil contoh!

Katakanlah String kita adalah "0.45" . Pertama, kita menyaring digit, jadi kita dibiarkan dengan 0, 4, 5 . Kami mengonversi "0.45" menjadi Mengambang dan mengalikan dengan jumlah digit: 0.45 * 3 = 1.35 . Kemudian kita mengambil setiap digit dan mengubahnya menjadi String yang mengulang digit itu hingga memenuhi lebar persegi (berapa banyak digit yang ada): 0, 4, 5 -> 000, 444, 555 . Kami menjumlahkan ini, 000 + 444 + 555 = 999 . Kemudian kita hanya menambahkan hasil bersama: 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.

Coba online!

Versi Lengkap / Terformat:

 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 dapat menyimpan 2 byte di awal dengan menggunakan var d=(n+ ... bukannya var d = (n ...
TheLethalCoder 07/31/2017
@IanH. Lupa untuk menghapus semua ruang -_- Itulah yang saya dapatkan untuk menjawab sementara melakukan panggilan dukungan.

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; 

Jalankan sebagai pipa dengan -nR .

Semoga menghasilkan peringatan di 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 byte

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

Coba online!

Mengulang setiap digit karakter dan mengulanginya dengan jumlah digit karakter secara keseluruhan, membuatnya menjadi bilangan bulat, dan menambahkannya ke n . Cara ini n ditambahkan d kali, bagian horizontal penjumlahan, bersama dengan pengulangan digit, yang merupakan bagian vertikal. Awalnya digunakan str.isdigit tetapi >"/" , terima kasih kepada orang lain di thread ini, menyelamatkan banyak byte. Menyimpan dua byte dengan mengambil n sebagai string, tetapi hasilnya lebih berantakan.

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

Coba online!

Related questions

Hot questions

Language

Popular Tags