Паралелограма число


18

Тепер, коли ми знаємо, як правильно квадрат і трикутник число, ми навчимося паралелограм один. Щоб паралелограм був числом, ми спочатку упорядковуємо його як паралелограм, розміщуючи його поверх себе в кілька разів, рівний кількості цифр, який він має, і додаючи пробіли, щоб зробити його паралелограмом. Так 123формується:

   123
  123
 123

Тепер беремо кожне горизонтальне та вертикальне число і додаємо їх 123+123+123+1+12+123+23+3, що дорівнює 531, що є паралелограмом 123.

Ваше завдання:

Напишіть програму або функцію, яка, коли дається число як вхідне, повертає паралелограм числа.

Вхід:

Невід'ємне ціле чи невід'ємне ціле число, представлене рядком.

Вихід:

Паралелограм цілого числа.

Випробування:

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

Оцінка:

Це , найнижчий бал у виграшах байтів!



Відповіді:


9

MATL , 12 байт

tnEXyPY+c!Us

Введення - це рядок. Спробуйте в Інтернеті!

Пояснення

Розглянемо вклад '123'як приклад.

Код дублює вхід ( t) і створює матрицю ідентичності ( Xy) розміром, що вдвічі перевищує вхідну довжину ( 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+) вищезазначеного вектора та матриці дає

 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, з char 0 представленою як пробіл:

     123
    123 
   123  
  123   
 123    
123

Transposition ( !) перетворює це на

     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

Спробуйте в Інтернеті!Посилання включає тестові випадки. Пояснення: Перший етап розділяє вхідне число на кожну цифру і включає всі ексклюзивні префікси та включні суфікси, надаючи вертикальні числа, а також оригінальне число введення, повторене для кожної цифри, даючи горизонтальні числа. Решта етапів потім просто підсумовують отримані числа.


6

05AB1E ,  12 11  8 байт

Я впевнений, що це знав може бути додатково гольф - поради ласкаво просимо!

-1 байт завдяки Еріку Атгольферу (уникайте обгортань, але використовуючи конкатенацію),
а потім ... ще
3 байти завдяки Аднану (уникайте множення на довжину-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+
Ерік Вихідник

1
.s¹η++Oαповинен працювати на 8 байт
Аднан

Дякую @EriktheOutgolfer, два обгортання мені здалися дивними!
Джонатан Аллан

@Adnan - це дуже солодко!
Джонатан Аллан

@JonathanAllan "Поради ласкаво просимо!" не впевнений, чи отримаєте ви більше…
Erik the 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

Пітон 3 , 85 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 байт @Jonathan Allen

-1 байт @ovs

Спробуйте в Інтернеті!


TIO посилається на неправильний код. (len(n)+1)можна пограти в гольф до -~len(n)( ~xє -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

Japt , 15 11 байт

-4 байти завдяки @Shaggy.

¬£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

Japt , 31 18 байт

-13 байт завдяки @ETHproductions

Цей підхід не працює добре, використовуючи 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функцій, і середній елемент масиву може бути скорочений Uå+ x, що, на мою думку, зводить вас до 23 байт.
ETHproductions

@ETHproductions Дякую! Я отримав його ще на один байт, переставляючи елементи масиву.
Олівер

Ви можете змінити , mx xщоб xx? :-)
ETHproductions

@ETHproductions Я точно можу, ще раз дякую :)
Олівер

2

Рубін , 61 55 + 1 = 56 байт

Використовує -nпрапор. Вхід від STDIN.

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

Спробуйте в Інтернеті!


Для введення 102033програма виводить друк 728714під час правильного значення 729702.

NOOOO! КУРСУЙТЕ ВАС ОКТАЛЬНІ ПРЕДСТАВКИ! (Виправлення brb, 02033було проблемою)
Value Ink

Я вважав, що проблема є восьмеричними номерами, але я не був у цьому впевнений (btw, не знаю рубіну). Дякую за уточнення :)

@ThePirateBay немає проблем; Я вже працював над більш коротким альтернативним рішенням, яке вимагало введення рядків, і навіть з необхідними виправленнями я все-таки закінчився збереженням байтів :)
Value Ink

2

JavaScript, 77 74 байт

Збережено 3 байти завдяки Ink 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'));


1

Pyth , 20 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'] .

  • Ми об'єднуємо два списки і перетворюємо кожен елемент у ціле число, тому отримуємо [3, 23, 123, 1, 12, 123] .

  • Підсумовуючи список, результат є 285 .

  • Товар P- довжина вводу - 1 (тобто2 ), помножена на ціле представлення його (2 * 123 = 246 ).

  • Зрештою, ми підсумовуємо два результати: 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

Швидкий 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 байти;)
Фелікс Палмен

На жаль, -lmпотрібна для pow()функції з gcc. Я намагався працювати без цього, але не зміг знайти рішення, використовуючи менше 6 байт (pow + прапор компілятора). Я не міг знайти правил щодо того, як включити прапори до облікового запису, і я знаю, розумію, що я зробив помилкове припущення про те, що -персонаж не рахується. Я зараз додаю +1 байт.
scottinet

-lmвимагає не gccтой факт, що glibcне включає математичні функції в основній бібліотеці. msvcrt.dllробить, тому компілювання на Windows з gccроботами без -lm. Це неприборкання, і я не зовсім впевнений, які правила щодо цього насправді мають говорити.
Фелікс Палмен

Дякую за голову :) Я не можу спробувати вашу пропозицію, і Тіо, здається, не пропонує такої можливості, на жаль
scottinet

1

Java 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

R , 168 162 103 байт

-6 байт, не використовуючи c ()

-59 байт завдяки @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}

Спробуйте в Інтернеті!

Вводиться як рядок.

Я абсолютно впевнений, що слід вдосконалити, в першу чергу для використання будь-яких сильних сторін R ... але в проблемі, яка в основному є маніпуванням, я намагаюся зрозуміти, як це зробити.

Редагувати: Набагато краще зараз, коли я не повторюю погану ідею!



@Giuseppe А, дякую! Це було багато витраченого простору, коли я ще використовував цілий вхід. Мені подобається спосіб strtoi (substr ()), а трюк (a | b) набагато розумніший, ніж я. Дякуємо за покращення! Це майже інша відповідь на даний момент ...
Кримінально-

Це трапляється, коли ви додаєте інший підхід! Я сам не міг розібратися в циклі, але думаю, що ви, можливо, зможете побудувати індекси для substrявного замість циклічного циклу, що дозволить заощадити кілька байт.
Джузеппе


0

Математика, 77 байт

(s=IntegerDigits@#;t=Length@s;Tr[FromDigits/@Table[s~Take~i,{i,-t,t}]]+t#-#)&
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.