Hitung kuadrat dari bilangan bulat dengan batasan [ditutup]

8

Teka-teki

Anda harus menulis sebuah program atau fungsi p (n) yang mengembalikan kuadrat dari apa yang dimasukkan ke dalamnya dan Anda dapat mengasumsikan bahwa inputnya adalah bilangan bulat non-negatif. Sederhananya, kembalikan n 2 .

Aturan

  1. Anda tidak diizinkan untuk menggunakan *atau /(atau operator daya atau akar kuadrat lainnya, seperti POWatau SQRT, jika bahasa Anda mengandung fungsi tersebut)
  2. Anda tidak boleh menggunakan loop, atau menggunakan konstruksi yang mirip dengan loop. Contoh konstruksi seperti loop GOTOdan rekursi.

Contoh

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

Jadilah kreatif dan (ab) gunakan fungsi dan fitur yang diberikan kepada Anda oleh bahasa pilihan Anda.

* edit

Struktur seperti loop adalah loop yang memungkinkan Anda mengulangi 1 atau lebih instruksi

-Jika Anda bisa menambahkan stdout "1"kode Anda dan Anda akan berakhir dengan mengulangi output itu n kali, itu akan dihitung sebagai loop

dwana
sumber
1
@dwana Bukankah bagian kedua dari aturan pertama dan aturan ketiga sama?
Def
14
Ini seharusnya tidak dibuka kembali, karena masih kurang jelas pada apa yang dianggap sebagai "loop-like". Misalnya bagaimana dengan lipatan?
Peter Taylor
5
@ PeterTaylor atau peta dalam hal ini.
Martin Ender
7
@dwana Bisakah Anda lebih spesifik tentang hal-hal ini dalam aturan Anda: (1) Apakah dalam fungsi dibangun yang secara inheren memiliki loop di dalamnya, seperti peta, iterator, lipatan, pengurangan dll diperbolehkan? (2) Apakah mengevaluasi string sebagai kode menggunakan eval / exec diizinkan?
Pengoptimal
4
Ini sebagian besar merupakan duplikat dari tantangan codegolf sebelumnya, yang meminta lebih umum m*ndaripada n*ntanpa menggunakan *. Lihat codegolf.stackexchange.com/a/18283/14485
Mark Lakata

Jawaban:

42

CJam, memakai kacamatanya

q~33c

(*_*)

(*_")>⌐■-■

(⌐■_■)

"]sG>4%,)

Masukan melalui STDIN

Coba kodenya di sini

Perhatikan bahwa *dalam kode ini tidak digunakan sebagai perkalian, tetapi sebagai operator gabungan

Juga perhatikan bahwa bagian keren dari kode bukan hanya string, setengahnya sebenarnya adalah kode yang terlibat dalam menemukan kuadrat. Jadi .. BERHUBUNGAN DENGAN IT

Ini akan membantu Anda dalam menghadapinya:

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";
Pengoptimal
sumber
20

Rubi

def square(n)
  case n
  when 0..1
    n
  when 2..36
    '100'.to_i(n)
  else
    raise RangeError, 'Integer overflow!'
  end
end
histokrat
sumber
10
Ini sangat pintar.
Ypnypn
3
Sebagai catatan, dalam Mathematica ini bekerja bilangan bulat jauh sewenang-wenang (termasuk 0 dan negatif), tanpa harus menangani kasus setiap khusus: FromDigits[{1, 0, 0}, Input[]]. Sama di CJam:4Ybl~b
Martin Ender
20

APL? ∊⍵⍵

{+/ ∊⍵⍵ ⍴1}

Jawaban ini didedikasikan untuk semua orang yang pergi "∊⍵⍵" setiap kali mereka melihat simbol APL :-)

