Triangolo un numero!


28

Siamo abituati al termine "quadratura" n per indicare il calcolo di n 2 . Siamo anche abituati al termine "cubing" n per indicare n 3 . Detto questo, perché non potremmo anche triangolare un numero?

Come triangolare un numero?

  • Prima di tutto, cerchiamo di scegliere un numero, 53716.

  • Posizionalo in un parallelogramma, la cui lunghezza laterale è uguale al numero di cifre del numero e ha due lati posizionati in diagonale, come mostrato di seguito.

        53716
       53716
      53716
     53716
    53716
    
  • Ora, vogliamo farlo, giusto? Per fare ciò, ritaglia i lati che non si adattano a un triangolo rettangolo:

        5
       53
      537
     5371
    53716
    
  • Prendi le somme di ogni riga, per questo esempio risultante in [5, 8, 15, 16, 22]:

        5 -> 5
       53 -> 8
      537 -> 15
     5371 -> 16
    53716 -> 22
    
  • Somma l'elenco [5, 8, 15, 16, 22], risultante 66. Questo è il triangolo di questo numero!

Specifiche e regole

  • L'ingresso sarà un numero intero non negativo n ( n ≥ 0, n ∈ Z ).

  • È possibile accettare input e fornire output con qualsiasi mezzo consentito .

  • L'input può essere formattato come un numero intero, una rappresentazione in formato stringa dell'intero o un elenco di cifre.

  • Scappatoie predefinite non consentite.

  • Questo è , quindi vince il codice più corto in byte!

Altri casi di test

Ingresso -> Uscita

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

Ispirazione. Le spiegazioni sono incoraggiate!


sei sicuro 645321 -> 91?
Rod

@Rod Siamo spiacenti, hai ragione. Ho scritto 645321invece di 654321.
Mr. Xcoder,

1
Posso prendere un input come un elenco di cifre?
totalmente umano il

@totallyhuman Sì, vedi la seconda specifica.
Mr. Xcoder,

1
Sfida interessante. Sono contento che tu sia stato ispirato dal mio!
Gryphon - Ripristina Monica il

Risposte:




12

Brain-Flak , 65, 50, 36 byte

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

Provalo online!

Dopo molte modifiche, ora sono molto orgoglioso di questa risposta. Mi piace l'algoritmo e quanto bene può essere espresso in scaglie di cervello.

Gran parte del conteggio dei byte deriva dalla gestione di 0 nell'input. In effetti, se potessimo presumere che non ci fossero 0 nell'input, sarebbe una risposta meravigliosamente breve di 20 byte:

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

Provalo online!

Ma sfortunatamente, il brain-flak è noto per la cattiva gestione dei casi limite.

Spiegazione

Innanzitutto, una mia osservazione:

Se l'input è lungo n cifre, la prima cifra apparirà nel triangolo n volte, la seconda cifra apparirà n-1 volte e così via sull'ultima cifra, che apparirà una volta. Possiamo trarne vantaggio, dal momento che è davvero facile calcolare quante cifre di input sono rimaste nel cervello, ovvero

[]

Quindi ecco come funziona il codice.

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

Il mio consiglio qui può farti risparmiare due byte
Wheat Wizard il





7

Japt , 7 6 4 byte

å+ x

Provalo online!

Spiegazione

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

Vecchia soluzione:

å+ ¬¬x

Provalo online!

Spiegazione

å+ ¬¬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 sandbox molto? O hai letto la domanda, scritto il codice e pubblicato tutto in un minuto ?!
Jonathan Allan,

@JonathanAllan Questo non è stato sandbox. È molto più semplice di quanto si pensi.
Mr. Xcoder,

1
Beh, non riesco nemmeno a leggere la domanda nel tempo impiegato
Jonathan Allan,

@JonathanAllan Nessuna lettura sandbox, mi è capitato di catturare la domanda subito dopo la sua pubblicazione e di elaborare un algoritmo quasi immediatamente.
ETHproductions

Welp mi ci sono voluti ~ 4 minuti per leggere la domanda, quindi +1 per la lettura della velocità / comprensione della velocità :)
Jonathan Allan

7

Brain-Flak , 28 byte

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

Provalo online!

14 byte se non abbiamo bisogno di supportare zeri (cosa che facciamo)

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

Provalo online!

DJMcMayhem ha una bella risposta qui che dovresti dare un'occhiata. Sfortunatamente per lui non avevo intenzione di lasciarlo vincere nella sua lingua: P

Come funziona?

Cominciamo con la versione semplice.

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

