Tính bình phương của một số nguyên có giới hạn [đóng]


8

Câu đố

Bạn phải viết một chương trình hoặc hàm p (n) trả về bình phương của những gì được nhập vào nó và bạn có thể giả sử rằng đầu vào là một số nguyên không âm. Đặt trong các điều khoản đơn giản hơn, trả về n 2 .

Quy tắc

  1. Bạn không được phép sử dụng *hoặc /(hoặc bất kỳ toán tử quyền lực hoặc căn bậc hai nào khác, chẳng hạn như POWhoặc SQRT, nếu ngôn ngữ của bạn có chứa các chức năng đó)
  2. Bạn không được sử dụng vòng lặp hoặc sử dụng các công trình tương tự như vòng lặp. Ví dụ về vòng lặp như các công trình xây dựng GOTOvà đệ quy.

Thí dụ

Function p(n)
Dim r()
ReDim r(n)
p = Len(Join(r, Space(n)))
End Function

Hãy sáng tạo và (ab) sử dụng các chức năng và tính năng được cung cấp cho bạn theo ngôn ngữ bạn chọn.

*biên tập

Các cấu trúc giống như vòng lặp là các vòng lặp cho phép bạn lặp lại 1 hoặc nhiều hướng dẫn

-Nếu bạn có thể thêm stdout "1"mã vào mã của mình và bạn sẽ kết thúc bằng việc lặp lại đầu ra đó n lần, nó sẽ được tính là một vòng lặp


1
@dwana Không phải là phần thứ hai của quy tắc thứ nhất và quy tắc thứ ba giống nhau?
Def

14
Điều này không nên được mở lại, bởi vì nó vẫn thiếu rõ ràng về những gì được coi là "giống như vòng lặp". Ví dụ như những gì về nếp gấp?
Peter Taylor

5
@PeterTaylor hoặc bản đồ cho vấn đề đó.
Martin Ender

7
@dwana Bạn có thể nói cụ thể về những điều này trong quy tắc của mình không: (1) Các hàm được xây dựng vốn có các vòng lặp trong chúng, như bản đồ, vòng lặp, nếp gấp, giảm vv được phép? (2) Việc đánh giá chuỗi dưới dạng mã bằng eval / exec có được phép không?
Tối ưu hóa

4
Điều này phần lớn là một bản sao của một thử thách codegolf trước đây, yêu cầu tổng quát hơn m*nthay vì n*nkhông sử dụng *. Xem codegolf.stackexchange.com/a/18283/14485
Mark Lakata

Câu trả lời:


42

CJam, đeo kính lên

q~33c

(*_*)

(*_")>⌐■-■

(⌐■_■)

"]sG>4%,)

Nhập thông qua STDIN

Hãy thử mã ở đây

Lưu ý rằng *trong mã không được sử dụng như là nhân, mà là toán tử nối

Cũng lưu ý rằng phần thú vị của mã không chỉ là chuỗi, một nửa trong số đó thực sự là mã liên quan đến việc tìm hình vuông. Để đối phó với nó

Điều này sẽ giúp bạn đối phó với nó:

q~33c                    "Read the number and put ASCII character 33 on stack with it"
(                        "Decrease it to get ASCII code 32 character, which is a space";
 *_                      "Repeat the space input number times and make another copy";
   *                     "Put that many spaces in between each space. Now we have";
    )                    "n*n spaces string. We take out the last space out of it";
(                        "Decrement the space to get ASCII 31 character";
 *                       "Fill the n*n - 1 spaces with that to get 2*n*n - 3";
  _                      "string. Then copy it again.";
   ")>⌐■-■               "Put the sun glasses in";
(⌐■_■)                   "Wear the sun glasses. Be cool.";
"]s                      "Add everything to a single string of 4*n*n - 6 + 16"
   G>                    "length. Remove first 16 characters";
     4%                  "Take every 4th character from that string to get n*n - 1"
       ,)                "length string. Take length and increment to get n*n";

20

Hồng ngọc

def square(n)
  case n
  when 0..1
    n
  when 2..36
    '100'.to_i(n)
  else
    raise RangeError, 'Integer overflow!'
  end
end

10
Điều này thực sự thông minh.
Ypnypn

3
Đối với bản ghi, trong Mathicala, công cụ này hoạt động rất xa các số nguyên tùy ý (bao gồm 0 và âm), mà không phải xử lý bất kỳ trường hợp nào đặc biệt : FromDigits[{1, 0, 0}, Input[]]. Tương tự ở CJam:4Ybl~b
Martin Ender

20

APL? ε⍵⍵

{+/ ∊⍵⍵ ⍴1}

Câu trả lời này dành riêng cho tất cả những người đi "" bất cứ khi nào họ thấy các biểu tượng APL :-)

