Трикутник число!


28

Ми звикли під терміном "квадратування" n означати обчислення n 2 . Ми також звикли під терміном "кубування" n означати n 3 . Попри це, ми не могли б також трикутник число?

Як трикутник число?

  • Спочатку давайте виберемо число 53716,.

  • Розташуйте його в паралелограмі, довжина сторони якого дорівнює кількості цифр числа і має дві сторони, розташовані по діагоналі, як показано нижче.

        53716
       53716
      53716
     53716
    53716
    
  • Тепер ми хочемо це зробити, правда? Для цього обріжте сторони, які не вписуються в прямокутний трикутник:

        5
       53
      537
     5371
    53716
    
  • Візьміть суми кожного ряду, для цього прикладу виходить [5, 8, 15, 16, 22]:

        5 -> 5
       53 -> 8
      537 -> 15
     5371 -> 16
    53716 -> 22
    
  • Підсумуйте список [5, 8, 15, 16, 22], у результаті чого 66. Це трикутник цього числа!

Технічні характеристики та правила

Більше тестових випадків

Вхід -> Вихід

0 -> 0
1 -> 1
12 -> 4
123 -> 10
999 -> 54 
100000 -> 6
654321 -> 91

Натхнення. Пояснення заохочуються!


ти впевнений у цьому 645321 -> 91?
Прут

@Rod Вибачте, ви праві. Я писав 645321замість 654321.
Містер Xcoder

1
Чи можу я взяти введення як список цифр?
totalhuman

@totallyhuman Так, дивіться другу специфікацію.
Містер Xcoder

1
Цікавий виклик. Радий, що ти надихнувся моїм!
Грифон - Відновіть Моніку

Відповіді:




12

Мозг-Флак , 65, 50, 36 байт

([])({<{}>{<({}[()])>[]}{}<([])>}{})

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

Після багатьох переглядів я зараз дуже пишаюся цією відповіддю. Мені подобається алгоритм, і як красиво це можна виразити в мозку.

Більшість підрахунків байтів відбувається з обробки 0 на вході. Насправді, якби ми могли припустити, що у введенні не було 0, це була б дуже коротка 20-байтна відповідь:

({{<({}[()])>[]}{}})

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

Але, на жаль, мозок невідомий для поганого поводження з крайовими справами.

Пояснення

По-перше, спостереження за моїм:

Якщо вхід n n цифр довгий, перша цифра з’явиться у трикутнику n разів, друга цифра з’явиться n-1 рази тощо, на останній цифрі, яка з’явиться один раз. Ми можемо скористатися цим, оскільки по-справжньому легко підрахувати, скільки цифр вхідних даних залишилося в мозку, а саме

[]

Тож ось як працює код.

# Push the size of the input (to account for 0's)
([])

# Push...
(

    # While True
    {

        # Pop the stack height (evaluates to 0)
        <{}>

        # For each digit *D*...

        # While true
        {

            # Decrement the counter (the current digit we're evaluating), 
            # but evaluate to 0
            <({}[()])>

            # Evaluate the number of digits left in the input
            []

        # Endwhile
        }

        # This whole block evaluates to D * len(remaining_digits), but 
        # without affecting the stack

        # Since we looped D times, D is now 0 and there is one less digit.
        # Pop D (now 0)
        {}

        # Push the stack height (again, evaluating it as 0)
        <([])>

    # End while
    }

    # Pop a 0 off (handles edge case of 0)
    {}

# end push
)

Моя порада тут може врятувати вас два байти
Wheat Wizard





7

Japt , 7 6 4 байт

å+ x

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

Пояснення

å+ x    Implicit: input = digit list
å+      Cumulative reduce by addition. Gives the sum of each prefix.
   x    Sum.

Старе рішення:

å+ ¬¬x

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

Пояснення

å+ ¬¬x   Implicit: input = string
å+       Cumulative reduce by concatenation. Gives the list of prefixes.
   ¬     Join into a single string of digits.
    ¬    Split back into digits.
     x   Sum.
         Implicit: output result of last expression

Гм пісочниця багато? Або ви прочитали питання, написали код і опублікували все це протягом однієї хвилини ?!
Джонатан Аллан

@JonathanAllan Це не пісочниця. Це набагато простіше, ніж можна подумати.
Містер Xcoder

1
Ну, я не можу навіть прочитати питання за час, який це пройшло
Джонатан Аллан

@JonathanAllan Немає читання в пісочниці, просто трапилося запитання відразу після того, як воно було розміщене, і алгоритм придумав майже відразу.
ETHproductions

Щоб прочитати питання, мені знадобилося ~ 4 хвилини, тому +1 для швидкого читання / розуміння швидкості :)
Джонатан Аллан

7

Мозок-Флак , 28 байт

