Bình phương một số theo cách của tôi


32

Mọi người cứ nói với tôi rằng bình phương của một số là số nhân với chính nó. Điều này rõ ràng là sai. Cách chính xác để bình phương một số là biến nó thành một hình vuông, bằng cách xếp nó lên trên một số lần bằng số chữ số mà nó có, sau đó đọc tất cả các số từ hình vuông kết quả, theo cả hai chiều (từ trái sang phải) và theo chiều dọc (từ chỉ lên xuống), sau đó thêm chúng lại với nhau. Vì vậy, đối với số 123, trước tiên bạn tạo hình vuông:

123
123
123

Sau đó, bạn lấy tất cả các hàng và cột từ hình vuông và thêm chúng lại với nhau:

123+123+123+111+222+333

Mà cho chúng tôi một kết quả của 1035.

Đối với các số âm, bạn xếp chồng bình thường (hãy nhớ rằng bạn chỉ đếm số chữ số , do đó, dấu âm không được bao gồm trong chiều dài), sau đó đọc các số ngang bình thường (có dấu âm), sau đó bỏ qua các dấu âm cho các số dọc. Vì vậy, đối với số -144chúng ta có được hình vuông:

-144
-144
-144

Cái nào cho chúng ta -144-144-144+111+444+444, cái nào bằng567

Đối với các số chỉ có một chữ số, hình vuông luôn bằng số nhân đôi (đọc một lần theo chiều ngang và một lần theo chiều dọc). Cho 4chúng tôi

4

Cái nào cho ta 4+4, cái nào bằng 8.

Đối với các số có phần thập phân, hãy xếp chồng bình thường (hãy nhớ rằng chỉ các chữ số được tính theo số lần bạn xếp số và do đó, số thập phân không được tính) và bỏ qua các ký hiệu thập phân khi đọc các số dọc. Ví dụ, số 244.2cho chúng ta

244.2
244.2
244.2
244.2

Cái nào cho ta 244.2+244.2+244.2+244.2+2222+4444+4444+2222, cái nào bằng 14308.8.

Số phân số hoặc số phức không thể bình phương.

Nhiệm vụ của bạn:

Tôi mệt mỏi với số bình phương theo cách của mình bằng tay, vì vậy tôi đã quyết định tự động hóa quy trình. Viết cho tôi một chương trình hoặc hàm lấy float hoặc chuỗi, tùy theo bạn thích, làm đầu vào và trả về kết quả bình phương theo cách của tôi.

Ví dụ:

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

Ghi điểm:

Tay tôi đang bị chuột rút khi viết ra tất cả các ô vuông đó và máy tính của tôi không hỗ trợ sao chép / dán, vì vậy, mục nhập có số lượng mã ít nhất để tôi nhập (được đo bằng byte vì lý do nào đó?) Sẽ thắng!


1
"123,45" và "244,2" không tự động trôi nổi hợp lệ vì máy tính lưu số ở dạng nhị phân. Đây thường không phải là một vấn đề cho đến khi vấn đề phụ thuộc vào biểu diễn thập phân.
Nữ tu bị rò rỉ

@LeakyNun, tôi thực sự không biết ý của bạn là gì. Vấn đề không phải là không thể giải quyết (ít nhất là ở python), tôi khá chắc chắn rằng tôi có thể làm điều đó khá dễ dàng, mặc dù trong một số lượng lớn byte. Nó sẽ yêu cầu một số thao tác chuỗi, tuy nhiên.
Gryphon - Phục hồi Monica

@Gryphon Vậy chúng ta phải lấy đầu vào là một chuỗi?
Nữ tu rò rỉ

3
@Gryphon Đây là nơi nó thất bại. 244.2không phải là một số float. Nó không thể được chuyển đổi thành chuỗi "244.2".
Nữ tu rò rỉ

3
@Gryphon Nhưng những hành vi như thế này làm cho nó rất bất tiện.
Nữ tu bị rò rỉ

Câu trả lời:


8

05AB1E , 7 byte

þSDg×+O

Hãy thử trực tuyến!

Giải trình

þ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

3
Ooo giải thích khi bạn có thể vui lòng
Jonathan Allan

1
Ngoài ra, tôi sẽ lưu ý rằng số 0 đứng đầu duy nhất là một yêu cầu đối với đầu vào cho -1 <đầu vào <1 (tức là 0,45 và 0,45 là các đầu vào khác nhau nhưng cùng một số, chỉ có số trước là chấp nhận được)
Jonathan Allan