Ví dụ

      {+/∊⍵⍵⍴1} 3
9
      {+/∊⍵⍵⍴1}¨⍳20
1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400

Giải trình

{       }   This function takes a number ⍵,
{   ⍵⍵⍴1}   builds a matrix of ⍵ by ⍵ all filled with ones,
{+/∊    }   and sums all its elements together.

3
eww ... <! - giữ chỗ ->
Kroltan

4
Không phải là tổng hợp tất cả các yếu tố của một vòng lặp giả ma trận sao? Tổng kết được thực hiện thông qua giảm hoặc gấp, cả hai đều lặp
Trình tối ưu hóa

+/trong các ngôn ngữ khác được gọi sum()và tôi thấy nhiều câu trả lời sử dụng nó. Với lý do tương tự, bạn không thể sử dụng *trong CJam.
Tobia

Tôi thấy quan điểm của bạn, nhưng việc tham gia không yêu cầu đọc giá trị của từng yếu tố, vì vậy nó có thể được thực hiện mà không cần một vòng lặp ở mức thấp. Tóm tắt các phần tử của ma trận thực sự cần lặp lại trên tất cả các phần tử để thêm. Ngoài ra, bạn có thể làm một cái gì đó như làm phẳng ma trận và nhận được độ dài của nó.
Tối ưu hóa

2
Trông giống như biểu tượng cho một cái giăm bông!?
FreeAsInBeer 7/1/2015

15

Lạm dụng một số chức năng trong Mathicala

Hai lần diện tích của một tam giác vuông

a =RegionMeasure@SASTriangle[n,ArcSin[1], n] 
a+a

Diện tích của một hình vuông. Tất nhiên!

RegionMeasure[Rectangle[{0, 0}, {n, n}]]

Cùng một ý tưởng, trong một hình thức khác nhau:

Integrate[n, {x, 0, n}]  (* thx to DigitalTrauma *)

Số lượng phần tử trong một ma trận vuông:

 Length[Flatten[Normal[AdjacencyMatrix[RandomGraph[{n, RandomInteger[n]}]]]]]

hoặc là

 Plus@@Flatten[ConstantArray[1, {n, n}]]

hoặc là

 Length@Flatten[Outer[f,Range[n],Range[n]]]

hoặc là

 Length[Distribute[p[Range[n],Range[n]],List]]

Vân vân...


1
Một số khác : k[n_] := Integrate[n, {x, 0, n}]?
Chấn thương kỹ thuật số

DigitalTrauma, Integraterất hay nhưng nó lặp đi lặp lại, mà tôi tin là một dạng lặp.
DavidC

Đúng, mặc dù tôi nghĩ rằng nó chỉ là vòng lặp ngầm. Với lý lẽ tương tự, tôi sẽ tuyên bố Areavà bạn bè đang nhân lên (nhưng cũng được phép)
Chấn thương kỹ thuật số

13

C

p(n){int a[n];return(&a)[n]-a;}

Ghi chú:

  • Mảng có độ dài thay đổi là một tính năng được hỗ trợ có điều kiện kể từ C99.
  • Ngụ ý intđược sử dụng để giảm số lượng ký tự và cho các điểm phong cách.


12

Toán học

Một câu trả lời khác sử dụng một số tính năng vui nhộn của Mathicala

n = Input[];
g = EdgeCount@CompleteGraph@n;
g + g + n

Một đồ thị hoàn chỉnh với ncác đỉnh có binom(n,2) = n(n-1)/2các cạnh (cũng là số tam giác thứ n). Vì vậy, kết quả chỉ đơn giản là gấp đôi, cộng với đầu vào.


1
Rất thông minh, sử dụng đồ thị.
DavidC

12

Con trăn 2

Hoàn toàn là toán học, tránh bất kỳ hoạt động bị cấm:

import cmath
n=input()
if n:
  l=complex(0, -cmath.log(n) - cmath.log(n))
  print int(round(abs(complex(cmath.cos(l),cmath.sin(l)))))
else:
  print 0