L'azione principale qui è ({}<>{})<>, che prende la parte superiore della pila a sinistra e si aggiunge alla parte superiore della pila a destra. Effettuando il ciclo di questa operazione sommiamo lo stack corrente (fino a quando non raggiunge uno zero) posizionando la somma sullo stack off. È piuttosto banale, la parte interessante è che riassumiamo i risultati di tutte queste piste come risultato. Questo calcolerà il valore desiderato. Perché? Bene, diamo un'occhiata a un esempio 123,. Al primo grab prendiamo solo 1, quindi il nostro valore è 1

1

Alla prossima presa restituiamo 1 più il 2

1
1+2

Nell'ultima corsa abbiamo tutti e tre insieme

1
1+2
1+2+3

Vedi il triangolo? La somma di tutte le corse è il "triangolo" dell'elenco.


Ok ma ora ne abbiamo bisogno per funzionare con gli zeri, qui ho usato lo stesso trucco di DJMcMayhem, oltre ad alcuni fantasiosi footwork. Invece di eseguire il looping fino a raggiungere uno zero, eseguiamo il looping fino a quando lo stack non è vuoto.

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

Ho quindi usato questo suggerimento , scritto nientemeno che dal tuo, per giocare a golf con altri 2 byte.

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

E lì ce l'abbiamo. Sarei sorpreso se ci fosse una soluzione più breve, ma poi sono successe cose più strane.


Unfortunately for him I wasn't about to let him win at his own language :PNon mi aspetto niente di meno da te. : D
DJMcMayhem

6

JavaScript (ES6), 28 byte

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

Accetta input come un elenco di cifre.


5

Python 3 , 37 byte

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

Provalo online!


5
... Perché il downvote?
Business Cat

Penso che si potrebbe cambiare lena sumcome bene, anche se non credo che aiuta nulla.
ETHproductions

@ETHproductions Sì. Speravo di poter sfruttare il fatto che sum([])è 0, ma niente stava andando bene insieme ... potrebbe esserci un modo però
Business Cat

Non l'ho visto altrimenti ti avrei dato il mio miglioramento.
Jonathan Allan,

@JonathanAllan Nessun problema: P
Business Cat

5

C # (.NET Core) , 59 byte

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

Provalo online!

Sostanzialmente diverso dalle altre risposte C #. L'input è un elenco di cifre. Tutti i casi di test inclusi nel collegamento TIO.

Potrebbe salvare un mucchio di byte se fosse consentito accettare input come un elenco di cifre all'indietro con 0 iniziale.


Bella idea! Qualche feroce codegolfing in C #.
Grzegorz Puławski,

Bella soluzione! Ma l'input non è specificato per essere un non negativo number, non un elenco di cifre?
Ian H.

@IanH. Regola 2: è possibile accettare input e fornire output con qualsiasi mezzo consentito. Quando si tratta del formato, è possibile prendere l'input come numero intero, come rappresentazione String dell'intero o come elenco di cifre.
Kamil Drakari,


4

J , 7 byte

[:+/+/\

Provalo online! Prende un elenco di cifre, ad esempio f 6 5 4 3 2 1.

Spiegazione

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

Un po 'più fedele al problema originale sarebbe [:+/@,]/, che è "sum" ( +/) i ,prefissi flattened ( ) dell'input ( ]\).


4

Vim , 60 59 32 sequenze di tasti

Grazie mille @CowsQuack per il suggerimento con la macro ricorsiva e il htrucco, questo mi ha salvato 27 byte!

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

Provalo online!

Ungolfed / Spiegato

Questo costruirà il triangolo come descritto (solo che lo mantiene allineato a sinistra):

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

Il buffer ora ha questo aspetto:

53716
5371
537
53
5

Unisci tutte le linee in una e costruisci un'espressione valutabile da essa:

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

Il "registro ora contiene la seguente stringa (nota mancante 0):

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

Quindi tutto ciò che dobbiamo fare è aggiungere uno zero e valutarlo:

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

dentro vim