@Jonathan ALLan Cái sau không được xử lý.
Erik the Outgolfer 29/07/2017

@Jonathan ALLan Xong.
Erik the Outgolfer 29/07/2017

7

Thạch ,  13  12 byte

fØDẋ€L$ŒV+VS

Một liên kết đơn âm chấp nhận danh sách các ký tự (số thập phân được hình thành rõ ràng, số 0 đứng đầu duy nhất là một yêu cầu cho -1 <n <1 ) và trả về một số.

Hãy thử trực tuyến!

14 byte để chấp nhận và trả về số (giới hạn đầu vào ở mức +/- 10 -5 bởi ŒṘ) : ŒṘfØDẋ€L$ŒV+⁸S.

Làm sao?

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

Umm, bạn có thể thay thế +€bằng +phiên bản 15 byte cho -1.
Erik the Outgolfer 29/07/2017

Đã làm, cảm ơn mặc dù!
Jonathan Allan

Umm không có trong phiên bản 15 byte. EDIT: 3 giây quá sớm Tôi cho rằng ...
Erik the Outgolfer 29/07/17

Yup chỉ nhận thấy bạn nói phiên bản 15 byte - cảm ơn một lần nữa!
Jonathan Allan

6

Haskell, 59 56 byte

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

Đầu vào được lấy dưới dạng một chuỗi.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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   

5

Japt v2 , 16 byte

o\d
l
¬xpV +V*Ng

Kiểm tra nó trực tuyến!

Giải trình

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.

4

C # (Lõi .NET), 150 141 133 byte

Đã lưu 9 byte nhờ @TheLethalCoder
Đã lưu thêm 8 byte nhờ @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;}

Hãy thử trực tuyến!

Lấy một chuỗi làm đầu vào và xuất ra số 'bình phương' dưới dạng nổi.


Mã này tuân theo thuật toán sau:

  1. Tạo một chuỗi mới từ đầu vào, nhưng không có dấu thập phân và ký hiệu, vì vậy chúng ta có thể lấy chiều dài và số cho các cột từ đó.

  2. Tính thời gian đầu vào độ dài của chuỗi chúng ta đã tạo tại điểm 1.

  3. Đối với mỗi cột trong 'ô vuông' của chúng tôi, hãy tạo một chuỗi mới với số cột và độ dài hàng và thêm nó vào kết quả của chúng tôi.

Thí dụ:

Đầu vào: -135.5

  1. Nếu chúng ta thay thế các dấu thập phân và ký hiệu, chúng ta sẽ có được chuỗi 1355có độ dài 4.
  2. Thời gian đầu vào 4: -135.5 * 4 = -542 .
  3. Bây giờ chúng ta tạo ra chuỗi mới cho mỗi cột, phân tích chúng và thêm chúng vào kết quả của chúng tôi:
    1111, 3333, 5555,5555 .

Nếu chúng tôi tổng hợp những con số này, chúng tôi nhận được 15012, đó chính xác là những gì chương trình của chúng tôi sẽ xuất ra.


1
Chào mừng bạn trên trang web, và câu trả lời đầu tiên tốt đẹp (đặc biệt là những lời giải thích được đánh giá cao!)!
Dada

@Dada Cảm ơn bạn! Ngay cả khó khăn tôi cũng không hài lòng với các byte tôi có được từ những thứ như thế string.Replace(), nhưng tôi đoán đó là cách duy nhất để nó hoạt động!
Ian H.

Có thể lưu một số byte bằng cách cài đặt ilthả nổi.
TheLethalCoder

@TheLethalCoder Nghĩ về điều đó cũng vậy, việc lập chỉ mục đáng buồn không hoạt động với số float và .Lengthkhông thể hoàn toàn được chuyển đổi thành 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. Có thể lưu bằng cách lấy đầu vào dưới dạng floatvà truyền vào chuỗi n+""nhưng tôi chưa kiểm tra.
TheLethalCoder

3

Brachylog , 23 byte

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

Hãy thử trực tuyến!

Brachylog không hoạt động tốt với phao ...

Giải trình:

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

3

Husk , 15 byte

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

Lấy một chuỗi và trả về một số. Hãy thử trực tuyến!

Giải trình

