Підсумовуйте рядки з'єднаного трикутника


16

Розглянемо наступний трикутник.

1
23
456
7891
01112
131415
1617181
92021222
324252627
2829303132
33343536373
839404142434
4454647484950
51525354555657
585960616263646
5666768697071727
37475767778798081

Як ви, напевно, помітили, перший рядок має довжину 1, і кожен наступний рядок на 1 цифру довший, ніж попередній, і що він містить цифри зв'язаних натуральних чисел.

Вам буде дано ціле число N . Ваше завдання - знайти суму цифр, що лежать на N- му ряду вищевказаного трикутника.

Правила

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

Input  |  Output

0  |  1
1  |  5
2  |  15
3  |  25
4  |  5
5  |  15
6  |  25
7  |  20
8  |  33
9  |  33
10 |  43
11 |  46
12 |  64

Зауважте, що вищезазначене є 0-індексованим. Якщо ви шукаєте 1-індексовані тестові випадки, збільште введення на 1.

Нещодавно, я нещодавно змінив свою фотографію профілю, і це надихнуло мене написати це завдання.

Відповіді:



4

Пітон 2 , 69 байт

Це, мабуть, може бути зовсім трохи коротшим.

1-індексований

Редагувати: -7 байт завдяки @ Mr.Xcoder

lambda n:sum(map(int,"".join(map(str,range(1,n*n+1)))[~-n*n/2:][:n]))

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


1
n**2є n*n.
Містер Xcoder

69 байт . Використовуючи формулу Гаусса,sum(range(n)) = ~-n*n/2 = (n - 1) * n / 2
містер Xcoder

1
@ Mr.Xcoder Я думаю, що він робить ...
Ерік Outgolfer

@EriktheOutgolfer Ти маєш рацію, мій поганий
містер Xcoder





2

Желе , 11 байт

²RDFṁRS$ṫCS

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

Використовує індексацію на основі 1.

Пояснення

²RDFṁRS$ṫCS  Input: n
²            Square
 R           Range, [1, n^2]
  D          Decimal digits
   F         Flatten
    ṁ        Reshape to
       $     Monadic chain
     R         Range, [1, n]
      S        Sum
        ṫ    Tail
         C   Complement, 1-n
          S  Sum

2

Haskell, 69 64 байт

n%x=sum[read[d]|d<-take n x]:(n+1)%drop n x
f=(1%(show=<<[1..])!!)

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

Збережено 5 байт завдяки Laikoni !

Ось менш гольф-версія:

-- continuous stream of digits representing
-- the concatenation of positive integers in
-- order: 1234567891011...
digitstream = show=<<[1..]

-- sequence that yields the rows of the triangle
triangle n xs |(a,b)<-splitAt n xs=a:triangle(n+1)b

digitSum xs = sum[read[d]|d<-xs]

-- sequence that sums up the digits in each row
rowSumSequence = map digitSum (triangle 1 digitstream)

-- the final function that just shows the value 
-- at a given index
g=(rowSumSequence!!)

n%x=sum[read[d]|d<-take n x]:(n+1)%drop n xна кілька байт коротше.
Laikoni

@Laikoni Дякую! Відредаговано. Я не знаю, чому я думав, що splitOnце збереже байти.
Крістіан Лупаску

2

R, 119 109 108 93 88 байт

починаючи з гольфу .... 1-індексований

function(n){for(i in 1:n+n*(n-1)/2){F=F+strtoi(substr(paste(1:n^2,collapse=""),i,i))};F}

дякую @Zachary. Ваша презумпція правильна :) поголений 1 байт tnx для @Andrius і ще 15 tnx для @ user2390246

@Giuseppe - tnx для strtoi. нова для мене. 5 байт вниз :)


2
Я не думаю, що вам не потрібні y=ні паролі, ні n*(n-1)/2+1назва мови, мабуть, не так [R].
Zacharý

1
ви можете зберегти 1 байт, змінивши його as.integerнаas.double
AndriusZ