Puoi usare &(l'intera partita) invece che \1nel comando sostitutivo
Kritixi Lithos

1
qqYp$xq:exe"norm".col('.')."@q"⏎può diventare qqYp$xh@qq@q. Questa macro ricorsiva incontrerà un errore di rottura quando c'è un carattere sulla linea, dopo di che si fermerà.
Kritixi Lithos,

Quindi la sostituzione può diventare :s/./&+/g. Inoltre :%j⏎può diventare V{J. E, Dipuò diventare C(ho già commentato questo in un'altra delle tue risposte di Vim). Provalo online!
Kritixi Lithos,


3

Utilità Bash + GNU, 32 24

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

Ingresso letto da STDIN.

Aggiornamento: vedo che l'input può essere dato come un elenco di cifre. La mia lista di input è delimitata da newline.

Provalo online .

Spiegazione

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 byte

+/+\

Questo prende l'input come un elenco di cifre, ad esempio:

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

Spiegazione

+/    sum of
  +\  partial sums of input

3

Taxi , 1478 byte

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.

Provalo online!

Un-giocato a golf:

[ 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 byte

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

Provalo online!

Come?

$ \ contiene il totale cumulativo, $ p contiene il totale delle cifre sulla riga corrente. Ogni riga del parallelogramma è semplicemente la riga precedente con la cifra successiva del numero aggiunto. Pertanto, è la somma della riga precedente più la nuova cifra. Questo scorre su tutte le cifre, calcolando le somme mentre procede. La sostituzione effettiva è irrilevante; è solo un mezzo per scorrere le cifre senza creare un ciclo reale. Alla fine, $ \ viene stampato implicitamente -pdall'opzione.



2

Gelatina ,  5  4 byte

Ṛæ.J

Un collegamento monadico che prende un elenco di cifre decimali e restituisce il triangolo del numero rappresentato dall'elenco.

Provalo online!

Come?

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

Pensavo che la rimozione avrebbe comunque funzionato. Peccato ...
ETHproductions

@ETHproductions ... eppure è integrato per aiutarti!
Jonathan Allan,

... ok, wow ...
ETHproductions

@ETHproductions ooops ha dovuto invertirlo> _ <
Jonathan Allan

2

Retina , 13 byte

.
$`$&
.
$*
1

Provalo online! Il link include casi di test. Spiegazione: Il primo stadio genera tutti i prefissi del numero originale, il secondo stadio converte ogni cifra in unaria e il terzo stadio prende il totale.


2

Mathematica, 49 byte

Tr@Array[Tr@s[[;;#]]&,Length[s=IntegerDigits@#]]&

È possibile prendere l'input come un elenco di cifre. #.Range[Length@#,1,-1]&
alephalpha,

Miglioramento della soluzione di #.Range[Tr[1^#],1,-1]&
@alephalpha

Tr@*Accumulate
alephalpha,

2

Neim , 3 byte

𝐗𝐂𝐬

Spiegazione:

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

Provalo online!

Risposta alternativa:

𝐗𝐣𝐬

Spiegazione:

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

Provalo online!


2

Java 8, 53 byte

Ho implementato un lambda per ogni tipo di input accettabile. Ognuno scorre attraverso le cifre del numero, aggiungendo il multiplo corretto di ciascuno a un accumulatore.

Numero intero come input (53 byte)

Lambda da Integera Integer:

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

Rappresentazione di stringhe come input (72 byte)

Lambda da Stringa Integer:

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

Cifra array come input (54 byte)

Lambda da int[](di cifre, prima il più grande valore del luogo) a Integer:

a->{int l=a.length,s=0;for(int n:a)s+=n*l--;return s;}
  • -7 byte grazie a Olivier Grégoire

1
a -> {int l = a.length, s = 0; per (int n: a) s + = n * l -; return s;} 54 byte per la versione dell'array.
Olivier Grégoire,

2

Pyt , 9 6 byte

ąĐŁř↔·

Spiegazione:

                 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 byte

Grazie a Mr. Xcoder per avermi aiutato a salvare un bel po 'di byte!

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

Provalo online!

Accetta l'input come stringa. Moltiplica semplicemente ogni cifra per il numero di volte che deve essere aggiunta e restituisce la loro somma.


Bella prima risposta, ma rendi la tua richiesta un serio contendente rimuovendo gli spazi bianchi non necessari e rendendo tutti i nomi di variabili / funzioni lunghi 1 byte. 69 byte
Mr. Xcoder il


@ Mr.Xcoder Grazie. Lo terrò a mente.
Manish Kundu,

1
Non puoi presumere che verrà sempre chiamato con0 . Se pdeve essere sempre 0, è necessario sostituire il pcon p=0nella lambdadichiarazione. Tuttavia, è possibile rimuoverlo pcompletamente per ottenere 54 byte
caird coinheringaahing


2

Lisp comune, 53 52 byte

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

Immettere come elenco di cifre.

Provalo online!

-1 byte grazie a @ceilingcat.


@ceilingcat, alcuni compilatori Common Lisp falliranno effettivamente quando applyvengono applicati a liste molto lunghe a causa del call-arguments-limit.
Renzo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.