Dreieck eine Zahl!

28

Wir sind daran gewöhnt, dass der Ausdruck "Quadrieren" n die Berechnung von n 2 bedeutet . Wir sind auch mit dem Begriff „cubing“ verwendet n bedeuten n 3 . Abgesehen davon, warum konnten wir nicht auch eine Zahl dreiecken?

Wie dreiecke ich eine Zahl?

  • Zunächst einmal, lassen Sie uns eine Nummer wählen, 53716.

  • Positionieren Sie es in einem Parallelogramm, dessen Seitenlänge der Anzahl der Ziffern der Zahl entspricht und dessen zwei Seiten diagonal positioniert sind (siehe Abbildung unten).

        53716
       53716
      53716
     53716
    53716
    
  • Jetzt wollen wir es, richtig? Beschneiden Sie dazu die Seiten, die nicht in ein rechtwinkliges Dreieck passen:

        5
       53
      537
     5371
    53716
    
  • Nehmen Sie die Summen jeder Zeile, für dieses Beispiel ergibt sich [5, 8, 15, 16, 22]:

        5 -> 5
       53 -> 8
      537 -> 15
     5371 -> 16
    53716 -> 22
    
  • Summiere die Liste [5, 8, 15, 16, 22], was ergibt 66. Dies ist das Dreieck dieser Zahl!

Spezifikationen und Regeln

  • Die Eingabe ist eine nicht negative ganze Zahl n ( n ≥ 0, n ∈ Z ).

  • Sie können die Eingabe und Ausgabe mit jedem zulässigen Mittel vornehmen .

  • Die Eingabe kann als Ganzzahl, als Zeichenfolgendarstellung der Ganzzahl oder als Ziffernliste formatiert werden.

  • Standardlücken sind nicht zulässig.

  • Das ist , also gewinnt der kürzeste Code in Bytes!

Weitere Testfälle

Eingabe -> Ausgabe

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

Inspiration. Erklärungen sind erwünscht!

Mr. Xcoder
quelle
bist du dir da sicher 645321 -> 91?
Rod
@ Rod Sorry, du hast recht. Ich schrieb 645321statt 654321.
Mr. Xcoder
1
Kann ich Eingaben als Ziffernliste übernehmen?
Totalhuman
@totallyhuman Ja, siehe die zweite Spezifikation.
Mr. Xcoder
1
Interessante Herausforderung. Ich bin froh, dass du von mir inspiriert wurdest!
Gryphon - Wiedereinsetzung von Monica

Antworten:

12

Husk , 4 2 Bytes

Danke @ H.PWiz für die -2Bytes!

Σ∫

Probieren Sie es online!

"Ungolfed" / Erklärt

Σ    -- sum all
 ∫   -- prefix sums
ბიმო
quelle
12

Brain-Flak , 65, 50, 36 Bytes

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

Probieren Sie es online!

Nach vielen Überarbeitungen bin ich jetzt sehr stolz auf diese Antwort. Ich mag den Algorithmus und wie schön er sich in Brain Flak ausdrücken lässt.

Der größte Teil der Byteanzahl stammt aus der Verarbeitung von Nullen in der Eingabe. Wenn wir davon ausgehen könnten, dass die Eingabe keine Nullen enthält, wäre dies eine sehr kurze 20-Byte-Antwort:

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

Probieren Sie es online!

Aber leider ist Brain-Flak für die schlechte Behandlung von Randfällen berüchtigt.

Erläuterung

Erstens eine Beobachtung von mir:

Wenn die Eingabe n Ziffern lang ist, erscheint die erste Ziffer n- mal im Dreieck , die zweite Ziffer erscheint n-1- mal und so weiter bis zur letzten Ziffer, die einmal erscheint. Wir können das ausnutzen, da es wirklich einfach ist zu berechnen, wie viele Stellen der Eingabe in Brain-Flak verbleiben, nämlich

[]

So funktioniert der Code.

# 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
)
DJMcMayhem
quelle
Mein Tipp hier kann Ihnen zwei Bytes
Weizen-Assistent
11

Pyth - 6 4 Bytes

ss._

Probieren Sie es hier online aus .

Schönes 6-Byte-Laufwerk ohne eingebautes Präfix:

s*V_Sl
Maltysen
quelle
Nett! Das Beste, was ich mir einfallen lassen konnte, ist doppelt so lang:s.e*bhk_
Digitales Trauma
8

