Суммируйте строки объединенного треугольника


16

Рассмотрим следующий треугольник.

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

Как вы, наверное, заметили, первая строка имеет длину 1, а каждая последующая строка на 1 цифру длиннее предыдущей и содержит цифры сцепленных положительных целых чисел.

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

правила

  • Вы можете выбрать либо 0, либо 1 индексирование. Пожалуйста, укажите это в своем ответе.

  • Применяются стандартные лазейки .

  • Вы можете принимать и выводить данные любым стандартным способом и в любом разумном формате.

  • Это OEIS A066548 , и эта последовательность представляет собой сам треугольник (за исключением того, что мы не удаляем ведущие нули).

  • Это , поэтому выигрывает самый короткий код в байтах (на каждом языке). Удачи в гольф!

Тестовые случаи

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

Python 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.
Мистер Кскодер

69 байтов . Используя формулу Гаусса,sum(range(n)) = ~-n*n/2 = (n - 1) * n / 2
г-н Xcoder

1
@ Mr.Xcoder Я думаю, что он делает ...
Эрик Outgolfer

@EriktheOutgolfer Вы правы, мой плохой
мистер Xcoder




2

Mathematica, 96 байт

(d=Flatten[IntegerDigits/@Range[#^2]];Last@Table[Tr@Take[d,{i(i+1)/2+1,(i+1)(i+2)/2}],{i,0,#}])&  


Попробуйте онлайн! (для работы над математикой необходимо заменить «Тр» на «Тотал»)


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 Спасибо! Ред. Я не знаю, почему я думал, 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].
Захари

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.
user2390246

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 - это объектно-ориентированный язык программирования с обобщениями, протоколами, опциями и замыканиями, но эта программа не использует замыканий, и все обобщенные элементы и протоколы можно считать неявными.

Программа работает только с несколькими типами: 🚂 является целочисленным типом и 🔡 является строковым типом. Кроме того, conditions появляются в условиях, которые могут принимать значение 👍 (true) или 👎 (false).

В настоящее время в Emojicode нет операторов, поэтому сложение, сравнения и другие операции, которые обычно являются операторами, реализованы в виде функций, эффективно позволяя выражениям использовать префиксную нотацию . Операторы также запланированы в 0,6.

🐖©a🚂➡🚂🍇

© принимает один вызванный aand и возвращает 🚂.

 🍦l➗✖a➕a 1 2

Объявите фиксированное значение («константа»), lравное a-му треугольному числу (формула в префиксной записи). Это представляет длину строки чисел, которую мы должны сгенерировать.

 🍮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

Возврат с

🍉

Завершить метод.


1

PHP, 66 + 1 байт

for($p=($n=$argn)*-~$n/2;$n--;)$r+=join(range(1,$p))[--$p];echo$r;

Запустите как трубу с -nRили попробуйте онлайн .

требует PHP 5.4 или более поздней версии для индексации выражения.



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

@Giuseppe изменил и использовал ваше предложение по поводуstrtoi
AndriusZ

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

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

1

Perl 6 , 44 байта

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

Проверь это

Expanded:

{
  [+]        # 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ý Спасибо. Кстати, ваш код по некоторым причинам содержит невидимый символ
Юникода

Какой из них, мое предложение C ++ или мой APL? APL использует свою собственную кодовую страницу и, вероятно, не будет отображаться правильно, если у вас нет нужного шрифта.
Захари

@ Zacharý C ++ предложение, которое вы написали в комментарии. Там как 2 символа Юникода перед нулем, делая ошибки, как "0" identifier is unknownв Visual Studio. То же самое для to_stringи size. Вы можете увидеть это, если скопируете и вставите код в notepad ++ и конвертируете кодировку в 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.