Trójkąt liczbę!


28

Jesteśmy przyzwyczajeni do terminu „kwadrat” n, co oznacza obliczanie n 2 . Jesteśmy przyzwyczajeni do terminu „kostkowanie” n, co oznacza n 3 . Biorąc to pod uwagę, dlaczego nie moglibyśmy również trójkątować liczby?

Jak trójkątować liczbę?

  • Po pierwsze, niech wybrać numer 53716.

  • Ustaw go na równoległoboku, którego długość boku jest równa liczbie cyfr liczby, i ma dwa boki ustawione po przekątnej, jak pokazano poniżej.

        53716
       53716
      53716
     53716
    53716
    
  • Teraz chcemy to zrobić, prawda? Aby to zrobić, przytnij boki, które nie pasują do trójkąta prostokątnego:

        5
       53
      537
     5371
    53716
    
  • Weź sumy z każdego wiersza, w tym przykładzie wynikiem jest [5, 8, 15, 16, 22]:

        5 -> 5
       53 -> 8
      537 -> 15
     5371 -> 16
    53716 -> 22
    
  • Zsumuj listę [5, 8, 15, 16, 22], w wyniku czego 66. To jest trójkąt tej liczby!

Specyfikacje i zasady

  • Wejście będzie nieujemną liczbą całkowitą n ( n ≥ 0, n ∈ Z ).

  • Możesz przyjmować dane wejściowe i dostarczać dane wyjściowe dowolnymi dozwolonymi środkami .

  • Dane wejściowe mogą być sformatowane jako liczba całkowita, ciąg znaków reprezentujący liczbę całkowitą lub listę cyfr.

  • Domyślne luki zabronione.

  • To jest , więc wygrywa najkrótszy kod w bajtach!

Więcej przypadków testowych

Wejście -> Wyjście

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

Inspiracja. Wyjaśnienia są zachęcane!


jesteś tego pewien 645321 -> 91?
Rod

@Rod Przepraszamy, masz rację. Napisałem 645321zamiast 654321.
Pan Xcoder,

1
Czy mogę wprowadzić dane jako listę cyfr?
całkowicie ludzki,

@totallyhuman Tak, zobacz drugą specyfikację.
Pan Xcoder,

1
Ciekawe wyzwanie. Cieszę się, że zainspirowałaś mnie!
Gryphon - Przywróć Monikę

Odpowiedzi:




12

Brain-Flak , 65, 50, 36 bajtów

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

Wypróbuj online!

Po wielu poprawkach jestem teraz bardzo dumny z tej odpowiedzi. Podoba mi się algorytm i to, jak ładnie można go wyrazić w uderzeniu mózgu.

Większość bajtów pochodzi z obsługi zer na wejściu. W rzeczywistości, gdybyśmy mogli założyć, że na wejściu nie było zer, byłaby to pięknie krótka 20-bajtowa odpowiedź:

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

Wypróbuj online!

Niestety, atak mózgu jest znany z niewłaściwego postępowania z przypadkowymi przypadkami.

Wyjaśnienie

Najpierw moja obserwacja:

Jeśli wejście ma długość n cyfr, pierwsza cyfra pojawi się w trójkącie n razy, druga cyfra pojawi się n-1 razy i tak dalej na ostatniej cyfrze, która pojawi się raz. Możemy to wykorzystać, ponieważ naprawdę łatwo jest obliczyć, ile cyfr wejścia pozostało w wyładowaniach mózgu, a mianowicie

[]

Oto jak działa kod.

# 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
)

Moja wskazówka tutaj może zaoszczędzić ci dwa bajty
Wheat Wizard





7

Japt , 7 6 4 bajtów

å+ x

Wypróbuj online!

Wyjaśnienie

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

Stare rozwiązanie:

å+ ¬¬x

Wypróbuj online!

Wyjaśnienie

å+ ¬¬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

Uh, dużo piaskownicy? A może przeczytałeś pytanie, napisałeś kod i opublikowałeś je w ciągu jednej minuty ?!
Jonathan Allan

@JonathanAllan To nie było piaskownica. Jest to o wiele łatwiejsze niż mogłoby się wydawać.
Pan Xcoder,

1
Cóż, nie mogę nawet przeczytać pytania w tym czasie
Jonathan Allan,

@JonathanAllan Brak odczytu w piaskownicy, zdarzyło się, że złapałem pytanie tuż po jego opublikowaniu i niemal natychmiast opracowałem algorytm.
ETHprodukcje

Welp zajęło mi ~ 4 minuty, aby przeczytać pytanie, więc +1 za szybkie czytanie / rozumienie prędkości :)
Jonathan Allan

7

Brain-Flak , 28 bajtów

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

Wypróbuj online!

14 bajtów, jeśli nie musimy obsługiwać zer (co robimy)

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

Wypróbuj online!

DJMcMayhem ma fajną odpowiedź tutaj którą powinieneś sprawdzić. Niestety dla niego nie zamierzałem pozwolić mu wygrać we własnym języku: P.

Jak to działa?

Zacznijmy od prostej wersji.

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