Gelee , 3 Bytes

+\S

Probieren Sie es online! Verwendet dieselbe Technik wie meine Japt-Antwort: kumulative Addition, dann Summe.

ETHproductions
quelle
Ja natürlich! :)
Jonathan Allan
7

Japt , 7 6 4 Bytes

å+ x

Probieren Sie es online!

Erläuterung

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

Alte Lösung:

å+ ¬¬x

Probieren Sie es online!

Erläuterung

å+ ¬¬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
ETHproductions
quelle
Äh Sandkasten viel? Oder Sie haben die Frage gelesen, Code geschrieben und alles innerhalb einer Minute gepostet ?!
Jonathan Allan
@ JonathanAllan Dies war kein Sandkasten. Es ist viel einfacher als Sie vielleicht denken.
Mr. Xcoder
1
Ich kann die Frage nicht einmal in der Zeit lesen, die es gedauert hat
Jonathan Allan
@JonathanAllan Keine Sandbox-Lesung, nur zufällig die Frage kurz nach dem Posten abgefangen und fast sofort einen Algorithmus gefunden.
ETHproductions
Welp es hat mich ~ 4min gedauert, um die Frage zu lesen, also +1 für Speed-Reading / Speed-Understanding :)
Jonathan Allan
7

Brain-Flak , 28 Bytes

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

Probieren Sie es online!

14 Bytes, wenn wir keine Nullen unterstützen müssen (was wir auch tun)

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

Probieren Sie es online!

DJMcMayhem hat hier eine coole Antwort , die du dir ansehen solltest. Leider wollte ich ihn nicht in seiner eigenen Sprache gewinnen lassen: P

Wie funktioniert es?

Beginnen wir mit der einfachen Version.

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

Die Hauptaktion hier ist ({}<>{})<>, dass der obere Teil des linken Stapels und der obere Teil des rechten Stapels hinzugefügt werden. Durch Schleifenbildung dieser Operation addieren wir den aktuellen Stapel (bis er eine Null erreicht) und legen die Summe auf den Off-Stapel. Das ist ziemlich banal, der interessante Teil ist, dass wir die Ergebnisse all dieser Läufe als unser Ergebnis zusammenfassen. Dadurch wird der gewünschte Wert berechnet. Warum? Schauen wir uns ein Beispiel an 123. Beim ersten Zupacken bekommen wir nur 1, also ist unser Wert 1

1

Beim nächsten Zupacken geben wir 1 plus 2 zurück

1
1+2

Beim letzten Lauf haben wir alle drei zusammen

1
1+2
1+2+3

Siehst du das dreieck Die Summe aller Läufe ergibt das "Dreieck" der Liste.


Ok, aber jetzt brauchen wir es, um für Nullen zu arbeiten. Hier habe ich den gleichen Trick wie DJMcMayhem verwendet, plus ein paar ausgefallene Schritte. Anstatt zu schleifen, bis wir eine Null erreicht haben, schleifen wir, bis der Stapel leer ist.

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

Ich benutzte dann diesen Tipp , der von niemand anderem als Ihrem geschrieben wurde, um weitere 2 Bytes abzuspielen.

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

Und da haben wir es. Ich wäre überrascht, wenn es eine kürzere Lösung gäbe, aber dann sind wieder seltsamere Dinge passiert.

Weizen-Assistent
quelle
Unfortunately for him I wasn't about to let him win at his own language :PIch erwarte nichts weniger von dir. : D
DJMcMayhem
6

JavaScript (ES6), 28 Byte

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

Übernimmt die Eingabe als Ziffernliste.

ETHproductions
quelle
5

Python 3 , 37 Bytes

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

Probieren Sie es online!

Geschäfts-Katze
quelle
5
... Warum die Gegenstimme?
Business Cat
Ich glaube , Sie ändern könnten , lenum sumals gut, obwohl ich glaube nicht , dass irgendetwas hilft.
ETHproductions
@ETHproductions Ja. Ich hatte gehofft, ich könnte die Tatsache nutzen, dass sum([])0 ist, aber nichts kam ganz zusammen ... es könnte aber einen Weg geben
Business Cat
Habe das nicht gesehen, sonst hätte ich dir meine Besserung gegeben.
Jonathan Allan
@ JonathanAllan Keine Sorge: P
Business Cat
5