Có một chút khó chịu khi hàm phân tích cú pháp tích hợp rđưa ra các lỗi phân tích cú pháp trên các đầu vào không hợp lệ thay vì trả về một giá trị mặc định, điều đó có nghĩa là tôi phải lọc rõ ràng các cột có chứa các chữ số không. Nếu nó trả về 0 trên các đầu vào không đúng định dạng, tôi có thể thả fΛ±và lưu 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

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

Phòng thử nghiệm .

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)

Phòng thử nghiệm.

Cách tiếp cận thứ hai là một cổng tới Python 3 lấy cảm hứng từ giải pháp của @ Officialaimm.


3

Python 2 , 81 74 byte

-7 byte nhờ @Mr. Xcoder :'/'<i

  • Lấy số nguyên hoặc float, trả về float.
lambda x:sum(float(i*len(z))for z in[[i for i in`x`if"/"<i]]for i in[x]+z)

Hãy thử trực tuyến!

Giải trình:

Nói 123.45được đưa ra như là đầu vào. [i for i in`x`if"/"<x]đưa ra một danh sách các số nguyên được xâu chuỗi ['1','2','3','4','5'](cũng có z). Bây giờ chúng ta lặp đi lặp lại , [x]+ztức là [123.45,'1','2','3','4','5']nhân từng phần tử với len(z), ở đây 5và chuyển đổi từng phần thành một Float (để các chuỗi cũng chuyển đổi tương ứng), mang lại hiệu quả [617.25,11111.0,22222.0,33333.0,44444.0,55555.0]. Cuối cùng, chúng tôi tính toán sum(...)và có được 167282.25.


78 byte . Thay thế i.isdigit()bằng"/"<i<":"
Ông Xcoder

1
74 byte . Thực tế, bạn có thể thay thế i.isdigit()bằng "/"<icả hai .-có mã ASCII thấp hơn chữ số, adn /nằm ở giữa chúng
Ông Xcoder

Không có gì. Tôi đã chuyển nó sang Python 3 như một cách thay thế cho câu trả lời của tôi
Ông Xcoder

3

JavaScript, 75 62 byte

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

Dùng thử trực tuyến

-2 byte nhờ Arnauld
-5 byte nhờ Shaggy (Tôi mặc dù chức năng phải nhận được một số, nhưng bây giờ tôi thấy rất nhiều câu trả lời khác cũng nhận được chuỗi)


3

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

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

Hãy thử trực tuyến!

Đã sử dụng một số thủ thuật từ mã của Dom để cạo 4 byte

Giải thích:

@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

Đến với một cách tiếp cận rất giống nhau, nhưng đã tìm cách loại bỏ một vài byte bằng cách sử dụng $ \ và thoát khỏi vòng lặp: thử trực tuyến!
Dom Hastings

Sử dụng một số cảm hứng từ bạn để cạo tôi xuống. Cấu trúc "} {" ở cuối của bạn là gì? Tôi không quen với điều đó.
Xcali

Đó là một cái tôi học được từ trang web này, về cơ bản -nvà theo -pnghĩa đen bao while(){...}quanh một mã để }{thoát ra khỏi đó. Điều này chưa cài đặt$_ nhưng nếu bạn sử dụng $\ làm biến của mình, nó vẫn sẽ được in vì $\ được thêm vào mỗi bản in. Có nghĩa là bạn có thể lưu trữ số hoặc một cái gì đó trong đó và bỏ qua $_. Không chắc đó là một lời giải thích tuyệt vời, nhưng hãy xem Mẹo chơi golf trong chủ đề Perl , tôi chắc chắn rằng nó sẽ giải thích nó tốt hơn! Vui mừng vì đã giúp điểm số của bạn mặc dù!
Dom Hastings



2

Bình thường , 21 20 byte

K@jkUTQ+smv*lKdK*lKv

Bộ thử nghiệm.

Sử dụng một cách tiếp cận hoàn toàn khác với với câu trả lời của @ EriktheOutgolfer , giúp tôi chơi golf 1 byte trong trò chuyện, từ 22 đến 21.


Giải trình

K@jkUTQ+s.ev*lKbK*lKv

K @ jkUTQ - Lọc các chữ số và gán chúng cho một biến K.
         m - Bản đồ. Lặp lại thông qua các chữ số với một biến d
           v - Đánh giá (chuyển đổi sang float).
            * lKd - Nhân mỗi chữ số Chuỗi theo độ dài của K.
        s - Tổng
       + - Tổng
                 * lKvQ - Nhân số với độ dài của các chữ số Chuỗi

2

Octave , 100 82 byte

Cảm ơn rất nhiều @TomCarpenter đã dạy tôi rằng các bài tập có giá trị trả về và tiết kiệm cho tôi 18byte!

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

Hãy thử trực tuyến!

Ungolfed / Giải thích

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

Cách thức hoạt động này là về cơ bản chúng ta cần thêm số nlần và sau đó thêm tổng của các cột. Tóm tắt s' * logspace(0,n-1,n)đạt được tổng số cột, ví dụ nếu v=-123.4ma trận đó sẽ là:

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

Vì vậy, chúng tôi chỉ cần sumlên và chúng tôi đã hoàn thành.


1
Bạn có thể lưu 18 byte bằng cách làm mờ tất cả thành một hàm ẩn danh @(v)(n=nnz(s=strrep(num2str(abs(v)),'.','')-'0'))*v+sum(sum(s'*logspace(0,n-1,n))). Hãy thử trực tuyến!
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,+))}