(([]){[{}]({}<>{})<>([])}{})

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

14 байт, якщо нам не потрібно підтримувати нулі (що ми робимо)

({({}<>{})<>})

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

DJMcMayhem має класну відповідь, тут ви повинні перевірити. На жаль для нього я не збирався дозволити йому перемогти на своїй власній мові: P

Як це працює?

Почнемо з простої версії.

({({}<>{})<>})

Основна дія тут полягає в тому ({}<>{})<>, що бере верхню частину лівої стеки і додає до верхньої частини правої стеки. Циклам цієї операції ми підсумовуємо поточний стек (поки він не досягне нуля), розміщуючи суму на вимкненому стеку. Це досить щоденно, цікава частина полягає в тому, що ми підсумовуємо результати всіх цих пробіг як наш результат. Це дозволить обчислити бажане значення. Чому? Ну давайте подивимося на приклад, 123. Під час першого захоплення ми просто отримуємо 1, тому наше значення дорівнює 1

1

При наступному захопленні повертаємо 1 плюс 2

1
1+2

В останній пробіг у нас всі троє разом

1
1+2
1+2+3

Ви бачите трикутник? Сума всіх прогонів - це "трикутник" списку.


Гаразд, але зараз нам це потрібно для нулів, тут я використав той самий трюк, що і DJMcMayhem, а також кілька фантазійних робіт. Замість циклу, поки ми не потрапимо на нуль, ми циклічно, поки стек не порожній.

([])({<{}>({}<>{})<><([])>}{})

Потім я скористався цією порадою , написаною не хто іншим, як справді вашим, щоб покатати ще 2 байти.

(([]){[{}]({}<>{})<>([])}{})

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


Unfortunately for him I wasn't about to let him win at his own language :PЯ не чекаю від тебе нічого менше. : D
DJMcMayhem


5

Python 3 , 37 байт

f=lambda n:len(n)and sum(n)+f(n[:-1])

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


5
... Чому потік?
Ділова кішка

Я думаю , ви могли б змінити , lenщоб , sumяк добре, хоча я не вірю , що допомагає нічого.
ETHproductions

@ETHproductions Так. Я сподівався, що зможу скористатись фактом, який sum([])дорівнює 0, але нічого не зовсім зблизилося ... Можливо, є спосіб, хоча
Business Cat

Я не бачив цього в іншому випадку, я би подарував вам своє вдосконалення.
Джонатан Аллан

@JonathanAllan Не хвилюйтесь: P
Business Cat

5

C # (.NET Core) , 59 байт

using System.Linq;N=>N.Reverse().Select((d,i)=>i*d+d).Sum()

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

По суті відрізняється від інших відповідей на C #. Введення - це список цифр. Усі тестові приклади включені у посилання TIO.

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


Хороша ідея! Якийсь жорстокий кодовий гольф на C #.
Grzegorz Puławski

Приємне рішення! Але чи не вказане введення не є негативним number, а не списком цифр?
Ян Х.

@IanH. Правило 2: Ви можете брати вклад і надавати вихід будь-яким дозволеним значенням. Якщо мова йде про формат, ви можете сприймати введення як ціле число, як рядкове представлення цілого числа або як список цифр.
Каміль Дракарі


4

J , 7 байт