Đây là exp(ln(x)*y)thủ thuật thông thường phù hợp với vấn đề này:

  • Bởi vì y là 2, nên chúng ta chỉ cần làm ln(x)+ln(x)để thoát khỏi phép nhân.
  • Tôi cảm thấy rằng nó math.exp()quá gần với "POW" bị cấm để chơi công bằng, vì vậy thay vào đó, toàn bộ điều được chuyển thành phức tạp và danh tính của Euler được sử dụng để thay thế exp()bằng cos()sin()
  • Để tránh các tình huống cần nhân / chia rõ ràng i, complex()thay vào đó , hàm được sử dụng.

2
Nếu bạn thay đổi math.logthành cmath.logbạn có thể xử lý số âm. Bạn cũng không cần phải như vậy import math.
FryAmTheEggman

inputkhông làm những gì bạn nghĩ trong Python 2 và trong Python 3 printlà một hàm thay vì một câu lệnh.
Cristian Ciupitu

@CristianCiupitu Tôi nghĩ gì inputvề Python 2? ;-). Tôi chắc chắn sẽ viết khác nếu đây là mã sản xuất, nhưng với mục đích của thử thách này thì nó vẫn ổn, miễn là đầu vào là một biểu thức số được định dạng tốt. Tôi hiểu rằng có một sự ám chỉ ngầm trong đó, và sự xấu xa tiềm tàng của nó.
Chấn thương kỹ thuật số

8

Bash tinh khiết

Không có vòng lặp rõ ràng hoặc số học:

