二乗シーケンス


29

二乗シーケンスx nの各項は、x n-1を取り、それを二乗し、最初の4桁を除くすべてを削除することによって作成されます。

シーケンスは常にx 1 = 1111で始まります。これを二乗すると1234321が得られるので、x 2 = 1234

最初のいくつかの用語は次のとおりです。

1111
1234
1522
2316
5363
...

チャレンジ

あなたの仕事は、非負の整数nを与えられて、x nを計算することです。I / Oを実行する完全なプログラム、またはnをパラメーターとして受け取る関数を送信できます。

ソリューションは、指定する限り、0個または1個のインデックスを作成できます。

このシーケンスのすべての用語は5桁より短いため、コードもできるだけ短くする必要があります。標準的な抜け穴が適用されます。

最高のゴルファーが勝つように!


テストケース

注:これらは1インデックスです。

1   -> 1111
8   -> 6840
15  -> 7584
20  -> 1425
80  -> 4717

回答:



24

JavaScript(ES7)、44 43 36バイト

f=n=>--n?(f(n)**2+f).slice(0,4):1111

これは、型強制を悪用する優れた例です。**両方の引数を数値に+変換し、両方の引数が数値でない限り、両方の引数を文字列に変換します。これは、f(n)**2+f最初にf(n)数値に変換してそれを二乗し、次に結果をの文字列表現と連結することを意味しfます。次に.slice、文字列の最初の4文字を取得するために使用できます。

文字列を使用しないいくつかの代替アプローチを次に示します。

f=(n,x=1111)=>x<1e4?--n?f(n,x*x):x:f(n,x/10|0)
f=n=>--n?(x=f(n))*x/(x>3162?1e4:1e3)|0:1111

テストスニペット

注:これは、すべてのブラウザでサポートされていないMath.powために使用**されます。


6

Haskell、40バイト

((iterate(read.take 4.show.(^2))1111)!!)

0から始まるシーケンスです。使用例:((iterate(read.take 4.show.(^2))1111)!!) 79-> 4717

使い方:

iterate (   ) 1111               -- repeatedly apply a function starting
                                 -- with 1111 and collect the results in a list
                                 -- the function is
           (^2)                  -- square
        show                     -- turn into string
     take 4                      -- take the first 4 chars
  read                           -- turn back to number
                     !!          -- finally pick the nth element from the list         

6

Mathematica、48バイト