C # (.NET Core) , 59 Byte

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

Probieren Sie es online!

Erheblich anders als die anderen C # -Antworten. Die Eingabe ist eine Liste von Ziffern. Alle im TIO-Link enthaltenen Testfälle.

Könnte eine Menge Bytes speichern, wenn Eingabe als rückwärts gerichtete Ziffernliste mit führender 0 zulässig ist.

Kamil Drakari
quelle
Gute Idee! Etwas heftiges Codegolfing in C #.
Grzegorz Puławski
Schöne lösung! Ist die Eingabe nicht als nicht negative Eingabe und nicht als Ziffernliste spezifiziert number?
Ian H.
@ IanH. Regel 2: Sie können die Eingabe und Ausgabe mit jedem zulässigen Mittel vornehmen. Wenn es um das Format geht, können Sie die Eingabe als Ganzzahl, als String-Darstellung der Ganzzahl oder als Ziffernliste verwenden.
Kamil Drakari
4

J , 7 Bytes

[:+/+/\

Probieren Sie es online! Nimmt eine Liste von Ziffern auf, wie z f 6 5 4 3 2 1.

Erläuterung

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

Ein bisschen zutreffender wäre das ursprüngliche Problem [:+/@,]/ , dass "sum" ( +/) die abgeflachten ( ,) Präfixe der Eingabe ( ]\) ist.

Conor O'Brien
quelle
4

Vim , 60 59 32 Tastenanschläge

Vielen Dank @CowsQuack für den Tipp mit dem rekursiven Makro und dem hTrick, das hat mir 27 Bytes erspart !

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

Probieren Sie es online!

Ungolfed / Erklärt

Dies wird das Dreieck wie beschrieben bilden (nur dass es linksbündig bleibt):

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

Der Puffer sieht nun so aus:

53716
5371
537
53
5

Füge alle Zeilen zu einer zusammen und erstelle daraus einen auswertbaren Ausdruck:

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

Das "Register enthält jetzt die folgende Zeichenfolge (Anmerkung: 0 fehlt):

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

Wir müssen also nur eine Null anhängen und auswerten:

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

innen vim