(($1))||{ echo 0;exit;}
eval a=({1..$1}{1..$1})
echo ${#a[@]}

Sử dụng các mở rộng bash để tạo hai danh sách 1-n và dấu ngoặc mở rộng chúng và hiển thị kích thước của mảng kết quả.


Phương pháp tương tự, nhưng sử dụng coreutils thay thế:

join <(seq -f "1 %g" $1) <(seq -f "1 %g" $1) | wc -l

8

R, kém hiệu quả với Monte Carlo

Kỳ vọng E[x] cho tham số hình dạng / tỷ lệ của Phân phối Gammashape*scale.

Tôi không thấy mean bị cấm, vì vậy đây là giải pháp mẫu vớimean()

f = function(n, k = 1e9){round((mean(rgamma(k, shape = n, scale = n))))}
f(99) 

Không sử dụng mean(), có thể sử dụng mode[x], tương đương (shape-1)*scale, nhưng điều này liên quan đến việc viết một add.onehàm để bỏ qua+1 sau đó viết một Modehàm khác để lập bảng cho chế độ.

add.one = function(x) length(c(seq(x),NA))
Mode = function(x) (u<-unique(x))[which.max(tabulate(match(x,u)))]
f.mode = function(n, k = 1e9){Mode(round(rgamma(k, shape = add.one(n), scale = n)))

Độ chính xác không được đảm bảo, nhưng luật số lượng lớn nên áp dụng cho 1.000.000.000 mẫu, điều này đã cho tôi kết quả đúng cho tất cả các trường hợp thử nghiệm của tôi.


Tôi đã nghĩ về một vụ hack tương tự, +1
Shadowtalker

7

Java

Mục đầu tiên, đây là cách nó hoạt động?

int g(int n){
    int[] a = new int[n];
    Arrays.fill(a,n);
    return IntStream.of(a).sum();       
}

... không buồn cười u_u

6

C #

Tạo một chuỗi có n ký tự và sau đó thay thế từng ký tự bằng chuỗi n ký tự. Điều này tạo ra một chuỗi có độ dài n * n.

using System;

public class Test
{
    public static void Main()
    {
        int n = Int32.Parse(Console.ReadLine());
        String s = "".PadLeft(n, 'X');
        Console.WriteLine(s.Replace("X", s).Length);
    }
}

Kiểm tra nó ở đây: http://ideone.com/lubIFg .


2
Thật sáng tạo!
TheNumberOne

5

Matlab

một cảnh báo: đây là dựa trên toán học nguyên thủy, vì vậy đừng mong đợi mã nguồn ưa thích

Lưu ý rằng a = n^2iff log(a) = log(n)*2iff log(log(a)) = log(log(n))+log(2). Vì vậy, hàm này chỉ là tìm số 0 của hàm f(a) = log(log(n))+log(2) - log(log(a))rõ ràng là tại a = n^2.

function s = g(n)
    f = @(a) log(log(n))+log(2)-log(log(a));
    s = fnzeros(f);
end

Ở đây một số chức năng không sáng tạo khác:

Ở đây chương trình sẽ tổng hợp số 1+2+3+...+n = 1/2 * (n^2+n)hai lần và trừ đi n, vì vậy kết quả luôn luôn làn^2

g=@(n)sum(1:n)+sum(1:n)-n

Hàm này tạo ra một n x nma trận các số ngẫu nhiên (từ 0 đến 1) và sau đó trả về số lượng phần tử.

g=@(n)numel(rand(n));

Các funcin sau đây tạo ra một ma trận vandermonde của vectơ (0,0,n)và xuất ra mục nhập bao gồmn^2

function s = g(n)
    a = vander([0,0,n]);
    s = a(3,1)
end

Hàm này tạo nghịch đảo của ma trận hilbert có kích thước ntrong đó phần tử trên cùng bên trái luôn luôn làn^2

function s = g(n)
    a = invhilb(n);
    s = a(1);
end

Quảng cáo # 3: Tất nhiên trong các ứng dụng thực tế, người ta sẽ sử dụng g=@(n)nnz(nan(n));vì mục đích hiệu quả và ngắn gọn. ;-)
knedlsepp

Khi nói đến hiệu quả, tôi nghĩ việc tính toán nghịch đảo của ma trận hilbert một cách rõ ràng sẽ hiệu quả hơn : function s = g(n); a = inv(hilb(n)); s = a(1); end. Nhưng sau đó, một lần nữa, giải pháp của bạn ngắn hơn; P
flawr

5

C

sizeof(char[n][n])

Nó hoạt động lên đến INT_MAX trong thời gian liên tục và không cần cấp phát bộ nhớ.

Thí dụ:

#include <stdio.h>
#include <limits.h>
int main(){
    for( int n=0 ; n<10 ; n++ ){
        printf("%d: %ld\n", n, sizeof(char[n][n]));
    }
    int n = INT_MAX;
    printf("%d: %ld\n", n, sizeof(char[n][n]));
}

màn hình

0: 0
1: 1
2: 4
3: 9
4: 16
5: 25
6: 36
7: 49
8: 64
9: 81
2147483647: 4611686014132420609

có thể làm rõ rằng vòng lặp chỉ là một trình bao bọc để hiển thị chương trình đang chạy trên nhiều giá trị
masterX244

4

Java

Đây là câu trả lời đầu tiên thực sự không sử dụng các vòng lặp hoặc đệ quy.

int square(int n){
    if (n > 0){
        n = -n;
    }
    return m(n,0) + m(n,1) + m(n,2) + m(n,3) + m(n,4) + m(n,5) + m(n,6) + m(n,7) + m(n,8) + m(n,9) + m(n,10) +
            m(n,11) + m(n,12) + m(n,13) + m(n,14) + m(n,15) + m(n,16) + m(n,17) + m(n,18) + m(n,19) + m(n,20) +
            m(n,21) + m(n,22) + m(n,23) + m(n,24) + m(n,25) + m(n,26) + m(n,27) + m(n,28) + m(n,29) + m(n,30) + m(n,31);
}

int m(int number, int index){
    if (number >> index << 31 >>> 31 == 0){
        return 0;
    } else {
        return number << index;
    }
}

@FlorianF Tất cả các câu trả lời khác gọi hàm sử dụng các vòng lặp. Theo tôi biết, gọi một hàm 32 lần và sau đó thêm kết quả không được tính là sử dụng các vòng lặp. Nếu tôi thêm câu lệnh System.out.print(1)vào m, chương trình sẽ in 1chính xác 32 lần chứ không phải n lần.
TheNumberOne

3

GolfScript

Histocrat đã chỉ ra một cách sử dụng chuyển đổi cơ sở: đây là một cách khác.

{.,1base.++}:p;

Mổ xẻ

{       # Function boilerplate
  .     # Duplicate the input. Stack: x x
  ,     # Turn the second one into an array [0 1 ... x-1]
  1base # Sum the elements of the array. Stack: x x(x-1)/2
  .+    # Double. Stack: x x(x-1)
  +     # Add. Stack: x*x
}:p;    # Question asks for the function to be called p
        # The fact that this destroys the built-in p is unfortunate, but required

2

Emacs Lisp

(defmacro square-it (n)
  (cons '+ (make-list n n)))

(square-it 11) ;; => 121

Một macro đơn giản mở rộng (square-it 5)thành (+ 5 5 5 5 5). Tất nhiên, đầu vào phải là hằng số thời gian biên dịch.


2

Javascript

function square(i) {
    return new Array(++i).join(new Array(i).join(' ')).length;
}

2

Haskell

Có rất nhiều khả năng nếu phạm vi [x..y]được cho phép, một số trong số đó là:

f n|x<-sum[1..n]=x+x-n
f n=sum$take n[n,n..]
f n=length$[1..n]>>[1..n]
f n=sum$[1..n]>>[1..n]>>[1]

Hai cái sau sử dụng thể hiện Monad của danh sách. cho các danh sách xs, các khoản ysgiữ xs>>ysđược ysgắn vào chính nólength xs thời gian của .

một mẹo khác chỉ là

import Data.Monoid
f x=x<>x

hàm này, khi được đưa ra một đối số 'thích hợp' (tất nhiên là từ kiểu chữ Num) trả về nó vuông.Product 3 :: Num a => Product alà một ví dụ về lập luận như vậy.

về cơ bản, hàm này khi được áp dụng Product a, (trong Numlớp iff anằm trong i) mappendvới chính nó và trả vềProduct (a*a) .

nếu chúng ta nghiêm ngặt hơn về số nào / số nào thì hàm của chúng ta sẽ hoạt động, chúng ta có thể định nghĩa f

import Data.Monoid
f n|x<-Product n=getProduct$x<>x

2

Java

Điều này quá dài để đưa ra câu trả lời, nhưng về cơ bản, một trong những dòng mã xảy ra một số lần gần bằng với sqrt của Integer.MAX_VALUE (là 46340). : D

Không có nhận xét hoặc ngắt dòng, mã được nhập sẽ là 1.112.155 ký tự.

int s(int n){
    if(n==0|n==1)return n;
    int c=2,r=n+n;
    if(n==c++)return r;r+=n;
    if(n==c++)return r;r+=n;
    if(n==c++)return r;r+=n;
    if(n==c++)return r;r+=n;
    if(n==c++)return r;r+=n;
    if(n==c++)return r;r+=n;
                            //... (same line of code a total of 46336 times)
    if(n==c++)return r;r+=n;
    if(n==c++)return r;
    return n==c?r+n:r+n+n; //r = 46340^2
}

2

R

Hàm này dựa trên việc đếm tất cả các kết hợp có thể có của hai chuỗi từ 1 đến n. Giá trị 0 được xử lý riêng.

f <- function(n) if (n) nrow(expand.grid(s <- seq(n), s)) else 0

2

Clojure

(def squares (lazy-cat [0] (map (fn [sq x] (+ sq x x 1)) squares (range))))

Chuỗi vô hạn của tất cả các ô vuông bắt đầu từ 0. Hàm:

(defn square [n] (nth squares n))



1

SQL (PostGIS)

Tận dụng diện tích và tạo các chức năng bao trong phần mở rộng PostGIS cho PostGreSQL để tạo hình dạng hình vuông và trả lại diện tích của nó. Có thể được thay đổi để trả lại hình vuông của phao.

CREATE FUNCTION square(n int)RETURNS int AS $$
BEGIN 
    RETURN ST_Area(ST_MakeEnvelope(0,0,n,n));
END;
$$LANGUAGE plpgsql;

Đang sử dụng;

SELECT square(150);

Square Integer
--------------
22500

1

Con trăn

Sử dụng toán đơn giản. Dựa trên tổng của một tiến trình số học.

s=lambda n:(sum(range(n))<<1)+n

Giải trình:

a = sum(range(n)) # sum of arithmetic progression from 1 to n-1:  n*(n-1)/2
b = a<<1          # bitshift left by 1 (multiply by 2):  n*n - n
c = b+n           # add n:  n*n

Mặc dù tổng và phạm vi có thể chứa các vòng lặp ẩn,
nhưng theo thông số câu hỏi, không có cách nào để chèn một câu lệnh in ở đây để làm cho nó lặp lại, vì vậy ... :)



1

PHP

function square($v) {
    return array_sum(array_fill(0, $v, $v));
}

hoạt động với số nguyên trong phạm vi [0; 46340]

Chỉnh sửa: Tôi vừa thấy mã @thebestone và về cơ bản là giống nhau


1

Perl

$_=<>;chop;s/./$_/g;print

chương trình dự kiến ​​số đầu vào sẽ được bình phương ở dạng đơn nguyên (tức là cơ sở 1). Đầu ra cũng là unary. Nó chỉ đơn giản là thay thế mọi chữ số với toàn bộ số.

Ví dụ sử dụng:

perl -e '$_=<>;chop;s/./$_/g;print'
000                                   # <- user input
000000000                             # <- output


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.