Contohnya

      {+/∊⍵⍵⍴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

Penjelasan

{       }   This function takes a number ⍵,
{   ⍵⍵⍴1}   builds a matrix of ⍵ by ⍵ all filled with ones,
{+/∊    }   and sums all its elements together.
Tobia
sumber
3
eww ... <! - placeholder ->
Kroltan
4
Bukankah menjumlahkan semua elemen dari loop pseudo matriks? Penjumlahan dilakukan melalui perkecil atau lipat, keduanya berulang
Pengoptimal
+/dalam bahasa lain disebut sum()dan saya melihat banyak jawaban menggunakannya. Dengan alasan yang sama Anda tidak bisa menggunakan *CJam.
Tobia
Saya mengerti maksud Anda, tetapi bergabung tidak perlu membaca nilai dari setiap elemen, jadi itu bisa dilakukan tanpa loop pada level rendah itu sendiri. Menjumlahkan elemen-elemen dari matriks sebenarnya perlu mengulangi semua elemen untuk ditambahkan. Atau, Anda bisa melakukan sesuatu seperti meratakan matriks dan mendapatkan panjangnya.
Pengoptimal
2
Itu terlihat seperti simbol untuk ham yang ditekan !?
FreeAsInBeer
15

Menyalahgunakan beberapa fungsi di Mathematica

Dua kali luas segitiga siku-siku sama kaki

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

Luas kotak. Tentu saja!

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

Gagasan yang sama, dalam bentuk yang berbeda:

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

Jumlah elemen dalam matriks persegi:

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

atau

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

atau

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

atau

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

dll ...

DavidC
sumber
1
Satu lagi: k[n_] := Integrate[n, {x, 0, n}]?
Trauma Digital
DigitalTrauma, Integratesangat bagus tapi iterasi, yang saya percaya adalah bentuk perulangan.
DavidC
Benar, meskipun saya pikir itu hanya perulangan implisit. Dengan argumen yang sama saya akan mengklaim Areadan teman-teman adalah perkalian implisit (tetapi juga diperbolehkan)
Digital Trauma
13

C

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

catatan:

  • Array panjang variabel adalah fitur yang didukung kondisi sejak C99.
  • Tersirat intdigunakan untuk mengurangi jumlah karakter dan untuk poin gaya.
ecatmur
sumber
6
stackoverflow.com/q/27828822/1530508
ApproachingDarknessFish
12

Mathematica

Jawaban lain menggunakan beberapa fitur Mathematica yang lucu

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

Grafik lengkap dengan nsimpul memiliki binom(n,2) = n(n-1)/2tepi (yang juga merupakan angka segitiga ke-n). Jadi hasilnya hanya dua kali lipat, ditambah input.

Martin Ender
sumber
1
Sangat pintar, menggunakan grafik.
DavidC
12

Python 2

Murni matematis, menghindari operasi yang dilarang:

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

Ini adalah exp(ln(x)*y)trik biasa yang disesuaikan dengan masalah ini:

  • Karena y adalah 2, maka kita cukup melakukan ln(x)+ln(x)untuk menyingkirkan perkalian.
  • Saya merasa math.exp()itu agak terlalu dekat dengan "POW" yang dilarang untuk permainan yang adil, jadi alih-alih semuanya diubah menjadi kompleks dan identitas Euler digunakan untuk menggantikan exp()dengan cos()dansin()
  • Untuk menghindari situasi di mana perkalian / pembagian eksplisit idiperlukan, complex()fungsi digunakan sebagai gantinya.
Trauma Digital
sumber
2
Jika Anda mengubah math.logke cmath.logAnda dapat menangani angka negatif. Anda juga tidak perlu melakukannya import math.
FryAmTheEggman
inputtidak melakukan apa yang Anda pikirkan dalam Python 2, dan dalam Python 3 printadalah fungsi alih-alih pernyataan.
Cristian Ciupitu
@CristianCiupitu Apa yang saya pikirkan inputdalam Python 2? ;-). Saya pasti akan menulis ini secara berbeda jika ini menjadi kode produksi, tetapi untuk keperluan tantangan ini tidak apa-apa, selama inputnya adalah ekspresi numerik yang terbentuk dengan baik. Saya mengerti ada eval implisit di sana, dan potensi kejahatannya.
Trauma Digital
8

Bash murni

Tidak ada loop atau aritmatika eksplisit:

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

Menggunakan bash expansions untuk membuat dua daftar 1-n dan brace-expand mereka dan menampilkan ukuran array yang dihasilkan.


Metode serupa, tetapi menggunakan coreutils sebagai gantinya:

join <(seq -f "1 %g" $1) <(seq -f "1 %g" $1) | wc -l
Trauma Digital
sumber
8