[:+/+/\

Спробуйте в Інтернеті! Бере список цифр, наприклад f 6 5 4 3 2 1.

Пояснення

[:+/+/\    (for explanation, input = 6 5 4 3 2 1)
      \    over the prefixes of the input:
     /         reduce:
    +              addition (summation)
           this gives is the cumulative sum of the input:  6 11 15 18 20 21
[:         apply to the result:
  +/           summation
           this gives the desired result:   90

Трохи правдивішою буде початкова проблема [:+/@,]/, яка є "сума" ( +/) сплющених ( ,) префіксів вводу ( ]\).


4

Вим , 60 59 32 натискання клавіш

Велике спасибі @CowsQuack за пораду з рекурсивним макросом та hтрюком, це врятувало мене 27 байт!

qqYp$xh@qq@qVHJ:s/./&+/g⏎
C<C-r>=<C-r>"0⏎

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

Необережений / Пояснений

Це створить трикутник, як описано (лише те, що він тримає його вліво):

qq       q    " record the macro q:
  Yp          "   duplicate the line
    $x        "   remove last character
      h       "   move to the left (this is solely that the recursive macro calls stop)
       @q     "   run the macro recursively
          @q  " run the macro

Тепер буфер виглядає так:

53716
5371
537
53
5

Об’єднайте всі рядки в один і побудуйте з нього оцінний вираз:

VH             " mark everything
  J            " join into one line
   :s/./&+/g⏎  " insert a + between all the characters

Тепер "реєстр містить такий рядок (примітка відсутня 0):

5+3+7+1+6+ +5+3+7+1+ +5+3+7+ +5+3+ +5+ +

Отже, все, що нам потрібно зробити, - це додати нуль і оцінити його:

 C                " delete line and store in " register
  <C-r>=       ⏎  " insert the evaluated expression from
        <C-r>"    " register "
              0   " append the missing 0

всередині vim


Ви можете використовувати &(весь матч) замість команди \1заміну
Kritixi Lithos

1
qqYp$xq:exe"norm".col('.')."@q"⏎може стати qqYp$xh@qq@q. Цей рекурсивний макрос зустрінеться з помилкою розриву, коли в рядку буде один символ, після якого він зупиниться.
Kritixi Lithos

Тож заміщення може просто стати :s/./&+/g. Також :%j⏎може стати V{J. І, Diможе стати C(я вже коментував це в іншій вашій відповіді Vim). Спробуйте в Інтернеті!
Kritixi Lithos


3

Утиліти Bash + GNU, 32 24

tac|nl -s*|paste -sd+|bc

Вхід зчитується з STDIN.

Оновлення: я бачу, що введення може бути подано у вигляді списку цифр. Мій список вводу обмежено новим рядком.

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

Пояснення

tac                       # reverse digit list
   |nl -s*                # prefix line numbers; separate with "*" operator
          |paste -sd+     # join lines onto one line, separated with "+" operator
                     |bc  # arithmetically evaluate

3

APL, 4 байти

+/+\

Це враховує введення як перелік цифр, наприклад:

      (+/+\) 5 3 7 1 6
66

Пояснення

+/    sum of
  +\  partial sums of input

3

Таксі , 1478 байт

Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to Chop Suey.Go to Chop Suey:n 1 r 1 l 4 r 1 l.[a]Switch to plan "b" if no one is waiting.Pickup a passenger going to The Babelfishery.Go to Zoom Zoom:n 1 l 3 r.1 is waiting at Starchild Numerology.Go to Starchild Numerology:w 4 l 2 r.Pickup a passenger going to Addition Alley.Go to Addition Alley:w 1 r 3 r 1 r 1 r.Pickup a passenger going to Addition Alley.Go to The Babelfishery:n 1 r 1 r.Go to Chop Suey:n 6 r 1 l.Switch to plan "a".[b]Go to Addition Alley:n 1 l 2 l.Pickup a passenger going to Cyclone.[c]Go to Zoom Zoom:n 1 l 1 r.Go to Cyclone:w.Pickup a passenger going to The Underground.Pickup a passenger going to Multiplication Station.Go to The Babelfishery:s 1 l 2 r 1 r.Pickup a passenger going to Multiplication Station.Go to Multiplication Station:n 1 r 2 l.Pickup a passenger going to Addition Alley.Go to The Underground:n 2 l 1 r.Switch to plan "d" if no one is waiting.Pickup a passenger going to Cyclone.Go to Addition Alley:n 3 l 1 l.Switch to plan "c".[d]Go to Addition Alley:n 3 l 1 l.[e]Pickup a passenger going to Addition Alley.Go to Zoom Zoom:n 1 l 1 r.Go to Addition Alley:w 1 l 1 r.Pickup a passenger going to Addition Alley.Switch to plan "f" if no one is waiting.Switch to plan "e".[f]Go to Zoom Zoom:n 1 l 1 r.Go to Addition Alley:w 1 l 1 r.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:n 1 r 1 r.Pickup a passenger going to Post Office.Go to Post Office:n 1 l 1 r.

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

Без гольфу:

[ Pickup stdin and split into digits ]
Go to Post Office: west 1st left 1st right 1st left.
Pickup a passenger going to Chop Suey.
Go to Chop Suey: north 1st right 1st left 4th right 1st left.
[a]
[ Count the digits ]
Switch to plan "b" if no one is waiting.
Pickup a passenger going to The Babelfishery.
Go to Zoom Zoom: north 1st left 3rd right.
1 is waiting at Starchild Numerology.
Go to Starchild Numerology: west 4th left 2nd right.
Pickup a passenger going to Addition Alley.
Go to Addition Alley: west 1st right 3rd right 1st right 1st right.
Pickup a passenger going to Addition Alley.
Go to The Babelfishery: north 1st right 1st right.
Go to Chop Suey: north 6th right 1st left.
Switch to plan "a".
[b]
Go to Addition Alley: north 1st left 2nd left.
Pickup a passenger going to Cyclone.
[c]
[ Multiply each digits by Len(stdin)-Position(digit) ]
Go to Zoom Zoom: north 1st left 1st right.
Go to Cyclone: west.
Pickup a passenger going to The Underground.
Pickup a passenger going to Multiplication Station.
Go to The Babelfishery: south 1st left 2nd right 1st right.
Pickup a passenger going to Multiplication Station.
Go to Multiplication Station: north 1st right 2nd left.
Pickup a passenger going to Addition Alley.
Go to The Underground: north 2nd left 1st right.
Switch to plan "d" if no one is waiting.
Pickup a passenger going to Cyclone.
Go to Addition Alley: north 3rd left 1st left.
Switch to plan "c".
[d]
Go to Addition Alley: north 3rd left 1st left.
[e]
[ Sum all the products ]
Pickup a passenger going to Addition Alley.
Go to Zoom Zoom: north 1st left 1st right.
Go to Addition Alley: west 1st left 1st right.
Pickup a passenger going to Addition Alley.
Switch to plan "f" if no one is waiting.
Switch to plan "e".
[f]
[ Output the results ]
Go to Zoom Zoom: north 1st left 1st right.
Go to Addition Alley: west 1st left 1st right.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: north 1st right 1st right.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st left 1st right.

3

Perl 5 , 19 + 1 ( -p) = 20 байт

s/./$\+=$p+=$&/ge}{

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

Як?

$ \ містить сукупну суму, $ p містить загальну кількість цифр у поточному рядку. Кожен рядок паралелограма - це просто попередній рядок із наступною цифрою доданого числа. Тому це сума попереднього рядка плюс нова цифра. Це повторює всі цифри, обчислюючи їх суми. Фактична підміна не має значення; це просто засіб для перебору цифр без створення фактичного циклу. Зрештою, параметр $ \ друкується неявно -pопцією.



2

Желе ,  5  4 байти

Ṛæ.J

Монадичне посилання, що бере список десяткових цифр і повертає трикутник числа, яке представляє список.

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

Як?

Ṛæ.J - Link: list of numbers (the decimal digits), d   e.g. [9,4,5,0]
Ṛ    - reverse d                                            [0,5,4,9]
   J - range(length(d))                                     [1,2,3,4]
 æ.  - dot-product            (0*1 + 5*2 + 4*3 + 9*4 = 58)  58

Я думав, що видалення все одно спрацює. Шкода ...
ETHproductions

@ETHproductions ... і все ж є вбудована допомога!
Джонатан Аллан

... гаразд, ух ...
ETHproductions

@ETHproductions ooops повинні були змінити його> _ <
Джонатан Аллан

2

Сітківка , 13 байт

.
$`$&
.
$*
1

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




2

Java 8, 53 байти

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

Ціле число як вхід (53 байти)

Лямбда від Integerдо Integer:

n->{int s=0,i=1;for(;n>0;n/=10)s+=n%10*i++;return s;}

Представлення рядків як вхідний (72 байти)

Лямбда від Stringдо Integer:

s->{int l=s.length(),n=0;for(int b:s.getBytes())n+=(b-48)*l--;return n;}

Цифровий масив як вхідний (54 байти)

Лямбда від int[](цифр, найбільше значення місця) до Integer:

a->{int l=a.length,s=0;for(int n:a)s+=n*l--;return s;}
  • -7 байт завдяки Олів’є Грегоаре

1
a -> {int l = a.length, s = 0; for (int n: a) s + = n * l -; return s;} 54 байти для версії масиву.
Олів'є Грегоар

2

Pyt , 9 6 байт

ąĐŁř↔·

Пояснення:

                 Implicit input
ą                Convert to array of digits
 Đ               Duplicate digit array
   Łř↔           Create a new array [len(array),len(array)-1,...,1]
      ·          Dot product with digit array
                 Implicit output

2

Python 3, 94 58 54 байт

Дякую містеру Xcoder за те, що він міг зберегти досить багато байтів!

lambda n:sum(int(v)*(len(n)-i)for i,v in enumerate(n))

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

Вводиться як рядок. Він просто множує кожну цифру на кількість разів, яку потрібно додати, і повертає їх суму.


Приємна перша відповідь, але, будь ласка, зробіть ваше подання серйозним претендентом, видаливши зайвий пробіл та зробивши всі назви змінних / функцій довжиною 1 байт. 69 байт
Містер Xcoder


@ Mr.Xcoder Спасибі Я буду мати це на увазі.
Маніш Кунду

1
Ви можете не припускати, що це завжди буде викликано0 . Якщо pнеобхідно завжди бути 0, ви повинні замінити pз p=0в lambdaдекларації. Однак ви можете просто видалити pповністю, щоб отримати 54 байти
caird coinheringaahing


2

Лист звичайний, 53 52 байти

(loop as(x . y)on(reverse(read))sum(+(reduce'+ y)x))

Введіть як список цифр.

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

-1 байт завдяки @ceilingcat.


@ceilingcat, деякі звичайні компілятори Lisp фактично не спрацюють, коли applyзастосовуються до дуже довгих списків через call-arguments-limit.
Ренцо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.