ბიმო
quelle
Sie können &(das gesamte Spiel) anstelle des \1Ersatzbefehls
Kritixi Lithos
1
qqYp$xq:exe"norm".col('.')."@q"⏎werden kann qqYp$xh@qq@q. Bei diesem rekursiven Makro tritt ein Unterbrechungsfehler auf, wenn sich ein Zeichen in der Zeile befindet. Danach wird es angehalten.
Kritixi Lithos
So kann die Substitution einfach werden :s/./&+/g. Auch :%j⏎können sich V{J. Und Dikann werden C(ich habe dies bereits in einer anderen Ihrer Vim-Antworten kommentiert). Probieren Sie es online!
Kritixi Lithos
3

Bash + GNU-Dienstprogramme, 32 24

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

Eingang von STDIN gelesen.

Update: Ich sehe, die Eingabe kann als Ziffernliste erfolgen. Meine Eingabeliste ist durch Zeilenumbrüche getrennt.

Probieren Sie es online aus .

Erläuterung

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
Digitales Trauma
quelle
3

APL, 4 Bytes

+/+\

Dies nimmt die Eingabe als eine Liste von Ziffern, zB:

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

Erläuterung

+/    sum of
  +\  partial sums of input
Marinus
quelle
3

Taxi , 1478 Bytes

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.

Probieren Sie es online!

Nicht golfen:

[ 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.
Ingenieur Toast
quelle
3

Perl 5 , 19 + 1 ( -p) = 20 Bytes

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

Probieren Sie es online!

Wie?

$ \ enthält die kumulative Summe, $ p die Summe der Ziffern in der aktuellen Zeile. Jede Zeile des Parallelogramms ist einfach die vorherige Zeile mit der nächsten Ziffer der angehängten Nummer. Daher ist es die Summe der vorherigen Zeile plus der neuen Ziffer. Dies iteriert über alle Ziffern und berechnet die Summen, wie es geht. Die tatsächliche Substitution ist irrelevant; Es ist nur ein Mittel, um die Ziffern zu durchlaufen, ohne eine tatsächliche Schleife zu erstellen. Am Ende wird $ \ implizit durch die -pOption ausgegeben.

Xcali
quelle
2

Gelee ,  5  4 Bytes

Ṛæ.J

Ein monadischer Link, der eine Liste mit Dezimalstellen erstellt und das Dreieck der Zahl zurückgibt, die in der Liste aufgeführt ist.

Probieren Sie es online!

Wie?

Ṛæ.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
Jonathan Allan
quelle
Ich hatte gedacht, das Entfernen würde immer noch funktionieren. Schade ...
ETHproductions
@ETHproductions ... und doch gibt es ein eingebautes, um zu helfen!
Jonathan Allan
... okay, wow ...
ETHproductions
@ETHproductions ooops musste es umkehren> _ <
Jonathan Allan
2

Retina , 13 Bytes

.
$`$&
.
$*
1

Probieren Sie es online! Link enthält Testfälle. Erläuterung: Die erste Stufe generiert alle Präfixe der ursprünglichen Nummer, die zweite Stufe konvertiert jede Ziffer in eine unäre und die dritte Stufe berechnet die Summe.

Neil
quelle
2

Mathematica, 49 Bytes

Tr@Array[Tr@s[[;;#]]&,Length[s=IntegerDigits@#]]&
J42161217
quelle
Sie können die Eingabe als Ziffernliste übernehmen. #.Range[Length@#,1,-1]&
Alephalpha
Verbesserung der @alephalpha-Lösung:#.Range[Tr[1^#],1,-1]&
JungHwan Min
Tr@*Accumulate
Alephalpha
2

Neim , 3 Bytes

𝐗𝐂𝐬

Erläuterung:

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

Probieren Sie es online!

Alternative Antwort:

𝐗𝐣𝐬

Erläuterung:

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

Probieren Sie es online!

Okx
quelle
2

Java 8, 53 Bytes

Ich habe für jeden akzeptablen Eingabetyp ein Lambda implementiert. Sie durchlaufen jeweils die Ziffern der Zahl und addieren jeweils das richtige Vielfache zu einem Akkumulator.

Ganzzahl als Eingabe (53 Bytes)

Lambda von Integerbis Integer:

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

Stringdarstellung als Eingabe (72 Bytes)

Lambda von Stringbis Integer:

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

Ziffernfeld als Eingabe (54 Byte)

Lambda aus int[] (von Ziffern, größter Stellenwert zuerst) bis Integer:

a->{int l=a.length,s=0;for(int n:a)s+=n*l--;return s;}
  • -7 Bytes dank Olivier Grégoire
Jakob
quelle
1
a -> {int l = a.Länge, s = 0; für (int n: a) s + = n * l -; Rückgabe s;} 54 Bytes für die Array-Version.
Olivier Grégoire
2

Pyt , 9 6 Bytes

ąĐŁř↔·

Erläuterung:

                 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
mudkip201
quelle
2

Python 3, 94 58 54 Bytes

Vielen Dank an Herrn Xcoder, der mir geholfen hat, einige Bytes zu sparen!

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

Probieren Sie es online!

Übernimmt die Eingabe als Zeichenfolge. Es multipliziert einfach jede Ziffer mit der Anzahl der Additionen und gibt ihre Summe zurück.

Manish Kundu
quelle
Schöne erste Antwort, aber bitte machen Sie Ihre Einsendung zu einem ernsthaften Anwärter, indem Sie unnötige Leerzeichen entfernen und alle Variablen- / Funktionsnamen 1 Byte lang machen. 69 Bytes
Mr. Xcoder
58 Bytes .
Mr. Xcoder
@ Mr.Xcoder Danke. Ich werde mir das merken.
Manish Kundu
1
Sie können nicht davon ausgehen, dass es immer mit aufgerufen wird0 . Wenn pimmer sein muss 0, sollten Sie das pmit p=0in der lambdaDeklaration ersetzen . Sie können jedoch nur pvollständig entfernen , um 54 Bytes zu erhalten
Caird Coinheringaahing
2

Common Lisp, 53 52 Bytes

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

Eingabe als Ziffernliste.

Probieren Sie es online!

-1 Byte dank @ceilingcat.

Renzo
quelle
@ceilingcat, einige Common Lisp-Compiler schlagen tatsächlich fehl, wenn sie applyauf sehr lange Listen angewendet werden call-arguments-limit.
Renzo