1
Замість цього xвикористовуйте, Fоскільки це вже ініціалізовано до 0.
user2390246

1
Також 1:n+a-1дає те саме, що a:(a+n-1). У цьому випадку не потрібно aзаздалегідь визначатись , ви можете просто поставити це прямо у forвираз. Це також дозволить вам скасувати + 1 / -1.
користувач2390246

2
79 байт . Використовується substringзамість того, що substrнасправді це лише сума над індексами підрядка. Крім того, завжди добре включити TIO-посилання для своїх рішень :) +1, чудова робота.
Джузеппе

2

Emojicode , 182 байт

🐖©a🚂➡🚂🍇🍦l➗✖a➕a 1 2🍮t🔤🔤🍮i 0🔁▶l🐔t🍇🍮➕i 1🍮t🍪t🔡i 10🍪🍉🍮s 0🔂g🔪t➖l a a🍇🍮➕s 🍺🚂🔡g 10🍉🍎s🍉

Визначає метод, який називається ©, який приймає 🚂 і повертає 🚂. 1-індексований.

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

Пояснення:

Примітка: багато варіантів вибору емоджи не має великого сенсу в Emojicode 0.5. Зрештою, це 0.x. 0.6 це виправить, тому, якщо ви хочете дізнатися це (бо хто не хотів би), рекомендую почекати хвилинку.

Emojicode - це об'єктно-орієнтована мова програмування, яка містить дженерики, протоколи, необов’язкові та закриття, але ця програма не використовує закриття, і всі генеричні та протоколи можна вважати неявними.

Програма працює лише на декілька типів: 🚂 цілий тип і 🔡 тип рядка. Додатково 👌 з'являються в умовах, які можуть приймати значення або 👍 (справжнє), або 👎 (помилкове).

Наразі в Emojicode немає операторів, тому додавання, порівняння та інші операції, які зазвичай є операторами, реалізуються як функції, ефективно змушуючи вирази використовувати позначення префікса . Операторів також планується в 0,6.

🐖©a🚂➡🚂🍇

© бере один 🚂 викликаний aі повертає a.

 🍦l➗✖a➕a 1 2

Визначте заморожене ("постійне") lрівне а-му трикутному числу (формула в позначенні префікса). Це означає довжину рядка чисел, які нам потрібно генерувати.

 🍮t🔤🔤

Призначте змінну порожній рядок t.

 🍮i 0

Призначити i = 0.

 🔁▶l🐔t🍇

Тоді lяк більша довжинаt

  🍮➕i 1

i += 1

  🍮t🍪t🔡i 10🍪

Додайте текстове подання iв базі 10 до t.

 🍉

Кінцева петля

 🍮s 0

Призначити s = 0

 🔂g🔪t➖l a a🍇

Візьміть підрядку, tпочинаючи з l - a( a - 1трикутного числа) довжини a, переберіть всі символи

  🍮➕s 🍺🚂🔡g 10

Перетворіть символ у рядок, проаналізуйте ціле число в base-10, розгорніть необов'язковий (нічого не повертається, якщо рядок не є числом) та додайте до sзмінної.

 🍉

Кінцева петля

 🍎s

Повернення s

🍉

Кінцевий метод.




1

APL, 28 26 25 байт

{+/⍎¨⍵↑⌽(+/⍳⍵)↑∊,/⍕¨⍳⍵×⍵}

Використовує індексацію на основі 1

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

Як?

  • ⍳⍵×⍵, 1 через вхідний квадрат
  • ⍕¨, перетворіть кожен елемент у рядок
  • ∊,/, об'єднайте їх разом
  • (+/⍳⍵)↑, візьміть рядки до входу
  • ⍵↑⌽, візьміть потрібний ряд
  • ⍎¨, перетворіть кожен елемент у число
  • +/, сума

1

Clojure v1.8, 154 байти

1-індексований

