Parallelogram a Number

18

Sekarang kita tahu bagaimana cara membuat kuadrat dan segitiga dengan benar, kita akan belajar bagaimana cara jajar genjang satu. Untuk jajaran genjang suatu angka, pertama-tama kita mengaturnya sebagai jajaran genjang dengan menumpuknya di atasnya sendiri beberapa kali sama dengan jumlah digit yang dimilikinya, dan menambahkan spasi untuk menjadikannya jajaran genjang. Jadi 123akan membentuk:

   123
  123
 123

Sekarang kita ambil setiap angka horisontal dan vertikal dan menambahkannya 123+123+123+1+12+123+23+3, yang sama dengan 531, yang merupakan jajaran genjang 123.

Tugas Anda:

Tulis program atau fungsi yang, ketika diberi nomor sebagai input, mengembalikan jajaran genjang nomor tersebut.

Memasukkan:

Integer non-negatif, atau integer non-negatif yang diwakili oleh string.

Keluaran:

Paragraf bilangan bulat.

Kasus uji:

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

Mencetak:

Ini adalah , skor terendah dalam bytes menang!

Gryphon - Pasang kembali Monica
sumber
Sandbox Post
Gryphon - Reinstate Monica
Mengapa downvote?
Gryphon - Pasang kembali Monica

Jawaban:

9

MATL , 12 byte

tnEXyPY+c!Us

Input adalah sebuah string. Cobalah online!

Penjelasan

Pertimbangkan input '123'sebagai contoh.

Kode menduplikasi input ( t) dan membangun matriks identitas ( Xy) berukuran dua kali panjang input ( 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

lalu membaliknya terbalik ( 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

String input, ditafsirkan sebagai kode ASCII dari digit, setara dengan vektor baris numerik

49 50 51

Konvolusi dua dimensi ukuran penuh ( Y+) dari vektor dan matriks di atas memberi

 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

Menafsirkan angka-angka itu kembali sebagai kode ASCII ( c) memberikan matriks char berikut, dengan char 0 direpresentasikan sebagai spasi:

     123
    123 
   123  
  123   
 123    
123

Transposisi ( !) mentransformasikannya menjadi

     1
    12
   123
  123 
 123  
123   
23    
3     

Menafsirkan setiap baris sebagai angka ( U) memberikan vektor kolom angka

  1
 12
123
123
123
123
 23
  3

dan menjumlahkannya ( s) memberikan hasil akhir 531,.

Luis Mendo
sumber
1
Saya mencium ... konvolusi
Adnan
1
@ Adnan Apa lagi? :-D
Luis Mendo
6

Retina , 22 byte

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

Cobalah online! Tautan termasuk kasus uji. Penjelasan: Tahap pertama membagi nomor input pada setiap digit dan mencakup semua awalan eksklusif dan akhiran inklusif, memberikan nomor vertikal, ditambah juga nomor input asli yang diulang untuk setiap digit, memberikan angka horizontal. Tahap-tahap selanjutnya hanya menjumlahkan angka yang dihasilkan.

Neil
sumber
6

05AB1E ,  12 11  8 byte

Aku 'm yakin tahu ini bisa bisa golfed lanjut - kiat menyambut!

-1 byte terima kasih kepada Erik the Outgolfer (hindari wraps tetapi gunakan concatenation)
dan kemudian ...
-3 byte lebih banyak berkat Adnan (hindari perkalian dengan panjang-1 dengan menambahkan vektorisasi dan mengurangi input pada akhirnya)

.s¹η++Oα

Cobalah online!

Bagaimana?

.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
Jonathan Allan
sumber
Anda dapat menggunakan «untuk menyatukan sufiks dan awalan:g<*¹.s¹η«O+
Erik the Outgolfer
1
.s¹η++Oαseharusnya bekerja selama 8 byte
Adnan
Terima kasih @EriktheOutgolfer dua bungkus itu memang terasa aneh bagiku!
Jonathan Allan
@ Adnan - cukup manis!
Jonathan Allan
@JonathanAllan "tips, selamat datang!" tidak yakin apakah Anda akan mendapatkannya lagi ...
Erik the Outgolfer
5

Haskell , 90 78 76 71 64 63 59 57 byte

g x=sum[x+div x(10^a)+mod x(10^a)|(a,_)<-zip[1..]$show x]

Cobalah online!

Wisaya Gandum
sumber
g x=sum[x+div x a+mod x a|(a,_)<-zip((10^)<$>[1..])$show x].
nimi
g x=sum[x+div x(10^a)+mod x(10^a)|(a,_)<-zip[1..]$show x]adalah rambut yang lebih pendek lagi.
Lynn
g x=sum[x+x`div`10^a+x`mod`10^a|(a,_)<-zip[1..]$show x].
Laikoni
4

Sekam , 13 12 byte

ṁit§+SRL§+ḣṫ

Cobalah online!

Penjelasan

              -- 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)
H.Piz
sumber
4

Neim , 7 byte

𝐱S𝐗𝔻𝔻𝐬𝕤

Waspadalah. Berisi ular:S𝐬𝕤

Cobalah online!

Okx
sumber
1
" Hati-hati. Berisi ular:S𝐬𝕤 " Lol ..𝐗𝔻
Kevin Cruijssen
4

Python 3 , 85 70 Bytes

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

Untuk input 12345:

Ringkas irisan input 1 + 2345 + 12345, 12 + 345 + 12345, 123 + 45 + 12345, 1234 + 5 + 12345, dengan menggunakan pengindeksan string ke indeks (r) = 1,2,3,4 sebelum casting ke integer , dan menambah 12345 * 2

Terima kasih khusus kepada:

-14 Bytes @ Jonathan Allen

-1 Byte @ovs

Cobalah online!

Conner Johnston
sumber
TIO menghubungkan ke kode yang salah. (len(n)+1)dapat di-golf ke -~len(n)( ~xis -1-x), dan kemudian itu dapat menyimpan byte lain dengan menggunakan -i(n)*~len(n). Kemudian Anda dapat menjadikan semuanya sebagai fungsi anonim: lambda n,i=int:sum(i(n[:r])+i(n[r:])for r in range(1,len(n)))-i(n)*~len(n)(74 byte)
Jonathan Allan
Lebih baik lagi buat fungsi itu rekursif untuk 71 byte: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)
Jonathan Allan
Saya memperbaiki tautan tio Anda.
Tn. Xcoder
3