Główna akcja polega na ({}<>{})<>tym, że bierze górę lewego stosu i dodaje do góry prawego stosu. Poprzez zapętlenie tej operacji sumujemy bieżący stos (aż osiągnie zero), umieszczając sumę na stosie wyłączonym. To dość przyziemne, interesujące jest to, że podsumowujemy wyniki wszystkich tych biegów jako nasz wynik. To obliczy żądaną wartość. Czemu? Cóż, spójrzmy na przykład 123. Przy pierwszym chwycie otrzymujemy 1, więc nasza wartość wynosi 1

1

Przy następnym chwycie zwracamy 1 plus 2

1
1+2

W ostatnim biegu mamy wszystkie trzy razem

1
1+2
1+2+3

Czy widzisz trójkąt? Suma wszystkich przebiegów to „trójkąt” listy.


Ok, ale teraz potrzebujemy go do zerowania, tutaj użyłem tej samej sztuczki co DJMcMayhem, a także trochę fantazyjnej pracy nóg. Zamiast zapętlać, aż osiągniemy zero, zapętlamy, aż stos będzie pusty.

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

Następnie użyłem tej wskazówki , napisanej przez nikogo innego, jak naprawdę, do gry w golfa na kolejne 2 bajty.

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

Mamy to. Byłbym zaskoczony, gdyby istniało krótsze rozwiązanie, ale z drugiej strony wydarzyły się dziwniejsze rzeczy.


Unfortunately for him I wasn't about to let him win at his own language :PNie oczekuję niczego od ciebie. : D
DJMcMayhem

6

JavaScript (ES6), 28 bajtów

a=>a.map(d=>t+=c+=d,t=c=0)|t

Pobiera dane wejściowe jako listę cyfr.


5

Python 3 , 37 bajtów

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

Wypróbuj online!


5
... Dlaczego głosowanie negatywne?
Business Cat

Myślę, że można zmienić len, aby sumtak dobrze, choć nie wierzę, że pomaga nic.
ETHprodukcje

@ETHproductions Tak. Miałem nadzieję, że skorzystam z faktu, że sum([])jest to 0, ale nic się nie łączyło ... może być jednak jakiś sposób
Business Cat

Nie widziałem tego inaczej, dałbym ci moją poprawę.
Jonathan Allan

@JonathanAllan Bez obaw: P
Business Cat

5

C # (.NET Core) , 59 bajtów

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

Wypróbuj online!

Zasadniczo różni się od innych odpowiedzi w języku C #. Dane wejściowe to lista cyfr. Wszystkie przypadki testowe zawarte w łączu TIO.

Mógłby zapisać kilka bajtów, jeśli pozwoliłoby to na wejście jako wsteczną listę cyfr z wiodącymi 0.


Dobry pomysł! Niektóre dzikie codegolfing w C #.
Grzegorz Puławski

Fajne rozwiązanie! Ale czy dane wejściowe nie są określone jako nieujemne number, a nie lista cyfr?
Ian H.

@IanH. Reguła 2: Możesz wziąć dane wejściowe i dostarczyć dane wyjściowe dowolną dozwoloną metodą. Jeśli chodzi o format, dane wejściowe można traktować jako liczbę całkowitą, jako ciąg znaków reprezentujący liczbę całkowitą lub listę cyfr.
Kamil Drakari,


4

J , 7 bajtów

