Hình bình hành một số


18

Bây giờ chúng ta đã biết làm thế nào để vuôngtam giác một số chính xác, chúng ta sẽ tìm hiểu làm thế nào để hình bình hành một. Để hình bình hành một số, trước tiên chúng ta sắp xếp nó thành hình bình hành bằng cách xếp nó lên trên một số lần bằng số chữ số của nó và thêm khoảng trắng để biến nó thành hình bình hành. Vì vậy, 123sẽ hình thành:

   123
  123
 123

Bây giờ chúng ta lấy mỗi số ngang và dọc và thêm chúng, 123+123+123+1+12+123+23+3bằng 531, là hình bình hành của 123.

Nhiệm vụ của bạn:

Viết chương trình hoặc hàm, khi được cung cấp một số làm đầu vào, trả về hình bình hành của số đó.

Đầu vào:

Một số nguyên không âm hoặc một số nguyên không âm được biểu thị bằng một chuỗi.

Đầu ra:

Hình bình hành của số nguyên.

Các trường hợp thử nghiệm:

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

Ghi điểm:

Đây là , điểm số thấp nhất tính bằng byte!



Tại sao các downvote?
Gryphon - Phục hồi Monica

Câu trả lời:


9

MATL , 12 byte

tnEXyPY+c!Us

Đầu vào là một chuỗi. Hãy thử trực tuyến!

Giải trình

Hãy xem xét đầu vào '123'là một ví dụ.

Mã này nhân đôi đầu vào ( t) và xây dựng ma trận nhận dạng ( Xy) có kích thước gấp đôi chiều dài đầu vào ( 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

sau đó lật ngược nó lại ( 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

Chuỗi đầu vào, được hiểu là mã ASCII của các chữ số, tương đương với vectơ hàng số

49 50 51

Tích chập hai chiều kích thước đầy đủ ( Y+) của vectơ và ma trận trên cho

 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

Giải thích các số đó trở lại dưới dạng mã ASCII ( c) đưa ra ma trận char sau, với char 0 được biểu thị dưới dạng khoảng trắng:

     123
    123 
   123  
  123   
 123    
123

Transpose ( !) biến đổi điều này thành

     1
    12
   123
  123 
 123  
123   
23    
3     

Giải thích mỗi hàng dưới dạng một số ( U) cho vectơ cột số

  1
 12
123
123
123
123
 23
  3

và tổng hợp nó ( s) cho kết quả cuối cùng , 531.


1
Tôi ngửi thấy ... chập chững
Adnan

1
@Ad Nam còn gì nữa không? :-D
Luis Mendo

6

Võng mạc , 22 byte

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

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Giải thích: Giai đoạn đầu tiên phân chia số đầu vào ở mỗi chữ số và bao gồm tất cả các tiền tố độc quyền và hậu tố bao gồm, đưa ra các số dọc, cộng với số đầu vào ban đầu được lặp lại cho mỗi chữ số, đưa ra các số nằm ngang. Các giai đoạn còn lại sau đó chỉ đơn giản là tổng các số kết quả.


6

05AB1E ,  12 11  8 byte

Tôi chắc chắn biết điều này thể được đánh gôn hơn nữa - lời khuyên chào mừng!

-1 byte nhờ vào Erik the Outgolfer (tránh kết thúc tốt đẹp nhưng sử dụng phép nối)
và sau đó ...
-3 byte nữa nhờ Adnan (tránh nhân với độ dài-1 bằng cách thêm vào và trừ đi đầu vào ở cuối)

.s¹η++Oα

Hãy thử trực tuyến!

Làm sao?

.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

Bạn có thể sử dụng «để ghép các hậu tố và các tiền tố:g<*¹.s¹η«O+
Erik the Outgolfer

1
.s¹η++Oαnên hoạt động với 8 byte
Adnan

Cảm ơn @EriktheOutgolfer hai kết thúc tốt đẹp đối với tôi!
Jonathan Allan

@Ad Nam - Thật là ngọt ngào!
Jonathan Allan

@Jonathan ALLan "lời khuyên chào mừng!" không chắc chắn liệu bạn có nhận được nữa không ...
Erik the Outgolfer


4

Husk , 13 12 byte

ṁit§+SRL§+ḣṫ

Hãy thử trực tuyến!

Giải trình

              -- 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 3 , 85 70 byte

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

Đối với đầu vào 12345:

Tổng hợp các lát đầu vào 1 + 2345 + 12345, 12 + 345 + 12345, 123 + 45 + 12345, 1234 + 5 + 12345, bằng cách sử dụng lập chỉ mục chuỗi thành chỉ mục (r) = 1,2,3,4 trước khi truyền sang số nguyên và thêm vào 12345 * 2

Trân trọng cảm ơn:

-14 Byte @Jonathan Allen

-1 Byte @ovs

Hãy thử trực tuyến!


TIO liên kết đến mã sai. (len(n)+1)có thể được chơi thành -~len(n)( ~xis -1-x), và sau đó có thể lưu một byte khác bằng cách sử dụng -i(n)*~len(n). Sau đó, bạn có thể biến tất cả thành một hàm ẩn danh: 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

Thậm chí tốt hơn làm cho hàm đó đệ quy cho 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


Tôi đã sửa liên kết tio của bạn.
Ông Xcoder

3

Japt , 15 11 byte

-4 byte nhờ @Shaggy.

¬£iYç
cUz)x

Lấy đầu vào dưới dạng chuỗi.

Hãy thử trực tuyến!

Giải trình

£

Tách mảng đầu vào thành chữ số ( ¬) và ánh xạ bởi ( £) hàm sau, trong đó Y là chỉ mục.
["1", "2", "3"]

iYç

Giá trị đầu vào (ẩn) với Ykhoảng trắng ( ç) được chèn ( i) ở đầu. Điều này được gán cho U.
["123", " 123", " 123"]

cUz1)x