Japt , 15 11 byte

-4 byte terima kasih kepada @Shaggy.

¬£iYç
cUz)x

Mengambil input sebagai string.

Cobalah online!

Penjelasan

£

Membagi array input ke digit ( ¬) dan memetakan dengan ( £) fungsi berikut, di mana Y adalah indeks.
["1", "2", "3"]

iYç

Nilai input (implisit) dengan Yspasi ( ç) dimasukkan ( i) di awal. Ini ditugaskan untuk U.
["123", " 123", " 123"]

cUz1)x

Menggabungkannya dengan itu sendiri diputar 90 ° kanan ( 1waktu). Lalu jumlah ( x).
["123", " 123", " 123", " 1", " 12", "123", "23 ", "1 "]-> 531.

Justin Mariner
sumber
Persis bagaimana saya mencoba untuk melakukannya, tetapi saya tidak bisa sampai di sana, untuk beberapa alasan - dilakukan dengan baik :) Berikut adalah versi 13 byte .
Shaggy
11 byte
Shaggy
@Shaggy Luar Biasa, saya tahu harus ada cara yang lebih pendek untuk menambahkan spasi pada setiap baris. Terima kasih!
Justin Mariner
3

Japt , 31 18 byte

-13 byte terima kasih kepada @ETHproductions

Pendekatan ini tidak berfungsi dengan baik menggunakan Japt. Solusi Justin jauh lebih baik.

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

Penjelasan:

