制限付きの整数の2乗を計算する[終了]


8

パズル

入力されたものの2乗を返すプログラムまたは関数p(n)を記述する必要があり、入力が負でない整数であると想定する場合があります。より簡単に言えば、n 2を返します。

ルール

  1. *or /(または言語にそのような関数が含まれている場合は、POWor などのその他のべき乗演算子または平方根演算子)の使用は許可されていません。SQRT
  2. ループを使用したり、ループに類似した構造を使用したりすることはできません。ループのような構造の例はGOTO、再帰です。

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

創造的であり、(ab)選択した言語で提供されている機能を使用します。

*編集

ループのような構造は、1つ以上の命令を繰り返すことができるループです

- stdout "1"コードにを追加して、その出力をn回繰り返すことになってしまうと、ループとしてカウントされます。


1
@dwana最初のルールの2番目の部分と3番目のルールは同じではありませんか?
Def

14
「ループのような」ものとして数えられるものについての明確さがまだないので、これは再開されるべきではありませんでした。例えば、折り目はどうですか?
Peter Taylor

5
@PeterTaylorまたはそのことについての地図。
マーティンエンダー、2015年

7
@dwanaルールでこれらのことについて具体的に説明できますか?(1)マップ、イテレータ、フォールド、リデュースなど、本質的にループが組み込まれている組み込み関数に許可されていますか?(2)eval / execを使用して文字列をコードとして評価できますか?
オプティマイザ

4
これは主m*nに、n*nを使用せずに、より一般的なものを要求する以前のコードゴルフの課題の複製です*。参照してくださいcodegolf.stackexchange.com/a/18283/14485
マーク・Lakata

回答:


42

CJam、彼の眼鏡をかける

q~33c

(*_*)

(*_")>⌐■-■

(⌐■_■)

"]sG>4%,)

STDINによる入力

ここでコードを試してください

*コードでは乗算としてではなく、結合演算子として使用されていることに注意してください

また、コードのクールな部分は単なる文字列ではなく、その半分が実際に正方形の検索に関係するコードであることにも注意してください。だから..それと取引

これはそれに対処するのに役立ちます:

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

ルビー

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

10
これは本当に賢いです。
Ypnypn 2015年

3
記録として、Mathematicaでは、これは特別なケースを処理する必要なしに、はるかに任意の整数(0と負を含む)で機能しますFromDigits[{1, 0, 0}, Input[]]。CJamでも同じ:4Ybl~b
マーティンエンダー

20

APL?ε⍵⍵

{+/ ∊⍵⍵ ⍴1}

この回答は、APL記号が表示されたときに「∊⍵⍵」に行くすべての人に捧げられます:-)

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

説明

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

3
eww ... <!-placeholder->
Kroltan

4
行列の疑似ループのすべての要素を合計していませんか?合計はreduceまたはfoldを介して行われ、どちらもループします
オプティマイザー

+/他の言語で呼ばれsum()、それを使用して多くの答えを見ています。同じ理由*で、CJam では使用できませんでした。
トビア2015年

私はあなたの要点を理解していますが、参加はすべての要素の値を読み取る必要がないため、低レベル自体でループなしで実行できます。行列の要素を合計するには、実際にはすべての要素を反復して追加する必要があります。または、マトリックスを平坦化し、その長さを取得するようなこともできます。
オプティマイザ

2
ハムのシンボルみたい!
FreeAsInBeer 2015年

15

Mathematicaのいくつかの関数を乱用する

二等辺三角形の面積の2倍

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

正方形の面積。もちろん!

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

同じアイデアを別の形で:

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

正方行列の要素数:

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

または

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

または

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

または

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

等...


1
別のもの:k[n_] := Integrate[n, {x, 0, n}]
デジタルトラウマ

DigitalTrauma、Integrateとてもいいですが、繰り返します。これはループの一種だと思います。
DavidC、2015年

確かに、それは暗黙のループにすぎないと思います。私が主張するのAreaと同じ議論で、友人は暗黙の乗算です(しかし、許可されています)
Digital Trauma


12

Mathematica

Mathematicaの面白い機能を使った別の答え

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

n頂点を持つ完全なグラフにはbinom(n,2) = n(n-1)/2エッジがあります(これはn番目の三角形の数でもあります)。したがって、結果は単純にその2倍と入力になります。


1
グラフを使用して非常に賢い。
DavidC、2015年

12

Python 2

純粋に数学で、禁止されている操作を回避します。

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

これは、exp(ln(x)*y)この問題に合わせた通常のトリックです。

  • yは2なので、単純に ln(x)+ln(x)なので、に乗算を取り除くます。
  • 私は感じたmath.exp()ので、代わりに全部が複雑に変換され、オイラーのアイデンティティを置き換えるために使用され、ビット近すぎるフェアプレーのために禁止された「POW」にしたexp()cos()し、sin()
  • 明示的な乗算/除算iが必要な状況を回避するために、complex()代わりに関数が使用されます。

2
に変更math.logするcmath.logと、負の数を処理できます。また、その必要もありませんimport math
FryAmTheEggman 2015年

inputPython 2ではPython 2が思っていることを実行せず、Python 3 printではステートメントではなく関数です。
クリスティアンCiupitu 2015年

@CristianCiupitu inputPython 2で何ができると思いますか?;-)。これが製品コードである場合、私は確かにこれを別の方法で記述しますが、この課題のために、入力が整形式の数値式である限り、問題ありません。そこには暗黙の評価があり、その潜在的な悪が理解されています。
デジタルトラウマ2015年

8

ピュアバッシュ

明示的なループや算術はありません:

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

bash展開を使用して2つのリスト1-nを作成し、それらを中かっこ展開して、結果の配列のサイズを表示します。