R, inefisiensi lezat dengan Monte Carlo

Harapan E[x]untuk parametriisasi bentuk / skala dari Distribusi Gamma adalah shape*scale.

Saya tidak melihat meandilarang, jadi di sini adalah solusi sampel denganmean()

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

Tanpa menggunakan mean(), dimungkinkan untuk menggunakan mode[x], yang sama dengan (shape-1)*scale, tetapi ini melibatkan penulisan add.onefungsi untuk memotong +1lalu menulis Modefungsi lain untuk mentabulasi mode.

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

Keakuratan tidak dijamin, tetapi undang-undang dalam jumlah besar harus mendukung 1.000.000.000 sampel, yang telah memberi saya hasil yang tepat untuk semua kasus pengujian saya.

Vlo
sumber
Saya sedang memikirkan hack yang sama, +1
shadowtalker
7

Jawa

Entri pertama, apakah ini cara kerjanya?

int g(int n){
    int[] a = new int[n];
    Arrays.fill(a,n);
    return IntStream.of(a).sum();       
}
Anders Sundheim
sumber
... tidak lucu u_u
6

C #

Membuat string dengan n karakter dan kemudian mengganti setiap karakter dengan string n-karakter. Ini menghasilkan string dengan panjang 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);
    }
}

Uji di sini: http://ideone.com/lubIFg .

hetzi
sumber
2
Itu kreatif!
TheNumberOne
5

Matlab

sebuah peringatan: ini terutama berbasis matematika, jadi jangan berharap kode sumber mewah

Perhatikan bahwa a = n^2iff log(a) = log(n)*2iff log(log(a)) = log(log(n))+log(2). Jadi fungsi ini hanya menemukan nol fungsi f(a) = log(log(n))+log(2) - log(log(a))yang jelas berada di a = n^2.

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

Berikut beberapa fungsi yang tidak terlalu kreatif:

Di sini program akan menjumlahkan angka 1+2+3+...+n = 1/2 * (n^2+n)dua kali dan mengurangi n, sehingga hasilnya selalun^2

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

Fungsi ini menciptakan n x nmatriks angka acak (antara 0 dan 1) dan kemudian mengembalikan jumlah elemen.

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

Fungsi berikut ini membuat matriks vandermonde dari vektor (0,0,n)dan menampilkan entri yang terdiri darin^2

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

Fungsi ini menciptakan kebalikan dari matriks Hilbert ukuran nmana kiri atas elemen selalun^2

function s = g(n)
    a = invhilb(n);
    s = a(1);
end
cacat
sumber
Iklan # 3: Tentu saja dalam aplikasi kehidupan nyata yang akan digunakan g=@(n)nnz(nan(n));demi efisiensi dan singkatnya. ;-)
knedlsepp
Ketika datang ke efisiensi Saya pikir menghitung invers dari matriks Hilbert secara eksplisit akan lebih efisien: function s = g(n); a = inv(hilb(n)); s = a(1); end. Tetapi sekali lagi, solusi Anda lebih pendek; P
flawr
5

C

sizeof(char[n][n])

Ini berfungsi hingga INT_MAX dalam waktu yang konstan dan tanpa alokasi memori.

Contoh:

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

menampilkan

0: 0
1: 1
2: 4
3: 9
4: 16
5: 25
6: 36
7: 49
8: 64
9: 81
2147483647: 4611686014132420609
Florian F
sumber
mungkin membuatnya jelas bahwa loop hanyalah pembungkus untuk menunjukkan program berjalan pada beberapa nilai
masterX244
4

Jawa

Ini adalah jawaban pertama yang benar-benar tidak menggunakan loop atau rekursi.

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;
    }
}
TheNumberOne
sumber
@FlorianF Semua fungsi panggilan jawaban lainnya yang menggunakan loop. Sejauh yang saya tahu, memanggil fungsi 32 kali dan kemudian menambahkan hasilnya tidak dihitung menggunakan loop. Jika saya menambahkan pernyataan System.out.print(1)untuk m, program ini akan mencetak 1persis 32 kali, tidak n kali.
TheNumberOne
3

GolfScript

Histocrat telah menunjukkan satu cara menggunakan konversi basis: inilah cara lain.

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

Pembedahan