Nest[⌊10^(3-⌊t=2Log[10,#]⌋+t)⌋&,1111,#]&

整数の引数を取る名前のない関数。0インデックス。4つの3バイト文字を⌊⌊⌋⌋使用します。Mathematicaは、Floor[x]または⌊x⌋を使用して実数を整数に切り捨てます。後者は一般に1バイト少ないです。整数を文字列に変換するMathematicaのコマンド名が長すぎるため、代わりに数学計算を行ってx ^ 2の最初の4桁を見つけます。x^ 2の10を底とする対数を取り、その整数部分を減算し、 10をその乗数に戻し、1000倍して切り捨てます。

tl; dr:対数ftw


6

パイソン2、51 46の 44バイト

私は不格好を取り除くしたいif可能であれば、私は考えてexec短くすることができます。..一瞬判明exec短いです。また違う!再帰関数が戻ります。これは1つのインデックスです。

f=lambda n:1111*(n<2)or int(`f(n-1)**2`[:4])

aleternative 46バイトの溶液でexec

s=1111;exec's=int(`s*s`[:4]);'*input();print s

別の49バイトの再帰的ソリューション:

f=lambda n,s=1111:s*0**n or f(n-1,int(`s*2`[:4]))

Flp.Tkcに、2乗に累乗は必要ないことを思い出させてバイトを保存してくれてありがとう:)


別の46バイトのソリューション:f=lambda n:1111if n<2else int(`f(n-1)**2`[:4])
アクロリス

@daHugLennyは実際には45になります:repl.it/EejD
FlipTack

1
@ Flp.Tkcそして実際には44になります;)
Kade

5

V、19バイト

4é1Àñ|C="*"
5|D

オンラインでお試しください!

これは、0ベースのインデックスを使用します。

数字は正確にVのではありませんので、もちろん、フォルテ、これは非常にgolfyではありません。ただし、Vがvimより優れている点は1つあります。マクロは0回実行できますが、vimでは「0」はカウントではなくコマンドであるため不可能です。

これには多くの印刷できない文字が含まれているため、16進ダンプを次に示します。

0000000: 34e9 31c0 f17c 4312 3d12 222a 1222 0a1b  4.1..|C.=."*."..
0000010: 357c 44                                  5|D

そして、これは読みやすいバージョンです:

4é1Àñ|C<C-r>=<C-r>"*<C-r>"
<esc>5|D

説明:

4                           " 4 times:
 é1                         " Insert a '1'
   Àñ                       " Arg1 times:
     |                      "   Move to the first character on this line
      C                     "   Delete this whole line and enter insert mode
       <C-r>=               "   Insert the following evaluated as vimscript:
             <C-r>"         "     Insert what we just deleted
                   *        "     Times
                    <C-r>"  "     What we just deleted
<esc>                       "   Escape to normal mode
     5|                     "   Move to the fifth column on this line
       D                    "   And delete until the end of this line
                            " The second 'ñ' is added implicitly

5

ゼリー 12 9バイト

デニスが1ベースのインデックス付けと成形/再形成アトムを使用したため、-3バイトになりました。ゴルフの提案を歓迎します!オンラインでお試しください!

²Dṁ4Ḍ
1Ç¡

アンゴルフ

Helper link
²       Square.
 D      Integer to decimal (a list of digits).
  ṁ4    Mold/reshape list_of_digits to be 4 digits long.
    Ḍ   Decimal to integer.

Main link: implicit left argument n
1     Start with the nilad 1.
 Ç¡   Call the helper link n times.

これにより、1ベースのインデックス付けで3バイトが節約されます。
デニス

ええ、1代わりにを使用できるとは思いません⁽¡n
エリックアウトゴルファー

@EriktheOutgolferどうして?
Sherlock9

@ Sherlock9ああ、このシーケンスに1インデックスを付けているようですか?フム、コードのように見えるが...理解することは少しトリッキーです
エリックOutgolfer

4

Perl、37バイト

36バイトのコード+ -pフラグ。

$\=1x4;$\=substr$\*$\,0,4while--$_}{

実行するには:

perl -pe '$\=1x4;$\=substr$\*$\,0,4while--$_}{' <<< 80

4

Powershell、73 55バイト

18バイトを削るTimmyDに感謝します!

コード:

for($A=1111;$args[0]---1;$A=-join"$(+$A*$A)"[0..3]){}$A

$A=1111;1..($n=2)|%{[string]$B=[math]::pow($A,2);$A=$B.substring(0,4)};$A

$nあるN、X n-1の

説明と展開コード:

$A=1111                            #starting number
$n=4                               #n in formula
for($i=0; $i -lt $n;$i++)          #loop n times
{
    [string]$B=[math]::pow($A,2)   #create a new string $B and set it to $A raised to the power of 2
    $A=$B.substring(0,4)           #set $A to the first 4 characters of $B
}
$A                             #print $A

いくつかのメモ:

  • Powershellでは、変数を参照する同じステートメントで変数を割り当てることができます。たとえば、1..($n=4)|%$ nを4に設定し、$ n回実行されるループを開始します。1任意の整数に変更でき、$ n- [your integer] +1回ループします。
  • [math]::Powershellで使用する場合のデフォルトのデータ型はdoubleです。上記のコードでは、Powershellにはdouble の関数がないため$B、文字列に明示的にキャストして呼び出すことができます。.substring().substring()

4

パイソン2、 44の  41バイト

xnorのおかげで-3バイト(整数除算を使用して回避しますand

f=lambda n:int(1/n*1111or`f(n-1)**2`[:4])

repl.it

1ベースの再帰関数。

場合n>1整数除算は1/n、の結果は0、その後、0*1111=0それはfalseyので、右側orの正方形の表現の最初の4つの文字とる、評価されるn-1番目の結果を、これはその後にキャストされますint

場合n=1整数除算、1/n、で結果1次に、1*1111=1111truthyであり、そして、int 1111にキャストがintあります1111


良いもの、忍者が1バイトずつ私を誘ってくれた!
FlipTack 16

私はあなたの答えを探しただけで、あなたがチャレンジを書いたことに気付きました!良くやった。
ジョナサンアラン

1
int外に出るといいアイデア。1-indexの場合、ベースケースをで短くできますg=lambda n:int(1/n*1111or`g(n-1)**2`[:4])
XNOR

1
「クロスアウトされた44はまだ44のように見える:(」
FlipTack

1
@ Flp.Tkcは&nbsp;s がない場合ほどではありません!
ジョナサンアラン



3

MATL14、13のバイト

1111G:"UV4:)U

オンラインでお試しください!

説明:

1111            % Push 1111
    G           % Push input
     :"         % Input times:
       U        %   Square the top of the stack
        V       %   Convert it to a string
         4:)    %   Take the first four digits
            U   %   Convert it back to a number
                % Implictly display

2
次を使用できますU(数値入力の場合は正方形)t*
Luis Mendo

1
@LuisMendoお勧めの機能を思い出してくれてありがとう!:P
DJMcMayhem

3

R、58 56 55 53バイト

x=3334;for(e in N<-scan():1)x=x^2%/%10^(3+(x>3162));x

テイク N標準入力から。3334は、実際にはX_0です。これは、forループを少なくとも1回実行する必要があるために必要です(スキップするにはより長くなります)。

Rは実際に数字の最初の4桁を取得するためのひどい言語ですが、ケースの数は限られているためx<3163x>3162ます。 。

残りは非常に簡単で%/%、残りを分割して無視します。x標準出力に出力されます。

@ETHproductionsのおかげで2バイト節約


これはそれほど重要ではありません。ブリリアント!
アンドレイKostyrka 16

1
良いですね!あなたが3334(またはおそらく3333)で始めた場合はどうなりますか?
ETHproductions

@ETHproductionsは3333^2 = 11108889そうなるだろう1110、そして....これをチェックするように私は見る3334だろう:| 。なぜ私はもうそれをチェックしなかったのか分かりません。
JAD

3

Javagony -153バイト

JavagonyはJavaの制限付きバージョンでありtry-catch、再帰と、forループ、whileループ、またはif 以外の制御フローを許可しません。それをコーディングすることはかなり楽しい練習ですが、イライラさせられます。通常のJava自体がそれほどイライラするわけではありません。

int a(int i){return a(i-1,1111);}int a(int i,int n){try{int x=1/i;return a(i-1,Integer.parseInt((n*n+"").substring(0,4)));}catch(Exception e){return n;}}

3

PHP、55 52バイト

@ user59178のおかげで3バイト節約

for($i=1111;$argv[1]--;)$i=substr($i**2,0,4);echo$i;

ゼロインデックスのコマンドラインから実行します。

PHPの変数の種類を気にしないでくれてありがとう!ここでは、数字を2乗して、最初の4桁を超えるすべてを切り捨てます。数字と文字列は、世間を気にせずに何気なく交互に切り替えます。


$argv[1]--ループカウンターとして使用すると、3バイトを節約できます。
user59178 16


2

C、56バイト

a;s(n){for(a=1111;--n;)a=a*a/(a>3162?1e4:1e3);return a;}

ワンインデックス。


1
私は...あなたが再帰のために行くことができるという感覚を持っている
Mukulクマール

2

Clojure、76バイト

(defn s[n](if(= n 1)1111(read-string(subs(str(*(s(dec n))(s(dec n))))0 4))))

最初のClojureゴルフ(素敵な言語のようです)。これは1インデックスです。

コードについては後で説明します。


2

C#、64 60バイト

Javaの回答に関するOlivierGrégoireコメントに従って、4バイトを節約しました!

n=>{int x=1111;for(;n-->1;)for(x*=x;x>1e4;x/=10);return x;};

以前のバージョン(64バイト):

n=>{int x=1111;while(n-->1){x*=x;while(x>9999)x/=10;}return x;};

ungolfedメソッドとテストケースを含む完全なプログラム:

using System;

namespace SquaringSequence
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<int, int> f = n =>
            {
                int x = 1111;
                while (n-- > 1)
                {
                    x *= x;
                    while (x > 9999)
                        x /= 10;
                }
                return x;
            };

            // test cases:
            Console.WriteLine(f(1));    // 1111
            Console.WriteLine(f(8));    // 6840
            Console.WriteLine(f(15));   // 7584
            Console.WriteLine(f(20));   // 1425
            Console.WriteLine(f(80));   // 4717
        }
    }
}

