マイ・ウェイ・ア・ナンバー


32

人々は、数の二乗は数にそれ自体を掛けたものであると私に言い続けます。これは明らかに間違っています。数字を二乗する正しい方法は、それを数字の上に積み重ねて、数字の数と同じ数だけ積み重ねてから、結果の四角からすべての数字を水平方向に(両方から読み取ることによって)正方形にすることです(左から右のみ)および垂直方向(上から下のみ)で、それらを一緒に追加します。したがって、番号123については、最初に正方形を作成します。

123
123
123

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

123+123+123+111+222+333

の結果が得られ1035ます。

負の数の場合、通常スタックし(数のみを数えるので、負の符号は長さに含まれないことに注意してください)、水平の数を通常通りに読み(負の符号付き)、次に負の符号を無視します縦の数字。したがって、数値-144については正方形を取得します。

-144
-144
-144

これは私たち-144-144-144+111+444+444に与えます567

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

4

それは私たち4+4に与え8ます。

小数部分のある数字の場合、通常スタックします(数字をスタックする回数には数字のみがカウントされるため、小数点はカウントされないことに注意してください)。たとえば、数字244.2

244.2
244.2
244.2
244.2

それは私たち244.2+244.2+244.2+244.2+2222+4444+4444+2222に与え14308.8ます。

小数または複素数を二乗することはできません。

あなたのタスク:

私は手作業で数字を二乗するのにうんざりしているので、プロセスを自動化することにしました。入力としてフロートまたは文字列のいずれかを受け取り、それを自分の方法で二乗した結果を返すプログラムまたは関数を作成します。

例:

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

得点:

私の手はそれらのすべての正方形を書き出すのでcr屈になっており、私のコンピューターはコピー/貼り付けをサポートしていないので、入力するコードの量が最小のエントリー(何らかの理由でバイト単位で測定されますか?)


1
「123.45」と「244.2」は、コンピューターが数値をバイナリで保存するため、それ自体では有効な浮動小数点数ではありません。これは通常、問題が10進表現に依存するまで問題ではありません。
リーキー修道女

@LeakyNun、それがどういう意味か本当にわかりません。この問題は解決できません(少なくともpythonでは)。大量のバイトではありますが、かなり簡単にできると確信しています。ただし、何らかの文字列操作が必要になります。
グリフォン-モニカの復活

@Gryphonでは、入力を文字列として取得する必要がありますか?
リーキー修道女

3
@Gryphonこれは失敗する場所です。244.2浮動小数点数ではありません。文字列に変換できません"244.2"
リーキー修道女

3
@Gryphonしかし、このような動作は非常に不便です。
リーキー修道女

回答:


8

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


1
また、単一の先行ゼロは、-1 <入力<1の入力の要件であることに注意してください(つまり、0.45と.45は異なる入力ですが、同じ数で、前者のみが許容されます)
ジョナサンアラン

@JonathanAllan後者はとにかく処理されません。
エリックアウトゴルファー

@JonathanAllan完了。
エリックアウトゴルファー

7

ゼリー 13  12 バイト

fØDẋ€L$ŒV+VS

文字のリスト(整形式の10進数、-1 <n <1の要件である単一の先行ゼロ)を受け入れ、数値を返すモナドリンク。

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

図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

うーん、あなたは置き換えることができる+€+-1のための15バイトのバージョンで。
エリックアウトゴルファー

すでにやった、ありがとう!
ジョナサンアラン

うーん、15バイトバージョンではありません。EDIT:3秒は早すぎる私が思う...
エリックOutgolfer

うん、あなたはあなたが15バイトバージョンと言ったことに気付いた-再びありがとう!
ジョナサンアラン

6

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   

5

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.

4

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

@TheLethalCoderのおかげで9バイト節約@TheLethalCoderのおかげで
さらに8バイト節約

a=>{var c=(a+"").Replace(".","").Replace("-","");int i=0,l=c.Length;var r=a*l;for(;i<l;)r+=int.Parse(new string(c[i++],l));return r;}

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

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


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

  1. 入力から新しい文字列を作成しますが、小数点と記号は使用しないため、そこから列の長さと数値を取得できます。

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

  3. 「正方形」の各列について、列番号と行の長さを含む新しい文字列を作成し、結果に追加します。

例:

入力: -135.5

  1. 小数点と記号を置き換えると1355、長さがの文字列を取得します4
  2. 入力回4: -135.5 * 4 = -542
  3. 今では、列ごとに新しい文字列を作成し、それらを解析し、私たちの結果に追加:
    1111333355555555

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


1
このサイトにようこそ、そして最初の回答がいいです(特に説明は大歓迎です!)!
ダダ

@Dadaありがとうございます!タフでさえ、のようなものから得たバイト数にはかなり不満がありますstring.Replace()が、それが唯一の方法だと思います!
イアンH.

浮動小数点数を設定iおよび設定することで、いくつかのバイトを節約できる場合がありますl
TheLethalCoder

@TheLethalCoder同様に、インデックス付けはフロートでは機能せず、.Length暗黙的にフロートに変換することはできません。
イアンH.

1
a=>{var c=a.Replace(".","").Replace("-","");int i=0,l=c.Length;var r=float.Parse(a)*l;for(;i<l;)r+=int.Parse(new string(c[i++],l));return r;}141バイト。入力をaとして取得floatし、文字列にキャストすることで保存できる場合n+""がありますが、チェックしていません。
TheLethalCoder