[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

Cobalah online!

Oliver
sumber
3
Itu saja, saya menambahkan jalan pintas untuk Ul : P
ETHproduksi
Hmm ... Anda tidak perlu salah satu dari Us di fungsi, dan item tengah dalam array dapat diringkas Uå+ x, yang saya pikir membuat Anda turun ke 23 byte.
ETHproduksi
@ ETHproduksi Terima kasih! Saya mendapatkannya byte lain dengan menata ulang item array.
Oliver
Anda dapat mengubah mx xke xx? :-)
ETHproduksi
@ ETHproductions Saya yakin bisa, terima kasih lagi :)
Oliver
2

Ruby , 61 55 + 1 = 56 byte

Menggunakan -nbendera. Masukan dari STDIN.

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

Cobalah online!

Nilai Tinta
sumber
Untuk input, 102033program Anda mencetak 728714ketika nilai yang benar adalah 729702.
Tidaaaak! MEMBUAT ANDA PERWAKILAN OCTAL! (brb fixing, 02033adalah masalahnya)
Value Ink
Saya kira angka oktal adalah masalahnya, tapi saya tidak yakin (btw saya tidak tahu ruby). Terima kasih telah menjelaskan :)
@ThePirateBay tidak masalah; Saya sudah bekerja pada solusi alternatif yang lebih pendek yang mengambil input string, dan bahkan dengan perbaikan yang diperlukan saya benar-benar akhirnya menghemat byte lagi pula :)
Value Ink
2

JavaScript, 77 74 byte

Disimpan 3 byte berkat Value Ink

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


sumber
1

Pyth , 20 19 byte

Pendekatan awalan saya saat ini (semoga akan golf lebih lanjut).

+*tlQsQssM+_M.__Q._

Test Suite atau coba pendekatan alternatif dengan jumlah byte yang sama .

Penjelasan

+*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.

Untuk memahami konsep dengan lebih baik, kita akan mengambil contoh, katakanlah "123".

  • Kami pertama-tama mendapatkan awalan input. Yaitu ['1', '12', '123'].

  • Kemudian, kita mendapatkan awalan dari input terbalik, yaitu: ['3', '32', '321']dan membalikkan masing-masing, maka kita dapatkan ['3', '23', '123'].

  • Kami menggabungkan dua daftar dan mengonversikan setiap elemen ke integer, jadi kami memperolehnya [3, 23, 123, 1, 12, 123].

  • Dengan menjumlahkan daftar, hasilnya adalah 285.

  • Produk Padalah panjang input - 1 (yaitu 2) dikalikan dengan representasi integer-nya ( 2 * 123 = 246).

  • Pada akhirnya, kami menjumlahkan dua hasil 285 + 246:, maka kami memperoleh 531, yang merupakan hasil yang benar.


Pyth , 20 byte

+*hlQsQsm+s>Qds<QdtU

Test Suite.

Penjelasan

Penjelasan yang akan datang setelah bermain golf lebih lanjut. Saya tidak berhasil bermain golf lebih jauh untuk saat ini (saya punya ide).

+*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.
Tuan Xcoder
sumber
1

q / kdb +, 34 byte

Larutan:

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

Contoh:

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

Penjelasan:

{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
streetster
sumber
1

Jelly , 18 byte

DµṚ;\U;;\ṖVS+Ḍ×¥L$

Cobalah online!

Erik the Outgolfer
sumber
1

Swift 3 , 213 byte

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

Tidak dapat diuji secara online, karena lambat dan waktu habis. Anda dapat mencobanya di Swift Playgrounds jika Anda ingin mengujinya.

Contoh dijalankan

Memasukkan:

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

Keluaran:

531
417
10288049
Tuan Xcoder
sumber
1

Jelly , 12 byte

LḶṚ⁶ẋ;€µ;ZVS

Cobalah online!

Mengambil input sebagai string. Membuat "jajaran genjang" sebagai matriks karakter, lalu mengevaluasi setiap baris dan kolom untuk mendapatkan jumlah penjumlahan.

Penjelasan

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
mil
sumber
1

C (gcc) ,95 8481 byte (78 + -lmflag compiler)

Hai! Ini adalah pengiriman pertama saya, saya harap saya tidak melanggar aturan apa pun.

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

Cobalah online!

Tidak disatukan, tanpa peringatan:

#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;
}
scottinet
sumber
Tampak valid untuk saya :)
Okx
Hmm, -lmuntuk fungsi matematika hanya diperlukan untuk beberapa runtime C seperti misalnya glibc. Kompilasi misalnya dengan MinGW (menggunakan Microsoft msvcrt.dll), itu tidak diperlukan. Jadi tidak yakin harus menambahkan di sini? Bagaimanapun, jika Anda menambahkannya, itu akan menghasilkan 3 byte;)
Felix Palmen
Sayangnya, -lmdiperlukan untuk pow()fungsi dengan gcc. Saya mencoba untuk bekerja tanpa itu tetapi tidak dapat menemukan solusi menggunakan kurang dari 6 byte (pow + flag compiler). Saya tidak dapat menemukan aturan tentang cara memasukkan bendera ke dalam bytecount, dan saya tahu menyadari bahwa saya membuat asumsi yang salah tentang -karakter yang tidak dihitung. Saya menambahkan +1 byte sekarang.
scottinet
-lmtidak diperlukan oleh gcctetapi oleh fakta yang glibctidak termasuk fungsi matematika di perpustakaan utama. msvcrt.dlltidak, jadi kompilasi pada windows dengan gcckarya tanpa -lm. Ini adalah nitpicking dan saya tidak sepenuhnya yakin apa aturan tentang ini sebenarnya katakan.
Felix Palmen
Terima kasih atas
sarannya
1

Java 8, 147 137 126 116 114 bytes

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 byte (137 → 126 dan 116 → 114) terima kasih kepada @ OlivierGrégoire .

Penjelasan:

Coba di sini.

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
Kevin Cruijssen
sumber
1
114 byte: 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;}. Ini adalah jendela geser dengan min-max untuk mengurangi jumlah panggilan ke yang mahalnew Integer(....substring(...))
Olivier Grégoire
1
@ OlivierGrégoire Terima kasih, dan bahkan dapat mempersingkat lagi dengan mengubah Math.max(0,i-l)ke 0>i-l?0:i-ldan Math.min(i,l)ke i>l?l:i. Memodifikasi sekarang. Ah, saya melihat Anda telah mengedit komentar Anda setelah saya menyalin jawaban 126 byte. ;)
Kevin Cruijssen
Ya, maaf karena mengedit, tetapi saya belum memeriksanya;)
Olivier Grégoire
1

R , 168 162 103 byte

-6 byte dengan tidak menggunakan c ()

-59 byte terima kasih kepada @Giuseppe

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}

Cobalah online!

Mengambil input sebagai string.

Saya benar-benar yakin ada perbaikan yang harus dilakukan, terutama dalam memanfaatkan salah satu kekuatan R ... tetapi dalam sebuah tantangan yang pada dasarnya memanipulasi string, saya berjuang untuk melihat bagaimana.

Sunting: Jauh lebih baik sekarang karena saya tidak mengulangi ide yang buruk!

Kriminal kriminal
sumber
1
103 byte
Giuseppe
@Giuseppe Ah terima kasih! Itu banyak ruang yang terbuang sejak saya masih menggunakan input integer. Saya suka cara strtoi (substr ()), dan trik (a | b) jauh lebih pintar daripada saya. Terima kasih atas perbaikannya! Ini jawaban yang hampir berbeda pada titik ini ...
CriminallyVulgar
Itu terjadi ketika Anda mendapatkan pendekatan lain ditambahkan! Saya tidak dapat menemukan loop sendiri, tetapi saya pikir Anda mungkin dapat membangun indeks untuk substrsecara eksplisit, bukan perulangan, yang akan menghemat beberapa byte.
Giuseppe
0

Perl 5 , 53 + 1 (-n) = 54 byte

$r=$_*(@n=/./g);for$i(@n){$r+=$_+($t=(chop).$t)}say$r

Cobalah online!

Xcali
sumber
0

Mathematica, 77 byte

(s=IntegerDigits@#;t=Length@s;Tr[FromDigits/@Table[s~Take~i,{i,-t,t}]]+t#-#)&
J42161217
sumber