1
暗闇のオペレーターへの+1n-->1
カールナップ

2

ルビー、47バイト

最初のゴルフ!-nオプションでバイトを節約します(ただし、1としてカウントされます!:))。

a=1111;$_.to_i.times{a="#{a*a}"[0,4].to_i};p a

0インデックス。実行するには:

ruby -ne 'a=1111;$_.to_i.times{a="#{a*a}"[0,4].to_i};p a' <<< 80

サイトへようこそ、最初の回答は素晴らしいです!ただし、技術的には、コマンドラインフラグをバイトカウントにカウントするというポリシーのため、これは47バイトです。それ以外は、私には良さそうです!
DJMcMayhem

ありがとう!ルールを知らなかった、答えが変わった!
ギバート16

2

Pyth、13 12バイト

-1バイトの@Jakubeに感謝

us<*4`*GG4Q1

1インデックス付き整数の入力を受け取り、結果を出力するプログラム。

テストスイート

これは、@ Adnanのanswerと同様のアプローチを使用します

使い方

us<*4`*GG4Q1  Program. Input: Q
u         Q1  Execute the following Q times, starting at 1, with variable G:
      *GG      Yield G*G
     `          Convert to string
   *4           Repeat 4 times
  <      4      Yield first 4 characters
 s              Convert to integer
              Implicitly print

1
*GG代わりに^G2<space>
ジャクベ16


1

バッチ、82バイト

@set n=1111
@for /l %%i in (1,1,%1)do @set/an*=n&call set n=%%n:~0,4%%
@echo %n%

Perlと同様に、整数は文字列ですが、Perlとは異なり、変数の部分文字列しか取得できません。また、ループ内で部分文字列を取得するのはやや面倒です。


@forの後にスペースを省くことができると思います。
YourDeathIsComing

@YourDeathIsComing 'for'は、内部または外部のコマンド、操作可能なプログラム、またはバッチファイルとして認識されません。
ニール

1

Perl 6バイト

{(1111,{+$_².substr(0,4)}...*)[$_]}

説明:

{                                 } # bare block lambda
  1111,                  ...        # sequence generator
                            *       # without a limit
       {                }           # lambda used to generate the next value
         $_²                        # start by squaring the previous value
            .substr(0,4)            # take only the first four digits
        +                           # make it numeric ( not necessary )
 (                           )[$_]  # return the requested value

テスト:

say {(1111,{+$_².substr(0,4)}...*)[$_]}( 1,8,15,20,80 X- 1 ).perl
# (1111, 6840, 7584, 1425, 4717)

1

Matlabの、79、78のバイト

function a=s(n)
if n<2;a=1111; else f=s(n-1);a=fix(f^2/10^(3+(f>1e7^.5)));end

テストケース:

s(79) = 2172
s(49) = 8059
s(6)  = 2876

驚くべき解決策ではありません。4桁に切り捨てるより良い方法があるはずですが、今日はわかりません。

編集:0.5-> .5を設定してバイトを削りました


1

Java 8、77 93 74 71 69 78バイト

int n=1111;int m=1;while(x>m++){n=Integer.parseInt((n*n+"").substring(0,4));}

x->{int n=1111;int m=1;while(x>m++){n=Integer.parseInt((n*n+"").substring(0,4))‌​;}return n;}

x->{int n=1111;for(;--x>0;){n=Integer.parseInt((n*n+"").substring(0,4));}}

x->{long n=1111;for(;--x>0;){n=Long.valueOf((n*n+"").substring(0,4));}}

x->{long n=1111;for(;--x>0;)n=Long.valueOf((n*n+"").substring(0,4));return n;}

各繰り返しによりn、最初の4文字がn*nます。

Javaをオンラインで試す

投稿履歴:

  • 77バイト:初期コード(不完全)

  • +16バイト、OlivierGrégoireによる:Lambda関数にして完成したコード。

  • -19バイト:置き換えるwhileforサイクル。

  • -4バイト:long代わりにsを使用int sを

  • -2バイト、RomanGräfによる:不要な括弧の削除

  • +9バイト、return文がありません

いくつかの問題を指摘してくれた@OlivierGrégoireと@RomanGräfに感謝します!

待って、Javaが勝った...(ドラムロール)Clojure Matlabはこちら!Javaへの大きな拍手をお願いします!


2
この答えは不完全です。x宣言されていません。これは、機能または完全なプログラムでなければなりません。コードスニペットではありません。
NonlinearFruit

@NonlinearFruit私は関数に行きました。私はこれを見逃したようです。xを数字に置き換える必要があるということですか?
ルドルフジェリン16

1
@NonlinearFruitが言ったことは、あなたの現在のコードでの答えは:(x->{int n=1111;int m=1;while(x>m++){n=Integer.parseInt((n*n+"").substring(0,4));}return n;}合計バイト数91に対して)であるべきだということです。これは、スニペットが許可されていないためです:関数または完全なプログラムのみ。
オリビエグレゴワール

@OlivierGrégoireは93バイトではないですか?そして、ラムダ関数を指摘してくれてありがとう。
ルドルフジェリン16

あなたは正しい、それは93バイトです、私は以前の欠陥バージョンからチェックしたに違いありません。ただし、プログラムが有効なエントリになるようにラッピングするだけでした。今、あなたはそれから地獄をゴルフすることができます!たとえば、プログラムのゴルフバージョンは75バイトのみです:x->{Long n=1111;for(;--x>0;)n=n.valueOf((n*n+"").substring(0,4));return n;}いくつかのテクニックが使用されLongています(Long.valueOfより少ないバイトで使用できるように使用され、通常のプログラミングでは推奨されませんが、ゴルフでは完全に使用さmれます。減少する場合は不要なので削除されました)x代わりに、不要なブレースを削除しました)
オリビエグレゴワール

1

Perl、36バイト

他のPerlソリューションとは異なるアプローチで、コードがわずかに短くなります。コマンドライン引数は必要ありません(通常のバージョン選択引数、-M5.010バイトカウントにはカウントされません)、これは同じ量のコードですが、ペナルティが少なく、全体的なスコアが高いことを意味します。

say+eval'($&*$&||1x4)=~/(....)/;'x<>

eval文字列の繰り返しと-ingにより、アンダーロードスタイルのループを作成します。文字列を途中で開始することを試しましたが、開始時に開始するのが最短でした。$&(最後の正規表現一致の結果)をそれ自体で乗算して、それを2乗します。結果がゼロの場合、結果の代わりに1x4(つまり1111、Perlには数字の桁を含む、繰り返しを行う演算子があります)を使用します。次に、最初の4文字を正規表現します。全体がリストコンテキストで実行されるのは内部sayにあるため、最終的な結果はeval最終一致の括弧の内容になります。


1

Java、79 67 66 64バイト

  • バージョン2.2 / 64バイト:

@OliverGrégoireに感謝します。

int a(int i){i=i<2?1111:a(--i);for(i*=i;i>1e4;)i/=10;return i;}
  • バージョン2.1 / 66バイト:

@ETHProductionに感謝します。

long a(long i){i=i<2?1111:a(--i);for(i*=i;i>1e4;)i/=10;return i;}
  • バージョン2.0 / 67バイト:

サブストリングとスタッフを@Xanderhallのアイデアに置き換えました

long a(long i){i=i<2?1111:a(--i);i*=i;for(;i>1e4;)i/=10;return i;}
  • バージョン1.0 / 79バイト:

より短い解決策がありますが、私は再帰を1つ投稿したかったです:)。そして、私は最短の「本当の」関数です:)。編集:私は今一番短いようです:)))

long a(long i){i=i<2?1111:a(--i);return Long.valueOf((i*i+"").substring(0,4));}

できますかfor(i*=i;i>1e4;)i/=10;?それはバイトを節約します。
ETHproductions 16

うーん...最短のJava関数についてのあなたの主張に関して、この関数はいくつかの言葉を持ちたいと思います;-)
オリビエグレゴワール

うーん、それについて考えて、なぜあなたもlongsを使うのですか?ints を使用して2バイトを殺すことができます。
オリビエグレゴワール

2.0に更新したとき、それを逃した
RomanGräf16年

1

Pushy26 20バイト

1111@:2esL4-:.;Kjk;#

コマンドラインで引数を指定します:$ pushy sqseq.pshy 79

説明付きのきれいなフォーマット:

            % Implicit: N is on stack
1111@       % Push 1111, and then reverse stack to get [1111, n]
:           % N times do: (this consumes N)
 2e         %   Square last term
 s          %   Split into individual digits
 L4-:.;     %   Get stack length -4, pop that many times
 Kj         %   Join remaining digits (Uses flag "K" for whole stack)
 k          %   Set "K" flag to false, so operations only affect last item
;           % End loop.       
#           % Output final calculated term
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.