同様の方法ですが、代わりにcoreutilsを使用します。

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

8

R、モンテカルロでのおいしい非効率

ガンマ分布のE[x]形状/スケールパラメータ化の期待値はです。shape*scale

私はmean禁止されていないので、ここにサンプルソリューションがありますmean()

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

使用せずにmean()、それを使用することが可能であるmode[x]と等しい、(shape-1)*scaleが、これは書く必要add.oneバイパスに機能し+1、その後、別の書き込み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)))

精度は保証されませんが、多数の法則により1,000,000,000サンプルが必要になるため、すべてのテストケースで正しい結果が得られます。


私は同様のハッキングを考えていました、+ 1
シャドウトーカー

7

ジャワ

最初のエントリ、これはどのように機能しますか?

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

...面白くないu_u

6

C#

n文字の文字列を作成し、各文字をn文字の文字列に置き換えます。これにより、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);
    }
}

ここでテストしてください:http : //ideone.com/lubIFg


2
それは創造的です!
TheNumberOne 2015年

5

Matlab

警告:これは主に数学に基づいているため、派手なソースコードを期待しないでください

a = n^2iff log(a) = log(n)*2iffに注意してくださいlog(log(a)) = log(log(n))+log(2)。したがって、この関数は、f(a) = log(log(n))+log(2) - log(log(a))明らかににある関数のゼロを見つけるだけa = n^2です。

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

ここに他のいくつかの非常に創造的な機能:

ここでプログラムは数値を1+2+3+...+n = 1/2 * (n^2+n)2回合計して減算nするので、結果は常にn^2

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

この関数は、n x n乱数の行列(0と1の間)を作成し、要素の数を返します。

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

次の関数は、ベクトルのヴァンダーモンド行列を作成し、以下(0,0,n)で構成されるエントリを出力しますn^2

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

この関数は、左上の要素が常にあるサイズのヒルベルト行列の逆を作成しますnn^2

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

Ad#3:もちろん、実際のアプリケーションg=@(n)nnz(nan(n));では、効率と簡潔さのために使用します。;-)
knedlsepp 2015年

効率に関しては、ヒルベルト行列の逆を明示的に計算する方が効率的だと思いますfunction s = g(n); a = inv(hilb(n)); s = a(1); end。しかし、再び、あなたの解決策はより短いです; P
flawr

5

C

sizeof(char[n][n])

一定の時間でメモリ割り当てなしで最大INT_MAXで動作します。

例:

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

ディスプレイ

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

おそらく、ループが複数の値で実行されているプログラムを表示するための単なるラッパーであることを明確にしてください
masterX244

4

ジャワ

これは、本当にループや再帰を使用しない最初の答えです。

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他のすべての回答は、ループを使用する関数を呼び出します。私の知る限り、関数を32回呼び出してから結果を追加することは、ループの使用としてはカウントされません。ステートメントSystem.out.print(1)をに追加した場合m、プログラムは1n回ではなく正確に32回印刷します。
TheNumberOne 2015年

3

GolfScript

ヒストクラートは、基本変換を使用する1つの方法を示しています。

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

解剖

{       # 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

に展開(square-it 5)される単純なマクロ(+ 5 5 5 5 5)。もちろん、入力はコンパイル時定数でなければなりません。


2

Javascript

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

2

ハスケル

範囲[x..y]が許可されている場合、多くの可能性があります。それらの一部は次のとおりです。

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]

後者の2つは、リストのモナドインスタンスを使用します。リストのためにxsysそれが保持xs>>ysされys、それ自体に追加length xs回。

別のトリックはちょうどです

import Data.Monoid
f x=x<>x

この関数は、 '適切な'引数(もちろんtypeclassからのものNum)が与えられると、それを二乗します。Product 3 :: Num a => Product aはそのような議論の例です。

基本的に、この関数をに適用するProduct aと(Numクラスiff aはiにmappendあります)、それ自体でsを返し、を返しますProduct (a*a)

私たちは数であるかについて、より厳格であれば/私達の機能の仕事に、私たちはどのような数字を定義することができなければならないfとして、

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

2

ジャワ

これは答えを出すには長すぎますが、基本的には、コード行の1つが、 Integer.MAX_VALUE(46340)にます。:D

コメントや改行がない場合、入力されるコードは1,112,155文字になります。

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

この関数は、1からまでの2つのシーケンスのすべての可能な組み合わせをカウントすることに基づいていますn。値0は個別に処理されます。

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

0から始まるすべての正方形の無限シーケンス。関数:

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



1

SQL(PostGIS)

PostGreSQLのPostGIS拡張機能でエリアを使用してエンベロープ関数を作成し、正方形のジオメトリを作成してそのエリアを返します。フロートの二乗を返すように変更することもできます。

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

使用中で;

SELECT square(150);

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

1

パイソン

単純な数学を使用します。算術プログレッションの合計に基づいています。

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

説明:

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

sumとrangeにはおそらく暗黙のループ
が含まれますが、質問の仕様に従って、ここに印刷ステートメントを挿入して繰り返すようにする方法はないため、... :)


1

バッシュ

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

n <256の場合にのみ機能します。


1

PHP

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

[0; 46340]の範囲の整数で動作します

編集:私は@thebestoneコードを見たばかりで、基本的に同じです


1

Perl

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

プログラムは、入力数が単項形式で2乗されることを期待します(つまり、基数1)。出力も単項です。それは単にすべての数字を整数に置き換えます。

使用例:

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

1

Scala:

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

scala> q(9)
res21: Int = 81

1

Scala:

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

scala> s(7)
res22: Int = 49

本当に?それはループのように見えますか、それともいくつかの隠されたループが存在する必要があることを知っていますか?
不明なユーザー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.