(fn[n](loop[i 1 s(clojure.string/join""(take(* n n)(iterate inc 1)))](if(= i n)(apply +(map #(Character/digit % 10)(take n s)))(recur(inc i)(subs s i)))))

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

Пояснення

(take(* n n)(iterate inc 1))  Take the first N*N numbers
(clojure.string/join""...)    Combine them into a string
(loop[i 1 ...](if(= i n)...)  Loop N times
(apply +(map #(Character/digit % 10)(take n s)))  Take N characters from the string, convert to integers and add them
(recur(inc i)(subs s i))      Increment iterator, remove i characters from string

1

Java 8, 116 98 байт

n->{String t="";int r=0,i=0;for(;i++<n*n;t+=i);for(i=0;i<n;r+=t.charAt(i+++~-n*n/2)-48);return r;}

1-індексований

-18 байт завдяки @Nevay

Пояснення:

Спробуйте тут.

n->{                             // Method with integer as both parameter and return-type
  String t="";                   //  Triangle-String
  int r=0,                       //  Result-integer
      i=0;                       //  Index-integer
  for(;i++<n*n;                  //  Loop (1) from 0 to `n^2` (exclusive)
    t+=i                         //   And append String `t` with all the numbers
  );                             //  End of loop (1)
  for(i=0;i<n;                   //  Loop (2) from 0 to `n` (exclusive)
    r+=t.charAt(i+++~-n*n/2)-48  //   And raise the sum `r` by the digits
  );                             //  End of loop (2)
  return r;                      //  Return the resulting sum of digits
}                                // End of method

1
98 байт: n->{String r="";int i=0,x=0;for(;x++<n*n;r+=x);for(x=0;x<n;)i+=r.charAt(x+++~-n*n/2)-48;return i;}.
Невай

1

R, 99 , 105 , 97 байт

a=diag(N<-scan());a[upper.tri(a,T)]=strtoi(strsplit(paste(1:N^2,collapse=""),"")[[1]]);sum(a[,N])

1-індексований

безгольована версія

a <- diag(N<-scan())
a[upper.tri(a, diag=TRUE)] <- strtoi(strsplit(paste(1:N^2, 
                                                  collapse=""),
                                            "")[[1]])
sum(a[,N])

Спробуйте тут!

завдяки @Giuseppe за збереження 8 байт


@Giuseppe в описі згадується: "Вам буде дано ціле число N." і цей N використовується в моєму розчині. А може, я щось неправильно зрозумів.
AndriusZ

Дивіться пов'язане "будь-яке стандартне середнє" в описі :)
Джузеппе

@Giuseppe змінив і використав вашу пропозицію щодоstrtoi
AndriusZ

1
97 байт , з попереджувальним повідомленням. Завжди добре включити до свого опису посилання на TIO, щоб інші могли його перевірити!
Джузеппе

@Giuseppe Я не знаю R, але, можливо, функція використовує менше байтів?
NieDzejkob

1

Perl 6 , 44 байти

{[+] (1..*).flatmap(*.comb).rotor(1..*)[$_]}

Перевірте це

Розширено:

{
  [+]        # reduce the result of the following using &infix«+»

  ( 1 .. * ) # infinite range starting at 1

  .flatmap(  # map, then flatten
    *.comb   # split into digits (100 ⇒ 1,0,0)
  )

  .rotor(    # break the sequence into pieces
    1 .. *   # start with 1 value, then 2 values, then 3, etc.
  )\

  [$_]       # index into that infinite sequence
}


0

SOGL V0.12 , 15 13 байт

²Δr∑.δ∑⌡kmčr∑

Спробуйте тут!
1-індексований.

Під час роботи над цим я виправив помилку, яку зробив не працювала над масивами чисел і mнеправильно взяла неявний ввід.

Пояснення:

²              square the input
 Δ             get a range from 1 to that
  r∑           join as a string
    .δ         create a range 0 - input-1
      ∑        sum that
       ⌡       that many times do
        k        remove the 1st character of the joined string
         m     mold to the length of the input
          č    chop into characters
           r∑  convert to numbers and sum

0

C ++, 180 байт

-17 байт завдяки Захарі

Індекс починається з 1

#include<string>
int s(int n){std::string t;int i=0,p=0;for(;i<=n;)p+=i++;for(i=0;t.size()<p;t+=std::to_string(++i));t=t.substr(0,p).substr(p-n);i=0;for(auto&a:t)i+=a-48;return i;}

Якщо змінити останній рядок на цей, слід зберегти два байти:int s(int n){++n;std::string t;int i=0,p=0;for(;i<=n;)p+=i++;for(i=0;t.size()<p;t+=std::to_string(++i));t=t.substr(0,p);t=t.substr(t.size()-n);i=0;for(auto&a:t)i+=a-48;return i;}
Zacharý

Крім того, якщо ви зараз приймаєте дані як 0-індексовані, ви можете перетворити його на 1-індекс і скинути++n;
Zacharý

@ Zacharý Спасибі До речі, ваш код містить невидимий символ Unicode з якихось причин
HatsuPointerKun

Який із них, моя пропозиція C ++ чи мій APL? APL використовує власну кодову сторінку і, ймовірно, не відображатиметься правильно, якщо у вас немає потрібного шрифту.
Zacharý

@ Zacharý Пропозиція C ++, яку ви написали в коментарі. Там як 2 символи unicode перед нулем, роблячи помилки, як "0" identifier is unknownу візуальній студії. Те саме для to_stringі size. Ви можете побачити це, якщо скопіювати і вставити код у блокнот ++ та перетворити кодування в ANSI, ви побачите їх ??у редакторі
HatsuPointerKun

0

Pyth ,  15 14  13 байт

s<>sMjkS^Q2sU

Спробуйте тут! або Ознайомтеся з тестовим набором.

13 байт альтернативи:

ssM<>jkS^Q2sU
ssM<>jkS*QQsU
s<>sMjkS^Q2sU

Як?

s<>sMjkS^Q2sU    Full program. Q means input.

       S^Q2      The range [1, Q^2].
     jk          Join as a String.
   sM            Convert each character to integer.
  >              All the elements of the above, but the first Q*(Q-1)/2.
 <               All the element of the above but the last Q.
s                Sum.
                 Output implicitly.

0

> <>, 141 + 2 байти

::1+* 2,01\
@}})?/:0$\>$:@{{:
:%a:/?(1:< ,a-]{+1[4
  /~/     \+1~\
1:<]{+1[+4@:-1\?(
{1-}>{:}1(?\@1-@+
    \0}~{{\\n;
@:{{:<-1~$\!?)}}
     ~

1-індексований

+ 2b для прапора -v

Можливо, Tio.run останнім часом не подобається моїм програмам ... Це все ще можна перевірити на https://fishlanguage.com . Введення йде у "початковий стек".

Редагувати: виявляється, tio.run не подобається, оскільки він по-різному обробляє "[" і "]" fishlanguage.com ". fishlanguage.com повертає стек під час створення або видалення нового стека, але tio.run цього не робить.


0

Perl 5 , 62 + 1 (-p) = 63 байти

$_=eval(substr((join'',1..$_*$_),($_**2-$_)/2,$_)=~s/./+$&/gr)

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

Результат 1 індексований.

Як?

Об’єднайте більше, ніж достатньо цифр разом, а потім пропустіть невідповідні на початку (довжина пропуску - це ціла кількість від 1 до n-1). Візьміть наступні nцифри, поставте +перед кожною з них, а потім оцініть це рівняння.


0

JavaScript (ES6), 78 65 байт

f=
n=>eval([...(g=n=>n?g(n-1)+n:``)(n*n).substr(n*~-n/2,n)].join`+`)
<input type=number min=1 oninput=o.textContent=f(this.value)><pre id=o>

1-індексований. Редагувати: Збережено 13 байт завдяки @tsh.


n=>eval([...(g=n=>n?g(n-1)+n:'')(n*n)].join<+>.substr(~-n*n-1,2*n))
tsh

@tsh Все ж гольфіст поставити join`+` в кінці ...
Ніл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.