平行四辺形の数


18

数値を適切に正方形三角形にする方法がわかったので、1つを平行四辺形にする方法を学習します。数を平行四辺形にするために、まず、その数の上に積み重ねて平行四辺形として配置し、スペースを追加して平行四辺形にします。そのため、次のように123なります。

   123
  123
 123

ここで、水平および垂直の各数値を取得し、それらを追加します。これは、の平行四辺形で123+123+123+1+12+123+23+3あるに等しくなります。 531123

あなたのタスク:

入力として数値を指定すると、その数値の平行四辺形を返すプログラムまたは関数を作成します。

入力:

非負の整数、または文字列で表される非負の整数。

出力:

整数の平行四辺形。

テストケース:

1234567 -> 10288049
123     -> 531
101     -> 417
12      -> 39

得点:

これは、バイト単位の最低スコアが勝ちです!



なぜ下票なのか?
グリフォン-モニカの復活

回答:


9

MATL、12バイト

tnEXyPY+c!Us

入力は文字列です。オンラインでお試しください!

説明

'123'例として入力を検討してください。

コードは入力を複製し(tXy、入力長の2倍のサイズの単位行列()を作成します(nE):

1 0 0 0 0 0
0 1 0 0 0 0
0 0 1 0 0 0
0 0 0 1 0 0
0 0 0 0 1 0
0 0 0 0 0 1

次に、上下逆さまにします(P):

0 0 0 0 0 1
0 0 0 0 1 0
0 0 0 1 0 0
0 0 1 0 0 0
0 1 0 0 0 0
1 0 0 0 0 0

数字のASCIIコードとして解釈される入力文字列は、数値行ベクトルと同等です

49 50 51

Y+上記のベクトルと行列のフルサイズの2次元畳み込み()は、

 0  0  0  0  0 49 50 51
 0  0  0  0 49 50 51  0
 0  0  0 49 50 51  0  0
 0  0 49 50 51  0  0  0
 0 49 50 51  0  0  0  0
49 50 51  0  0  0  0  0

これらの数値をASCIIコード(c)として解釈すると、次のcharマトリックスが得られます。char0はスペースとして表されます。

     123
    123 
   123  
  123   
 123    
123

転置(!)はこれを

     1
    12
   123
  123 
 123  
123   
23    
3     

各行をU数値()として解釈すると、数値列ベクトルが得られます

  1
 12
123
123
123
123
 23
  3

そして、それを合計(s)すると最終結果が得られ531ます。


1
私はにおい... 畳み込み
アドナン

1
@Adnan他に何?:-D
ルイスメンドー

6

網膜、22バイト

.
$`;$&$';$_;
\d+
$*
1

オンラインでお試しください!リンクにはテストケースが含まれます。説明:第1ステージでは、入力番号を各桁で分割し、すべての排他的接頭辞と包括的接尾辞を含めて、垂直番号を与えます。さらに、各数字に対して繰り返される元の入力番号、水平番号を与えます。残りのステージは、結果の数値を単純に合計します。


6

05AB1E 12 11  8 バイト

I 「Mは確かにこれは知っていたことができ、さらにgolfedできること-ヒントは歓迎します!

Erik the Outgolferのおかげで-1バイト(ラップを避け、連結を使用)
、そして...
-3バイトがAdnanのおかげで(最後に入力をベクトル化し、入力を減算することでlength-1の乗算を避けました)

.s¹η++Oα

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

どうやって?

.s¹η++Oα - implicit input, say i      e.g.  123
.s       - suffixes                         [3,23,123]
  ¹      - push i                           123
   η     - prefixes                         [1,12,123]
    +    - addition of top two              [4,35,246]
     +   - addition (vectorises)            [127,158,369]
      O  - sum                              654
       α - absolute difference abs(123-654) 531
         - implicit print

あなたは使用することができ«接尾辞や接頭辞を連結する:g<*¹.s¹η«O+
エリックOutgolfer

1
.s¹η++Oα8バイトのために働く必要があります
アドナン・

@EriktheOutgolferのおかげで、2つのラップは奇妙に思えました!
ジョナサンアラン

@アドナン-それはかなり甘いです!
ジョナサンアラン

@JonathanAllan「チップス歓迎!」あなたはもういずれかを取得しますないように注意してください場合は...
エリックOutgolfer


4

13 12バイト

ṁit§+SRL§+ḣṫ

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

説明

              -- implicit input, say "123"
   §+         -- concatenate the results of the following two functions
     SR       --  ¹repeat the input n times, where n is the result of the next function
       L      --   length                                                  ["123","123"]
        §+   --  ²concatenate the results of the following two functions
          ḣ  --     prefixes                                              ["","1","12","123"]
           ṫ --     suffixes                                              ["123","23","3",""]
              -- inner concatenation                                      ["","1","13","123","123","23","3",""]
              -- outer concatenation                                      ["123","123","","1","13","123","123","23","3",""]
  t           -- all but the first element                                ["123","","1","13","123","123","23","3",""]
ṁ             -- map then sum
 i            --   convert to integer (where "" converts to 0)


4

Pythonの385の 70バイト

f=lambda n,r=1,i=int:n[r:]and i(n[r:])+i(n[:r])+f(n,r+1)+i(n)or i(n)*2

入力12345の場合:

入力1 + 2345 + 12345、12 + 345 + 12345、123 + 45 + 12345、1234 + 5 + 12345のスライスを合計します。整数にキャストする前に、インデックス(r)= 1,2,3,4への文字列インデックスを使用、および12345 * 2に追加

特別な感謝:

-14バイト@ジョナサンアレン

-1バイト@ovs

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


TIOが間違ったコードにリンクしています。(len(n)+1)にゴルフできます-~len(n)~xis -1-x)、それからを使用して別のバイトを保存できます-i(n)*~len(n)。その後、すべてを匿名関数にすることができます:lambda n,i=int:sum(i(n[:r])+i(n[r:])for r in range(1,len(n)))-i(n)*~len(n)(74バイト)
ジョナサンアラン

その関数を71バイトでさらに再帰的にする:f=lambda n,r=1,i=int:n[r:]and i(n[r:])+i(n[:r])+f(n,r+1)or-i(n)*~len(n)
ジョナサンアラン


あなたのTIOリンクを修正しました。
氏Xcoder

3

Japt15 11バイト

@Shaggyのおかげで-4バイト。

¬£iYç
cUz)x

入力を文字列として受け取ります。

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

説明

£

入力配列を数字(¬)に分割し£、次の関数()でマッピングします(Yはインデックスです)。
["1", "2", "3"]

iYç

先頭にYスペース(ç)が挿入された(i)の入力値(暗黙)。これはに割り当てられUます。
["123", " 123", " 123"]

cUz1)x

それを右に90度回転(1時間)して連結します。次に合計(x)。
["123", " 123", " 123", " 1", " 12", "123", "23 ", "1 "]-> 531


まさに私がそれをやろうとしていたが、何らかの理由でそこに着くことができなかった-うまくやった:)ここに13バイトのバージョンがあります。
シャギー


@Shaggy Awesome、スペースを各行の先頭に追加する短い方法が必要だと思いました。ありがとう!
ジャスティンマリナー

3

Japt31 18バイト

@ETHproductionsのおかげで-13バイト

このアプローチは、Japtを使用するとうまく機能しません。ジャスティンのソリューションははるかに優れています。

[U*Ål U¬£tYÃUå+]xx

説明:

[U*Ål U¬£tYÃUå+]xx
[              ]    // Create a new array
 U*Ål               // Push: Input * Input.slice(1).length()
                    // Push:
      U¬            //   Input, split into chars
        £tY         //   Map; At each char: .substr(Index)
            Uå+     // Push: Cumulative reduce Input; with addition
                xx  // Sum all the items, twice

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


3
それだけですUl 。:P
ETHproductions

うーん... U関数のsはどちらも必要ありません。配列の中央の項目はに圧縮できUå+ xます。これにより、23バイトになります。
ETHproductions

@ETHproductionsありがとう!配列項目を再配置することで、もう1バイト取得しました。
オリバー

あなたは変更することができますmx xxx?:-)
ETHproductions

@ETHproductions確かにできます、もう一度ありがとう:)
オリバー

2

ルビー61 55 + 1 = 56バイト

-nフラグを使用します。STDINからの入力。

p (1..~/$/).sum{|i|[$_[i,~/$/],$_[0,i],$_].sum &:to_i}

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


入力の場合、正しい値がの間に102033プログラムが印刷されます。728714729702

いやいや!OCTAL REPRESENTATIONSを呪う!(brbの修正、02033問題だった)
バリューインク

8進数が問題だと思っていましたが、確信がありませんでした(ところで、ルビーはわかりません)。明確にしてくれてありがとう:)

@ThePirateBay問題ありません。私はすでに文字列入力を使用するより短い代替ソリューションに取り組んでおり、必要な修正を加えても実際にバイトを保存することになりました:)
Value Ink

2

JavaScript、77 74バイト

Value Inkのおかげで3バイト節約

f=a=>[...a+a].map((_,b)=>a-=-z.substr((b-=n)>0?b:0,b+n),a*=n=(z=a).length)|a

console.log(f('123'));
console.log(f('101'));
console.log(f('12'));
console.log(f('1234567'));
console.log(f('102033'));


1

Pyth20 19バイト

私の現在のプレフィックスアプローチ(できればゴルフをさらに進めます)。

+*tlQsQssM+_M.__Q._

スイートをテストする、同じバイト数で別のアプローチを試してください

説明

+*tlQsQssM+_M.__Q._  - Full program that reads a String from STDIN, with implicit input.

  tlQ                - Length of the input - 1.
     sQ              - The input converted to an integer.
 *                   - Product of the above two elements. We will call this P.
                 ._  - Prefixes of the input.
          +          - Concatenated with:
           _M.__Q    - The prefixes of the reversed input, reversed.
        sM           - Convert each to an integer.
       s             - Sum.
+                    - Addition of the product P and the sum above.

概念をよりよく理解するために、例を挙げましょう"123"

  • 最初に入力のプレフィックスを取得します。それらは['1', '12', '123']

  • 次に、反転した入力のプレフィックスを取得します。つまり['3', '32', '321']、それぞれを反転し、したがってを取得し['3', '23', '123']ます。

  • 2つのリストを連結し、各要素を整数に変換するため、を取得し[3, 23, 123, 1, 12, 123]ます。

  • リストを合計すると、結果はになり285ます。

  • Pは、入力の長さ-1(つまり2)に整数表現()を掛けたもの2 * 123 = 246です。

  • 最後に、2つの結果を合計します。285 + 246したがって531、正しい結果であるを取得します。


Pyth、20バイト

+*hlQsQsm+s>Qds<QdtU

テストスイート。

説明

さらにゴルフをした後に来る説明。今のところ、これ以上ゴルフに成功しませんでした(アイデアはあります)。

+*hlQsQsm+s>Qds<QdtUQ  - Full program. Reads from STDIN. Q means input, and is implicit at the end.

  hlQ                  - Length of the input + 1.
     sQ                - The input converted to an integer.
 *                     - Multiply the above. We'll call the result P.
        m         tUQ  - Map over [1...length of the input)
          s>Qd         - input[currentItem:] casted to an integer.
              s<Qd     - input[:currentItem] casted to an integer.
         +             - Sum the above.
       s               - Sum the list.
+                      - Add the sum of the list and P.

1

q / kdb +、34バイト

解決:

{sum"J"$((c#c),c-(!)2*c:(#)x)#\:x}

例:

q){sum"J"$((c#c),c-(!)2*c:(#)x)#\:x}"1234567"
10288049
q){sum"J"$((c#c),c-(!)2*c:(#)x)#\:x}"123"    
531
q){sum"J"$((c#c),c-(!)2*c:(#)x)#\:x}"101"    
417
q){sum"J"$((c#c),c-(!)2*c:(#)x)#\:x}"12"     
39

説明:

{sum"J"$((c#c),c-til 2*c:count x)#\:x} / ungolfed
{                                    } / lambda function
                                    x  / implicit input
                                 #\:   / apply take (#) to each-left element with the right element
        (                       )      / the left element
                       c:count x       / count length and save in variable c
                     2*                / multiply by 2 (e.g. 6)
                 til                   / range, so 0 1 2 3 4 5
               c-                      / vector subtraction, so 3 2 1 0 -1 -2
         (   )                         / do this together
          c#c                          / 3 take 3, so 3 3 3
              ,                        / join, so 3 3 3 3 2 1 0 - 1 -2          
    "J"$                               / cast this "123", "123", "123" .. "23" to longs
 sum                                   / sum them up and return result


1

Swift 3、213バイト

func f(n:String){print((n.characters.count-1)*Int(n)!+(0..<n.characters.count).map{r in Int(n[n.index(n.startIndex,offsetBy:r)..<n.endIndex])!+Int(n[n.startIndex..<n.index(n.endIndex,offsetBy:-r)])!}.reduce(0,+))}

低速でタイムアウトになるため、オンラインでテストできません。テストする場合は、Swift Playgroundsで試すことができます。

サンプル実行

入力:

f(n: "123")
f(n: "101")
f(n: "1234567")

出力:

531
417
10288049

1

ゼリー、12バイト

LḶṚ⁶ẋ;€µ;ZVS

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

入力を文字列として受け取ります。「平行四辺形」を文字のマトリックスとして作成し、各行と列を評価して合計する数値を取得します。

説明

LḶṚ⁶ẋ;€µ;ZVS  Input: string S
L             Length
 Ḷ            Lowered range - [0, 1, ..., len(S)-1]
  Ṛ           Reverse
   ⁶          The char ' ' (space)
    ẋ         Create that many characters of each in the range
     ;€       Prepend each to S
       µ      Begin a new monadic chain
        ;     Concatenate with
         Z    Transpose
          V   Eval each string
           S  Sum

1

C(gcc)95 8481バイト(78 + -lmコンパイラフラグ)

こんにちは!これは私の最初の提出です、私は規則を破らなかったことを望みます。

g,o,l;f(char*s){l=atoi(s);while(s[o++])g+=l/pow(10,o)+atoi(s+o);return g+l*o;}

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

警告なしのゴルフなし:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int g,o,l;

int f(char *s){
  l = atoi(s);

  while(s[o++]) {
    g+=l/pow(10,o)+atoi(s+o);
  }

  return g+l*o;
}

int main(void){
  printf("%d\n",f("1234567"));
  return 0;
}

私には有効に見える:)
Okx

うーん、-lm数学関数の場合は、などの一部の Cランタイムでのみ必要ですglibc。たとえばMinGWを使用して(Microsoftを使用してmsvcrt.dll)コンパイルする場合、必要ありません。ここに追加する必要があるかわかりませんか?とにかく、あればあなたはそれを追加し、それが3バイトになるだろう;)
フェリックスPalmen

残念ながら、gcc -lmを使用したpow()関数には必要です。私はそれなしで仕事をしようとしましたが、6バイト未満(pow +コンパイラフラグ)を使用してソリューションを見つけることができませんでした。バイトカウントにフラグを含める方法に関するルールを見つけることができませんでした-。また、文字がカウントされていないという誤った仮定をしたことを知っています。今、+ 1バイトを追加しています。
スコチネット

-lm必須ではありませんが、メインライブラリに数学関数が含まれgccglibcいないためです。msvcrt.dllそのため、を使用gccせずに動作するウィンドウでコンパイルします-lm。これはちょっとした選択であり、これに関するルールが実際に何を言っているのか、私には完全にはわかりません。
フェリックスパルメン

アップ:)私はあなたの提案とTiOを試すことができないんだヘッドのおかげで、残念ながら、どちらかその可能性を提供していないようだ
scottinet

1

ジャワ8、147の 137 126 116 114バイト

n->{Integer l=(n+"").length(),r=n*l,i=0;for(;++i<l*2;)r+=l.valueOf((n+"").substring(i>l?i-l:0,i<l?i:l));return r;}

-13バイト(137→126および116→114)@OlivierGrégoireのおかげです

説明:

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

n->{                          // Method with integer as parameter and return-type
  Integer l=(n+"").length(),  //  Length of the input integer
      r=n*l,                  //  Result-integer (starting at `n*l`)
      i=0;                    //  Index-integer (starting at 0)
  for(;++i<l*2;               //  Loop from 0 through two times `l` (exclusive)
    r+=                       //   Add to the result-integer sum:
       l.valueOf((n+"").substring(
                              //    Substring of input, converted to integer:
        i>l?                  //     If `i` is larger than `l`:
         i-l                  //      Substring starting at `i-l`
        :                     //     Else:
         0,                   //      Substring starting at 0
        i<l?                  //     If `i` is smaller than `l`:
         i                    //      Substring ending at `i` (exclusive)
        :                     //     Else:
         l)                   //      Substring ending at `l` (exclusive)
  );                          //  End of loop
  return r;                   //  Return resulting sum
}                             // End of method

1
114バイト:n->{Integer l=(n+"").length(),s=n*l,i=0;for(;++i<l*2;)s+=l.valueOf((n+"").substring(l<i?i-l:0,i<l?i:l));return s;}。それは高価に呼び出しの数を減らすために最小-最大でスライディングウィンドウだnew Integer(....substring(...))
オリヴィエ・グレゴワール

1
おかげで、さらに変更することにより、いくつかのより短縮することができますOlivierGrégoireは@ Math.max(0,i-l)0>i-l?0:i-lしてMath.min(i,l)までi>l?l:i。今すぐ変更します。ああ、126バイトの回答をコピーした後、コメントを編集したことがわかります。;)
ケビンクルーイッセン

ええ、編集して申し訳ありませんが、私はそれを確認していませんでした;)
オリビエグレゴワール

1

R168 162 103バイト

c()を使用しない場合は-6バイト

@Giuseppeのおかげで-59バイト

function(n){k=nchar(n)
a=k*strtoi(n)
for(i in 1:k)for(j in i:k)a=a+(i==1|j==k)*strtoi(substr(n,i,j))
a}

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

入力を文字列として受け取ります。

主にRの強みを活用することで改善が行われることは絶対に確信しています...しかし、基本的にストリングマニピュレーションである課題では、私はどのように見るのに苦労しています。

編集:悪いアイデアを繰り返していないので、はるかに良いです!



@ジュゼッペああありがとう!整数入力を使用していたときから無駄なスペースがたくさんありました。私はstrtoi(substr())の方法が好きで、(a | b)のトリックは私が持っていたよりもずっと賢いです。改善してくれてありがとう!この時点ではほとんど別の答えです...
CriminallyVulgar

それは、別のアプローチが追加されたときに起こります!ループを自分で理解することはできませんでしたがsubstr、数バイトを節約するループの代わりに、明示的にインデックスを構築できるかもしれません。
ジュゼッペ


0

Mathematica、77バイト

(s=IntegerDigits@#;t=Length@s;Tr[FromDigits/@Table[s~Take~i,{i,-t,t}]]+t#-#)&
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.