正方形の番号私の方法

Gryphon 08/21/2017. 20 answers, 1.959 views
code-golf number

人々は、数字の2乗がそれ自体で乗算された数であることを私に伝え続けます。 これは明らかに誤りです。 数字を正方形にする正しい方法は、それを正方形にすることです。数字の桁数と同じ回数だけ積み重ねてから、結果の正方形からすべての数値を水平方向(左から右へのみ)、垂直方向から(上から下へのみ)、それらを一緒に追加します。 だから、番号123の場合は、まずスクエアを作成します。

123
123
123 

次に、正方形からすべての行と列を取り出し、それらを一緒に追加します。

123+123+123+111+222+333 

1035結果が得られます。

負の数の場合は、通常のように積み重ねます(負の符号は長さに含まれないので、 digits数のみをカウントすることを忘れないでください)。垂直の数字。 したがって、 -144 、正方形が得られます。

-144
-144
-144 

これは-144-144-144+111+444+444を与え、これは567に等しい

1桁の数字の場合、正方形は常に2倍の数になります(水平方向に1回、垂直方向に1回読み取る)。 だから4が私たちに与える

4 

これは私たちに4+4を与えます。これは8に等しくなります。

小数点以下の桁数の場合、通常はスタックします( digitsを積み重ねる回数でdigitsがカウントされるので、小数点はカウントされません)。縦の数字を読むとき小数点記号は無視してください。 たとえば、番号244.2は私たちに与えます

244.2
244.2
244.2
244.2 

これは14308.8 244.2+244.2+244.2+244.2+2222+4444+4444+2222 14308.8 244.2+244.2+244.2+244.2+2222+4444+4444+2222 14308.8 244.2+244.2+244.2+244.2+2222+4444+4444+2222 14308.8 244.2+244.2+244.2+244.2+2222+4444+4444+222214308.8 、これは14308.8に等しい。

分数または複素数は2乗することはできません。

あなたのタスク:

私は手で数字を二乗するのに飽き飽きしているので、私はそのプロセスを自動化することに決めました。 浮動小数点または文字列を入力して、自分の好きなところに入力して、自分の方法で2乗した結果を返すプログラムや関数を書いてください。

例:

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 

得点:

私の手はすべての四角形を書くことから窮屈になっています。私のコンピュータはコピー/ペーストをサポートしていないので、入力するコード量が最小限のエントリ(何らかの理由でバイト単位で測定されますか?

5 Comments
Gryphon 07/29/2017
私はこれが非常に長い間(1日に少しだけ)サンドボックスにはなかったが、すでに7つのアップフォースを持っていたことを認識しています。
1 Leaky Nun 07/29/2017
"123.45"と "244.2"は、コンピュータがバイナリで数値を格納するため、有効なフロートではありません。 これは問題が10進表記に依存するまで通常は問題ではありません。
3 Leaky Nun 07/29/2017
@Gryphonこれは失敗する場所です。 244.2は浮動小数点数ではありません。 文字列"244.2"変換することはできません。
2 Leaky Nun 07/29/2017
@グリフォンしかし、 このような行動は非常に不便です。
7 Gryphon 07/29/2017
なぜ3つの近い票? 11人で質問に答えることができれば、おそらくかなり明確だと思います!

20 Answers


Erik the Outgolfer 07/29/2017.

05AB1E 、7バイト

þSDg×+O 

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

説明

þ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 
4 comments
3 Jonathan Allan 07/29/2017
あなたが喜ぶことができるとき、私たちの説明
1 Jonathan Allan 07/29/2017
また、単一の先行ゼロは、-1 <input <1(すなわち、0.45と.45は異なる入力ですが、同じ数値ですが、前者のみが許容可能です)の入力の要件であることに注意してください
Erik the Outgolfer 07/29/2017
@JonathanAllan後者はとにかく扱われません。
Erik the Outgolfer 07/29/2017
@JonathanAllanは完了しました。

Jonathan Allan 07/29/2017.

ゼリー13 12 バイト

fØDẋ€L$ŒV+VS 

文字のリストを受け付けるモナドリンク(整形された10進数、 -1 < n < 1場合は先頭のゼロが必要です)を返します。

Try it online!

14バイトで受け取り、数字を返す(入力は+/-10-5ŒṘ ): ŒṘfØDẋ€L$ŒV+⁸S

どうやって?

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 
4 comments
Erik the Outgolfer 07/29/2017
うーん、あなたは-1の代わりに+€を15バイト版で置き換えることができます。
Jonathan Allan 07/29/2017
既に、ありがとう!
Erik the Outgolfer 07/29/2017
15バイト版ではありません。 編集:3秒早すぎる私は仮定...
Jonathan Allan 07/29/2017
うん、ちょうどあなたが15バイトのバージョンを言ったことに気づいた - ありがとう!

nimi 07/29/2017.

Haskell、 59 56バイト

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

入力は文字列として扱われます。

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

使い方

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 

ETHproductions 07/29/2017.

Japt v2、16バイト

o\d
l
¬xpV +V*Ng 

それをオンラインでテストしてください!

説明

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. 

Ian H. 07/31/2017.

C#(.NETコア)、 150 141 133バイト

Saved 9 bytes thanks to @TheLethalCoder
@TheLethalCoderのおかげでさらに8バイトを節約できました

a=>{var c=(a+"").Replace(".","").Replace("-","");int i=0,l=c.Length;var r=a*l;for(;i 

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

文字列を入力として受け取り、「2乗」の数値を浮動小数点として出力します。


このコードは、次のアルゴリズムに従います。

  1. 入力から新しい文字列を作成しますが、小数点や記号は使用しません。したがって、長さと列の番号を取得できます。

  2. ポイント1で作成した文字列の長さを入力時間で計算します。

  3. 'square'の各列に対して、列番号と行の長さで新しい文字列を作成し、結果に追加します。

例:

入力: -135.5

  1. 小数点と記号を置き換えると、長さが4文字列1355得られます。
  2. 入力時間4: -135.5 * 4 = -542
  3. 各列に新しい文字列を作成し、解析して結果に追加します。
    5555

これらの数値を合計すると、 15012得られます。これは、プログラムが出力するものです。

5 comments
1 Dada 07/31/2017
サイトにようこそ、最初の良い答え(特に説明がありがとう!)!
Ian H. 07/31/2017
@ダダありがとう! 難しいですが、私はstring.Replace()ようなものから得たバイトでは不満ですが、それがstring.Replace()かどうかはstring.Replace()ます!
TheLethalCoder 07/31/2017
ilをfloatに設定することで、いくつかのバイトを節約できます。
Ian H. 07/31/2017
@TheLethalCoderそれも考えて、悲しいことにインデックスは浮動小数点では機能せず、 .Lengthは暗黙的にfloatに変換することはできません。
1 TheLethalCoder 07/31/2017
a=>{var c=a.Replace(".","").Replace("-","");int i=0,l=c.Length;var r=float.Parse(a)*l;for(;i 141バイト。 floatとして入力し、 n+""文字列にキャストすることで節約できるかもしれませんが、私はチェックしていません。

Erik the Outgolfer 07/29/2017.

Brachylog 、23バイト

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

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

Brachylogは浮きにうまくいかない...

説明:

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

Zgarb 07/29/2017.

ハスク 、15バイト

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

文字列を受け取り、数値を返します。 オンラインで試してみてください!

説明

組み込みの解析関数rがデフォルト値を返すのではなく無効な入力に対して解析エラーを出すのはちょっと面倒です。つまり、非数字からなる列を明示的にフィルタリングする必要があります。 それが不正な入力で0を返した場合、私はfΛ±落として3バイトをセーブできます。

§+ȯṁ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 

Mr. Xcoder 07/29/2017.

Python 3,95 94 87 85 84バイト

 def f(i):l=[x for x in i if"/" 

テストスイート

Python 3,778バイト

 lambda x:sum(float(i*len(z))for z in[[i for i in str(x)if"/" 

テストスイート。

2番目のアプローチは、@ officialaimmの解決策に触発されたPython 3への移植です。


ThePirateBay 07/31/2017.

JavaScript、 75 62バイト

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

オンラインで試してみてください

-2 bytes thanks to Arnauld
-5 bytes thanks to Shaggy (私は関数が数値を受け取る必要がありますが、今は他の多くの文字列も受け取ることがわかります)


Xcali 08/05/2017.

Perl 5、37 33 + 1(-p)= 38 34バイト

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

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

Domのコードからいくつかのトリックを使って4バイトを削る

Explained:

 @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 
3 comments
Dom Hastings 07/31/2017
非常によく似たアプローチで始まりましたが、$ \を使用して数バイトを取り出し、ループを終了することができましたオンラインで試してみてください!
Xcali 08/05/2017
私を剃るためにあなたからインスピレーションを得ました。 あなたの最後には "} {"構造がありますか? 私はそれに慣れていない。
Dom Hastings 08/05/2017
このサイトから学んだのは、基本的には-n-p文字通りwhile(){...}をコードの周りに囲んでいるためです}{ 。 これは$_取り消しますが、 $\を変数として使用すると、すべての印刷に$\が追加されるので、まだ印刷されます。 あなたはその中に番号や何かを格納して$_を無視することができます。 それは素晴らしい説明でしたが、Perlスレッドでゴルフのためヒントをチェックしてください、私はそれをより良く説明してくれるでしょう! あなたのスコアを助けてくれてうれしい!

Erik the Outgolfer 07/29/2017.

ゼリー 、17バイト

ŒṘfØDẋ€L©$ŒV;ẋ®$S 

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


Erik the Outgolfer 07/29/2017.

Pyth、18バイト

s+RvQsM*RF_lB@jkUT 

ここで試してみてください。


Mr. Xcoder 07/29/2017.

Pyth21 20バイト

K@jkUTQ+smv*lKdK*lKv 

テストスイート。

@ EriktheOutgolferの答えとはまったく異なるアプローチを使用しました。チャットで1バイトのゴルフが22歳から21歳にゴルフに役立ちました。


説明

  K@jkutq+s.ev*lKbK*lKv   K @ jkUTQ  - 数字をフィルタリングし、それらを変数Kに割り当てます。           m  - マップ。 変数dで数字を反復する             v  - 評価する(浮動小数点に変換する)。              * lKd  - 各文字列の桁にKの長さを掛けます。          s  - 合計         +  - 合計                   * lKvQ  - 数値に桁の長さを掛けます。String 

officialaimm 07/30/2017.

Python 2,81 81バイト

-7 bytes thanks to @Mr. Xcoder -7 bytes thanks to @Mr. Xcoder'/'

  • 整数または浮動小数点を取り、floatを返します。
 lambda x:sum(float(i*len(z))for z in[[i for i in`x`if"/" 

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

説明:

123.45が入力として与えられると言う。 [i for i in`x`if"/" ['1','2','3','4','5'] (これもz )のリストを[i for i in`x`if"/"ます。 今度は[x]+zすなわち[123.45,'1','2','3','4','5']反復し、各要素にlen(z)掛けます。 Float(文字列もそれに応じて変換されるように)、 [617.25,11111.0,22222.0,33333.0,44444.0,55555.0] 。 最後に、 sum(...)を計算し、 167282.25を取得し167282.25

4 comments
Mr. Xcoder 07/29/2017
78バイトi.isdigit()"/"置き換え"/"
1 Mr. Xcoder 07/29/2017
74バイトi.isdigit()"/"と置き換えることができ. -数字よりもASCIIコードが低く、その間にadn /がある
officialaimm 07/29/2017
@ Mr.Xcoderありがとうございました!
Mr. Xcoder 07/29/2017
どういたしまして。 私は私の答えの代わりにPython 3に移植しました

Bruce Forte 07/30/2017.

オクターブ100 82バイト

割り当てに戻り値があり、 18バイトを節約できることを教えてくれてありがとう@TomCarpenter!

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

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

Ungolfed / Explanation

 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 

これが動作する方法は、基本的に数値自体をn回追加して列の合計を加算する必要があるということです。 サミングs' * logspace(0,n-1,n)は、列の合計を達成します。たとえば、 v=-123.4場合、その行列は次のようになります。

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

だから私たちはそれをsumするだけで済みます。

1 comments
1 Tom Carpenter 07/30/2017
あなたは18バイトを無名関数@(v)(n=nnz(s=strrep(num2str(abs(v)),'.','')-'0'))*v+sum(sum(‌​s'*logspace(0,n-1,n)‌​))にすべてスムージングすることで保存することができます@(v)(n=nnz(s=strrep(num2str(abs(v)),'.','')-'0'))*v+sum(sum(‌​s'*logspace(0,n-1,n)‌​))オンラインで試してみてください!

Mr. Xcoder 07/30/2017.

スウィフト 4、139,134バイト

 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,+))} 

テストスイート。


説明

  • func f(s:String) - 明示的な文字列パラメータsを持つ関数fを定義します。

  • let k=s.filter{"/"<$0} - 数字をフィルタリングします. すべての桁よりも小さいASCII値、および/間にある. 、および0 。 したがって、私はPythonの答えで行ったように、 "/"が現在の文字よりも小さいかどうかをチェックしました。

  • print(...) - 結果を出力します。

  • Float(s)!*Float(k.count) - 文字列と桁数をFloatに変換し、乗算します(SwiftはFloatとIntの乗算を許さない:())。 それで、それはx倍数を加えます。ここで、 xはそれに含まれる桁数です。

  • k.mapNO maps over k with the current value $0 . - k.map{}は現在の値$0 kを写像し$0String(repeating:$0,count:k.count)は各桁を取り、 x桁の同じ数字とFloat(...)! Stringを作成しFloat(...)! 浮動小数点数に変換します。

  • .reduce(0,+) - 上記のリストの合計を取得します。

  • 最後に+の2つの結果を合計します。


例を見てみましょう!

私たちの文字列が"0.45"ます。 まず、数字をフィルタリングするので、0,4,5とします。 "0.45"をFloatに変換し、桁数: 0.45 * 3 = 1.35を掛けます。 次に、各桁を取って、その桁を四角形の幅(何桁の数字)にするかを0, 4, 5 -> 000, 444, 555ように繰り返す文字列に変換します。 これを合計すると、 000 + 444 + 555 = 999ます。 次に結果をまとめてください: 1.35 + 999 = 1000.35


TheLethalCoder 07/31/2017.

C#、 139 137バイト

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

Saved 2 bytes thanks to @Ian H.

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

フルバージョン/フォーマットバージョン:

 namespace System.Linq
{
    class P
    {
        static void Main()
        {
            Func 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();
        }
    }
} 
2 comments
Ian H. 07/31/2017
var d=(n+ ...代わりにvar d = (n ... var d=(n+ ...を使用すると、先頭に2バイトを保存できvar d = (n ...
TheLethalCoder 07/31/2017
@IanH。 すべてのスペースを削除するのを忘れてしまった-_-それはサポートコールをしている間に私が答えを得るためのものです。

Jenny_mathy 08/09/2017.

Mathematica、107バイト

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

Titus 08/11/2017.

PHP、 78 88 +1バイト

 for($e=preg_match_all("#\d#",$n=$argn);~$c=$n[$i++];)$s+=str_repeat($c,$e);echo$s+$n*$e; 

-nR-nRてパイプとして実行します。

PHP 7.1で警告を発することがあります。 $c,$e$c>0?$c:0,$e置き換え$c>0?$c:0,$eを修正してください。


C McAvoy 07/31/2017.

Python 3、68 70 73 77バイト

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

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

すべての桁の文字をループし、桁の文字数で全体を繰り返し、整数にしてn追加します。 このようにして、 nは和の水平部分と垂直部分である桁の繰り返しと一緒にd回追加されます。 もともとstr.isdigit使用していstr.isdigitが、 >"/" 、このスレッドの他の人のおかげで、たくさんのバイトが保存されました。 文字列としてnを取ることによって2バイトをセーブしますが、出力はより厄介です。

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

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

Related questions

Hot questions

Language

Popular Tags