3

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)

3

、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

3

Pythonの395の94 87 85 84バイト

def f(i):l=[x for x in i if"/"<x];k=len(l);print(k*float(i)+sum(int(x*k)for x in l))

テストスイート

Python 3、78バイト

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

テストスイート。

2番目のアプローチは、@ officialaimmのソリューションに触発されたPython 3への移植です。


3

パイソン281の 74バイト

@Mrのおかげで-7バイト Xcoder'/'<i

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

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

説明:

123.45入力として言います。[i for i in`x`if"/"<x]文字列化された整数のリストを返します['1','2','3','4','5'](これもですz)。ここで、[x]+zつまり[123.45,'1','2','3','4','5']、各要素にを乗算しlen(z)、ここで各要素を5Floatに変換して(文字列もそれに応じて変換するように)繰り返し、を生成し[617.25,11111.0,22222.0,33333.0,44444.0,55555.0]ます。最後にを計算してsum(...)を取得し167282.25ます。


78バイト。交換するi.isdigit()"/"<i<":"
ミスターXcoder

1
74バイト。あなたは置き換えることができi.isdigit()"/"<i、両方のため、実際には、.-数字より低いASCIIコードを持って、ADN /それらの間にある
氏Xcoder

どういたしまして。私は私の答えの代わりとしてPython 3に移植しました
氏Xcoderに

3

JavaScript、75 62バイト

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

オンラインで試す

-2おかげバイトアルノーを
-5おかげバイトシャギー(機能番号を受信しなければならないのにIを、今は他の回答の多くはあまりにも文字列を受け取る参照)


3

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

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

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

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

説明:

@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

非常によく似たアプローチを思いつきましたが、$ \を使用してループを終了することで数バイトを取得できました。オンラインで試してください!
ドンヘイスティングス

あなたからいくつかのインスピレーションを使用して、鉱山を削りました。あなたの最後にある「} {」コンストラクトは何ですか?私はそれをよく知らない。
Xcali

これは私がこのサイトから学んだもので、基本的に-nそして-p文字通りwhile(){...}コードをラップしているので、そこ}{から抜け出します。これは設定解除されますが、変数として$_使用する$\ と、$\ すべての印刷に追加されるため、印刷されます。その中に数字または何かを格納し、無視できることを意味します$_。それが素晴らしい説明であったかどうかはわかりませんが、Perlスレッドでゴルフをするためのヒントgをチェックしてください。あなたのスコアを助けてくれてうれしいです!
ドムヘイスティングス



2

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-数字の長さで数値を乗算します

2

オクターブ100 82バイト

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

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

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

非ゴルフ/説明

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
すべてを無名関数に入れることで18バイトを節約できます@(v)(n=nnz(s=strrep(num2str(abs(v)),'.','')-'0'))*v+sum(sum(s'*logspace(0,n-1,n)))オンラインでお試しください!
トムカーペンター

1

スイフト4139の 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)- f明示的なStringパラメーターを使用して関数を定義しますs

  • let k=s.filter{"/"<$0}-数字をフィルタ:私は両方のことに気づいた-.、すべての数字よりも小さいASCII値を持っている、と/の間にある.-0。したがって、"/"Pythonの回答で行ったように、現在の文字よりも小さいかどうかを確認しました。

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

  • Float(s)!*Float(k.count)-文字列と桁数の両方をFloatに変換し、乗算します(SwiftではFloatとIntの乗算は許可されません:())。そのため、number x回を加算xします。ここで、そこに含まれる桁数です。

  • k.map{Int(String(repeating:$0,count:k.count))!- 現在の値でk.map{}マップしkます$0String(repeating:$0,count:k.count)各数字を受け取り、x同一の数字の文字列を作成し、Float(...)!それを浮動小数点数に変換します。

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

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


例を見てみましょう!

Stringがであるとしましょう"0.45"。最初に、数字をフィルタリングするため、が残り0, 4, 5ます。"0.45"Floatに変換し、桁数を乗算します0.45 * 3 = 1.35。次に、各数字を取得し、正方形の幅(数字の数)を満たすまでその数字を繰り返すStringに変換します0, 4, 5 -> 000, 444, 555。これを合計し000 + 444 + 555 = 999ます。次に、結果を一緒に追加します1.35 + 999 = 1000.35


1

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

@Ian Hのおかげで2バイト節約されました。

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

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

namespace System.Linq
{
    class P
    {
        static void Main()
        {
            Func<double, double> 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();
        }
    }
}

var d=(n+ ...代わりにを使用すると、先頭に2バイトを保存できますvar d = (n ...
イアンH.

@IanH。すべてのスペースを削除するのを忘れてしまった
TheLethalCoder

1

Mathematica、107バイト

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

1

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ます。

PHP 7.1で警告が発生する場合があります。Repace $c,$e$c>0?$c:0,$e修正します。


0

Python 3、68 70 73 77バイト

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

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

すべての数字をループ処理し、数字全体でそれを繰り返し、整数にし、それをに追加しnます。この方法でnd、合計の水平部分と、垂直部分である数字の繰り返しが追加されます。もともと使用されてstr.isdigit>"/"ましたが、このスレッドの他のユーザーのおかげで、多くのバイトを節約しました。n文字列として取得することで2バイトを節約しますが、出力が大きくなります。

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.