[:+/+/\

Wypróbuj online! Pobiera listę cyfr, takich jak f 6 5 4 3 2 1.

Wyjaśnienie

[:+/+/\    (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

Nieco bardziej prawdziwy byłby pierwotny problem [:+/@,]/, którym są „suma” ( +/) spłaszczone ( ,) przedrostki input ( ]\).


4

Vim , 60 59 32 naciśnięcia klawiszy

Wielkie dzięki @CowsQuack za wskazówkę z rekurencyjnym makrem i hpodstępem, dzięki temu zaoszczędziłem 27 bajtów!

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

Wypróbuj online!

Ungolfed / Explained

Spowoduje to zbudowanie trójkąta zgodnie z opisem (tylko, że będzie on wyrównany do lewej):

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

Bufor wygląda teraz tak:

53716
5371
537
53
5

Połącz wszystkie linie w jedną i zbuduj z niej wyrażenie, które można ocenić:

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

"Rejestr zawiera teraz ciąg następujących (uwaga brakuje 0):

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

Więc wszystko, co musimy zrobić, to dodać zero i ocenić to:

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

wewnątrz vim


Możesz użyć &(cały mecz) zamiast \1w poleceniu zastępczym
Kritixi Lithos

1
qqYp$xq:exe"norm".col('.')."@q"⏎może zostać qqYp$xh@qq@q. To rekurencyjne makro napotka błąd przełamania, gdy w linii będzie jeden znak, po którym się zatrzyma.
Kritixi Lithos

Więc podstawienie może się stać :s/./&+/g. :%j⏎Może się również stać V{J. I Dimoże się stać C(skomentowałem już to w innej odpowiedzi Vima). Wypróbuj online!
Kritixi Lithos


3

Narzędzia Bash + GNU, 32 24

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

Wejście odczytane ze STDIN.

Aktualizacja: Widzę, że dane wejściowe mogą być podane jako lista cyfr. Moja lista wprowadzania jest rozdzielana znakiem nowej linii.

Wypróbuj online .

Wyjaśnienie

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 bajty

+/+\

Pobiera to dane wejściowe jako listę cyfr, np .:

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

Wyjaśnienie

+/    sum of
  +\  partial sums of input

3

Taxi , 1478 bajtów

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.

Wypróbuj online!

Bez golfa:

[ 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 bajtów

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

Wypróbuj online!

W jaki sposób?

$ \ zawiera łączną sumę, $ p zawiera sumę cyfr w bieżącym wierszu. Każda linia równoległoboku jest po prostu poprzednią linią z dołączoną kolejną cyfrą liczby. Jest to zatem suma poprzedniego wiersza plus nowa cyfra. To iteruje wszystkie cyfry, obliczając sumy w miarę upływu czasu. Rzeczywiste zastąpienie jest nieistotne; to tylko sposób na iterację cyfr bez tworzenia rzeczywistej pętli. Na koniec $ \ jest wypisywane domyślnie przez -popcję.



2

Galaretka ,  5  4 bajtów

Ṛæ.J

Monadyczny link pobierający listę cyfr dziesiętnych i zwracający trójkąt liczby reprezentowanej przez tę listę.

Wypróbuj online!

W jaki sposób?

Ṛæ.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

Myślałem, że usunięcie nadal będzie działać. Szkoda ...
ETHprodukcje

@ETHproductions ... a jednak jest wbudowana pomoc!
Jonathan Allan

... okej, łał ...
ETHprodukcje

@ETHproductions ooops musiało to odwrócić> _ <
Jonathan Allan

2

Siatkówka , 13 bajtów

.
$`$&
.
$*
1

Wypróbuj online! Link zawiera przypadki testowe. Objaśnienie: Pierwszy etap generuje wszystkie prefiksy oryginalnej liczby, drugi etap konwertuje każdą cyfrę na unarną, a trzeci etap przyjmuje sumę.



2

Neim , 3 bajty

𝐗𝐂𝐬

Wyjaśnienie:

𝐗        Get prefixes of input, including itself
 𝐂       Implicitly join elements together, and create an array with all the digits
  𝐬      Sum

Wypróbuj online!

Alternatywna odpowiedź:

𝐗𝐣𝐬

Wyjaśnienie:

𝐗       Get prefixes of input, including itself
 𝐣       Join
  𝐬      Implicitly convert to a digit array, and sum

Wypróbuj online!


2

Java 8, 53 bajty

Zaimplementowałem lambda dla każdego akceptowalnego typu wejścia. Każda z nich iteruje cyfry numeru, dodając odpowiednią wielokrotność każdego z nich do akumulatora.

Liczba całkowita jako wejście (53 bajty)

Lambda od Integerdo Integer:

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

Reprezentacja ciągu jako danych wejściowych (72 bajty)

Lambda od Stringdo Integer:

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

Tablica cyfr jako dane wejściowe (54 bajty)

Lambda od int[](cyfr, pierwsza największa wartość miejsca) do Integer:

a->{int l=a.length,s=0;for(int n:a)s+=n*l--;return s;}
  • -7 bajtów dzięki Olivier Grégoire

1
a -> {int l = a.length, s = 0; for (int n: a) s + = n * l -; return s;} 54 bajty dla wersji tablicowej.
Olivier Grégoire

2

Pyt , 9 6 bajtów

ąĐŁř↔·

Wyjaśnienie:

                 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 bajtów

Dzięki panu Xcoderowi za pomoc w zaoszczędzeniu sporo bajtów!

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

Wypróbuj online!

Pobiera dane wejściowe jako ciąg. Po prostu mnoży każdą cyfrę przez liczbę razy, kiedy trzeba ją dodać, i zwraca ich sumę.


Dobra pierwsza odpowiedź, ale proszę, uczyń swoje zgłoszenie poważnym kandydatem, usuwając niepotrzebne białe znaki i nadając wszystkim nazwom zmiennych / funkcji długość 1 bajta. 69 bajtów
Mr. Xcoder


@ Mr.Xcoder Thanks. Będę o tym pamiętać.
Manish Kundu

1
Nie możesz zakładać, że zawsze będzie on wywoływany za pomocą0 . Jeśli pzawsze musi tak być 0, powinieneś wymienićp ze p=0w lambdadeklaracji. Możesz jednak pcałkowicie usunąć, aby uzyskać 54 bajty
caird coinheringaahing


2

Common Lisp, 53 52 bajty

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

Wprowadź jako listę cyfr.

Wypróbuj online!

-1 bajt dzięki @ceilingcat.


@ceilingcat, niektóre kompilatory Common Lisp faktycznie zawiodą, gdy applyzostaną zastosowane wobec bardzo długich list z powodu call-arguments-limit.
Renzo
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.