{       # 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
Peter Taylor
sumber
2

Emacs Lisp

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

(square-it 11) ;; => 121

Makro sederhana yang diperluas (square-it 5)menjadi (+ 5 5 5 5 5). Tentu saja, input harus berupa konstanta waktu kompilasi.

Jordon Biondo
sumber
2

Javascript

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

Haskell

Ada banyak kemungkinan jika rentang [x..y]diizinkan, beberapa di antaranya adalah:

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]

Dua yang terakhir menggunakan turunan daftar Monad. untuk daftar xs, ysmenyatakan bahwa xs>>ysini ysditambahkan ke dirinya sendiri length xskali.

Trik lain adalah adil

import Data.Monoid
f x=x<>x

fungsi ini, ketika diberi argumen 'tepat' (yang tentu saja dari typeclass Num) mengembalikan kuadratnya. Product 3 :: Num a => Product aadalah contoh dari argumen semacam itu.

pada dasarnya, fungsi ini ketika diterapkan Product a, (yang di Numkelas iff aada di i) mappends dengan sendirinya dan kembali Product (a*a).

jika kita lebih ketat tentang apa itu angka / angka apa fungsi kita bekerja, kita dapat mendefinisikan fsebagai

import Data.Monoid
f n|x<-Product n=getProduct$x<>x
haskeller bangga
sumber
2

Jawa

Ini terlalu panjang untuk dijawab, tetapi pada dasarnya salah satu baris kode muncul beberapa kali kira-kira sama dengan sqrt Integer.MAX_VALUE(yaitu 46340). : D

Tanpa komentar atau jeda baris, kode yang diketikkan menjadi 1.112.155 karakter.

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
}
mbomb007
sumber
2

R

Fungsi ini didasarkan pada penghitungan semua kemungkinan kombinasi dari dua urutan mulai dari 1 hingga n. Nilai 0 diperlakukan secara terpisah.

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

Clojure

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

Urutan tak terbatas dari semua kotak mulai dari 0. Fungsi:

(defn square [n] (nth squares n))
Jarlax
sumber
1

J

Beberapa ascii art ...

p =. ( $ @,@  ( ($*) ([-])"*/ ($*) ))
randomra
sumber
1

perl:

$n=8;
$x = "$n +" x $n;
$x =~ s/\+$//;
print eval $x;
michael501
sumber
1

SQL (PostGIS)

Memanfaatkan area dan membuat fungsi amplop dalam ekstensi PostGIS ke PostGreSQL untuk membuat geometri persegi dan mengembalikan area itu. Bisa diubah untuk mengembalikan kuadrat mengapung juga.

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

Digunakan;

SELECT square(150);

Square Integer
--------------
22500
MickyT
sumber
1

Python

Menggunakan matematika sederhana. Berdasarkan jumlah perkembangan aritmatika.

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

Penjelasan:

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

Meskipun jumlah dan rentang mungkin berisi loop implisit,
tetapi sesuai spek pertanyaan, tidak ada cara untuk memasukkan pernyataan cetak di sini untuk membuatnya berulang, jadi ... :)

Vektor
sumber
1

Pesta

yes|xargs -L$1|xargs -L$1|head -n1|iconv -futf16|wc -m

Hanya berfungsi jika n <256.

jimmy23013
sumber
1

PHP

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

bekerja dengan integer dalam kisaran [0; 46340]

Sunting: Saya baru saja melihat kode @thebestone dan pada dasarnya sama

IKLAN
sumber
1

Perl

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

program mengharapkan nomor input dikuadratkan dalam bentuk unary (yaitu basis 1). Outputnya juga unary. Ini hanya mengganti setiap digit dengan angka keseluruhan.

Contoh penggunaan:

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

Scala:

scala> val q = (n:Int) =>(List.fill (n)(n)).sum
q: Int => Int = <function1>

scala> q(9)
res21: Int = 81
Pengguna tidak diketahui
sumber
1

Scala:

scala> val s=(n:Int)=>(("x"*(n))*n).size
s: Int => Int = <function1>

scala> s(7)
res22: Int = 49
Pengguna tidak diketahui
sumber
Betulkah? Apakah ini terlihat seperti loop atau Anda tahu, bahwa pasti ada loop tersembunyi?
pengguna tidak diketahui