Ghép nối với chính nó xoay 90 ° đúng ( 1thời gian). Sau đó tổng ( x).
["123", " 123", " 123", " 1", " 12", "123", "23 ", "1 "]-> 531.


Chính xác là tôi đã cố gắng thực hiện nó như thế nào, nhưng tôi không thể đến đó, vì một số lý do - hoàn thành tốt :) Đây là phiên bản 13 byte .
Xù xì


@Shaggy Tuyệt vời, tôi biết rằng phải có một cách ngắn hơn để thêm vào khoảng trống cho mỗi dòng. Cảm ơn!
Justin Mariner

3

Japt , 31 18 byte

-13 byte nhờ @ETHproductions

Cách tiếp cận này không hoạt động tốt khi sử dụng Japt. Giải pháp của Justin tốt hơn nhiều.

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

Giải trình:

[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

Hãy thử trực tuyến!


3
Vậy đó, tôi đang thêm một lối tắt cho Ul : P
Sản phẩm ETH

Hmm ... bạn không cần một trong các Us trong các hàm và mục giữa trong mảng có thể được cô đọng lại Uå+ x, điều mà tôi nghĩ sẽ khiến bạn giảm xuống còn 23 byte.
Sản phẩm ETH

@ETHproductions Cảm ơn! Tôi đã lấy nó xuống một byte khác bằng cách sắp xếp lại các mục mảng.
Oliver

Bạn có thể đổi mx xthành xx? :-)
Sản phẩm ETH

@ETHproductions Tôi chắc chắn có thể, cảm ơn một lần nữa :)
Oliver

2

Ruby , 61 55 + 1 = 56 byte

Sử dụng -ncờ. Đầu vào từ STDIN.

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

Hãy thử trực tuyến!


Đối với đầu vào 102033chương trình của bạn in 728714trong khi giá trị chính xác là 729702.

KHÔNG! HIỆN TẠI ĐẠI DIỆN THÁNG 10! (sửa lỗi brb, 02033là vấn đề)
Ink Ink

Tôi cho rằng số bát phân là vấn đề, nhưng tôi không chắc (btw tôi không biết ruby). Cảm ơn đã làm rõ :)

@ThePirateBay không có vấn đề gì; Tôi đã làm việc với một giải pháp thay thế ngắn hơn, lấy đầu vào chuỗi và thậm chí với các bản sửa lỗi cần thiết, tôi thực sự đã kết thúc việc lưu byte bằng mọi cách :)
Ink Ink

2

JavaScript, 77 74 byte

Đã lưu 3 byte nhờ vào Ink 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'));


1

Bình thường , 20 19 byte

Cách tiếp cận tiền tố hiện tại của tôi (hy vọng sẽ chơi gôn hơn nữa).

+*tlQsQssM+_M.__Q._

Test Suite hoặc thử một cách tiếp cận khác với cùng số byte .

Giải trình

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

Để hiểu khái niệm tốt hơn, chúng ta sẽ lấy một ví dụ, nói "123".

  • Đầu tiên chúng ta nhận được các tiền tố của đầu vào. Đó là những ['1', '12', '123'].

  • Sau đó, chúng tôi nhận được các tiền tố của đầu vào đảo ngược, nghĩa là: ['3', '32', '321']và đảo ngược từng tiền tố , do đó chúng tôi nhận được ['3', '23', '123'].

  • Chúng tôi nối hai danh sách và chuyển đổi từng phần tử thành một số nguyên, do đó chúng tôi có được [3, 23, 123, 1, 12, 123].

  • Bằng cách tổng hợp danh sách, kết quả là 285.

  • Sản phẩm Plà độ dài của đầu vào - 1 (tức là 2) nhân với biểu diễn số nguyên của nó ( 2 * 123 = 246).

  • Cuối cùng, chúng tôi tổng hợp hai kết quả : 285 + 246, do đó chúng tôi có được 531, đó là kết quả chính xác.


Bình thường , 20 byte

+*hlQsQsm+s>Qds<QdtU

Phòng thử nghiệm.

Giải trình

Giải thích để đến sau khi chơi golf. Bây giờ tôi đã không thành công để chơi golf này (tôi có ý tưởng).

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