Phòng thử nghiệm.


Giải trình

  • func f(s:String)- Xác định hàm fvới tham số String rõ ràng s.

  • let k=s.filter{"/"<$0}- Bộ lọc các chữ số: Tôi nhận thấy rằng cả hai -.có ASCII-giá trị nhỏ hơn so với tất cả các chữ số, và /là giữa ., -0. Do đó, tôi chỉ kiểm tra xem "/"có nhỏ hơn ký tự hiện tại không, như tôi đã làm trong câu trả lời Python của mình.

  • print(...) - In kết quả.

  • Float(s)!*Float(k.count)- Chuyển đổi cả Chuỗi và số chữ số thành Float và nhân chúng (Swift không cho phép phép nhân Float và Int :()). Vì vậy, nó thêm số xlần, trong đóx số lượng chữ số nó chứa.

  • k.map{Int(String(repeating:$0,count:k.count))!- k.map{}bản đồ kvới giá trị hiện tại $0. String(repeating:$0,count:k.count)lấy mỗi chữ số, tạo một chuỗi các xchữ số giống hệt nhau và Float(...)!chuyển đổi nó thành số dấu phẩy động.

  • .reduce(0,+) - Lấy tổng của danh sách trên.

  • Và cuối cùng +tổng hợp hai kết quả.


Hãy lấy một ví dụ!

Nói Chuỗi của chúng tôi là "0.45". Trước hết, chúng tôi lọc các chữ số, vì vậy chúng tôi còn lại với 0, 4, 5. Chúng tôi chuyển đổi "0.45"thành Float và nhân với số chữ số : 0.45 * 3 = 1.35. Sau đó, chúng tôi lấy từng chữ số và biến nó thành một chuỗi lặp lại chữ số đó cho đến khi nó lấp đầy chiều rộng của hình vuông (có bao nhiêu chữ số) : 0, 4, 5 -> 000, 444, 555. Chúng tôi tổng hợp này , 000 + 444 + 555 = 999. Sau đó, chúng tôi chỉ cần thêm các kết quả với nhau : 1.35 + 999 = 1000.35.


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

Đã lưu 2 byte nhờ @Ian H.

Hãy thử trực tuyến!

Phiên bản đầy đủ / được định dạng:

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

Bạn có thể lưu 2 byte lúc đầu bằng cách sử dụng var d=(n+ ...thay vì var d = (n ....
Ian H.

@IanH. Quên xóa tất cả các khoảng trắng -_- Đó là những gì tôi nhận được khi trả lời trong khi thực hiện cuộc gọi hỗ trợ.
TheLethalCoder

1

Toán học, 107 byte

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

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;

Chạy như ống với -nR.

Có thể cảnh báo năng suất trong PHP 7.1. Lặp lại $c,$evới $c>0?$c:0,$eđể sửa chữa.


0

Python 3 , 68 70 73 77 byte

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

Hãy thử trực tuyến!

Vòng lặp trên mỗi ký tự chữ số và lặp lại nó theo số lượng ký tự chữ số tổng thể, biến nó thành một số nguyên và thêm nó vào n. Cách này nđược thêm dlần, phần nằm ngang của tổng, cùng với sự lặp lại chữ số, là phần dọc. Ban đầu được sử dụng str.isdigitnhưng >"/", nhờ những người khác trong chủ đề này, đã lưu rất nhiều byte. Lưu hai byte bằng cách lấy ndưới dạng chuỗi, nhưng đầu ra thì lộn xộn hơn.

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

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.