Giải pháp:

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

Ví dụ:

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

Giải trình:

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

Không thể được kiểm tra trực tuyến, vì nó chậm và hết thời gian. Bạn có thể dùng thử trong Swift Playgrounds nếu bạn muốn thử nghiệm nó.

Chạy mẫu

Đầu vào:

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

Đầu ra:

531
417
10288049

1

Thạch , 12 byte

LḶṚ⁶ẋ;€µ;ZVS

Hãy thử trực tuyến!

Đưa đầu vào dưới dạng một chuỗi. Tạo "hình bình hành" dưới dạng ma trận các ký tự, sau đó đánh giá từng hàng và cột để lấy các số tổng.

Giải trình

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 byte ( -lmcờ biên dịch 78 + )

Chào! Đây là lần gửi đầu tiên của tôi, tôi hy vọng tôi đã không phá vỡ bất kỳ quy tắc nào.

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

Hãy thử trực tuyến!

Ungolfed, không có cảnh bá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;
}

Có vẻ hợp lệ với tôi :)
Okx

Hmm, -lmđối với các hàm toán học chỉ cần thiết cho một số thời gian chạy C như vd glibc. Biên dịch ví dụ với MinGW (sử dụng Microsoft msvcrt.dll), sẽ không cần thiết. Vì vậy, không chắc chắn nó được yêu cầu để thêm ở đây? Dù sao, nếu bạn thêm nó, nó sẽ tạo ra 3 byte;)
Felix Palmen

Thật không may, -lmlà cần thiết cho pow()chức năng với gcc. Tôi đã cố gắng làm việc mà không có nó nhưng không thể tìm ra giải pháp sử dụng ít hơn 6 byte (pow + cờ trình biên dịch). Tôi không thể tìm thấy các quy tắc về cách đưa cờ vào bytecount và tôi biết rằng tôi đã đưa ra một giả định sai về -nhân vật không được tính. Tôi đang thêm một byte +1 ngay bây giờ.
scottinet

-lmkhông được yêu cầu bởi gccnhưng thực tế là glibckhông bao gồm các hàm toán học trong thư viện chính. msvcrt.dllkhông, vì vậy biên dịch trên các cửa sổ với gcccác tác phẩm mà không có -lm. Đây là nitpicking và tôi không hoàn toàn chắc chắn các quy tắc về điều này thực sự phải nói gì.
Felix Palmen

Cảm ơn vì đã ngẩng cao lên :) Tôi không thể thử đề xuất của bạn và tio dường như cũng không cung cấp khả năng đó, thật không may
scottinet

1

Java 8, 147 137 126 116 114 byte

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 và 116 → 114) nhờ @ OlivierGrégoire .

Giải trình:

Hãy thử nó ở đây.

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 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;}. Đó là một cửa sổ trượt với tối thiểu để giảm số lượng cuộc gọi đến đắt tiềnnew Integer(....substring(...))
Olivier Grégoire

1
@ OlivierGrégoire Cảm ơn, và thậm chí có thể rút ngắn thêm một số bằng cách thay đổi Math.max(0,i-l)thành 0>i-l?0:i-lMath.min(i,l)sang i>l?l:i. Sửa đổi nó ngay bây giờ. Ah, tôi thấy bạn đã chỉnh sửa nhận xét của mình sau khi tôi đã sao chép câu trả lời 126 byte. ;)
Kevin Cruijssen

Vâng, xin lỗi vì đã chỉnh sửa, nhưng tôi đã không kiểm tra điều đó;)
Olivier Grégoire

1

R , 168 162 103 byte

-6 byte bằng cách không sử dụng c ()

-59 byte nhờ @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}

Hãy thử trực tuyến!

Đưa đầu vào dưới dạng một chuỗi.

Tôi hoàn toàn chắc chắn có những cải tiến cần thực hiện, chủ yếu là tận dụng bất kỳ thế mạnh nào của R ... nhưng trong một thách thức về cơ bản là thao tác chuỗi, tôi đang cố gắng xem làm thế nào.

Chỉnh sửa: Tốt hơn nhiều bây giờ khi tôi không lặp lại một ý tưởng tồi!



@Giuseppe À cảm ơn! Đó là rất nhiều không gian lãng phí từ khi tôi vẫn đang sử dụng một đầu vào số nguyên. Tôi thích cách strtoi (chất nền ()) và thủ thuật (a | b) thông minh hơn tôi đã có. Cảm ơn những cải tiến! Đây gần như là một câu trả lời khác nhau ...
CriminallyVulgar

Điều đó xảy ra khi bạn có thêm một cách tiếp cận! Tôi không thể tự mình tìm ra các vòng lặp, nhưng tôi nghĩ rằng bạn có thể xây dựng các chỉ số substrmột cách rõ ràng thay vì lặp, điều này sẽ tiết kiệm một vài byte.
Giuseppe


0

Toán học, 77 byte

(s=IntegerDigits@#;t=Length@s;Tr[FromDigits/@Table[s~Take~i,{i,-t,t}]]+t#-#)&
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.