Sommalo con un triangolo digitale


28

Bene, riassumilo davvero.

Scrivi un programma o una funzione che contiene un elenco non vuoto di numeri decimali (0-9) e genera un "triangolo" di cifre rivolto verso il basso con l'elenco di input in alto dove ogni cifra dopo la prima riga è la somma delle due cifre sopra di esso modulo 10.

Ad esempio, l'input [7, 5, 0, 9]ha prodotto un output

7 5 0 9
 2 5 9
  7 4
   1

perché 2è (7 + 5) mod 10, 5è (5 + 0) mod 10, 9è (0 + 9) mod 10, ecc. fino 1all'essere (7 + 4) mod 10.

Se l'elenco contiene solo un elemento, l'output corrisponde all'input; ad esempio, un input di [4]renderà

4

Ecco alcuni esempi aggiuntivi:

[0]

0

[1, 2]

1 2
 3

[8, 7]

8 7
 5

[0, 0]

0 0
 0

[1, 4, 2]

1 4 2
 5 6
  1

[0, 1, 0]

0 1 0
 1 1
  2

[1, 0, 0, 0]

1 0 0 0
 1 0 0
  1 0
   1

[1, 2, 3, 4]

1 2 3 4
 3 5 7
  8 2
   0

[1, 2, 3, 5, 8]

1 2 3 5 8
 3 5 8 3
  8 3 1
   1 4
    5

[9, 2, 4, 5, 3, 2, 2]

9 2 4 5 3 2 2
 1 6 9 8 5 4
  7 5 7 3 9
   2 2 0 2
    4 2 2
     6 4
      0

Si noti che nell'output:

  • La prima riga non ha spazi iniziali.
  • Ogni riga successiva ha uno spazio iniziale in più rispetto alla riga precedente.
  • Le cifre sono separate da un singolo spazio.
  • A ogni riga è consentito avere fino a uno spazio finale.
  • Potrebbe esserci una nuova riga finale finale opzionale.
  • È necessario utilizzare i caratteri per le normali cifre decimali (da 0 a 9).

Vince il codice più breve in byte. Tiebreaker è la risposta precedente.


1
Per prima cosa ho letto il titolo come "Trauma digitale"
cat

Risposte:


24

BrainF ** k, 396 391 byte

>+>>++++[-<++++++++>]->,----------[++++++++++.>>++++++++[-<++++<------>>]<.,----------]-<+[-<+]->>+[-<<<<<++++++++++.[-]>[-<+>>.<]<[->+<]>+>>>[[->+]->>+<<<+[-<+]->]>+[-<->[[->+]->+>>+<<<<+[-<+]->]<+>->+[->+]->>[->+<]>+>++++++++++>>-<<[-<-[>>]<]<->>>+[-<<<+>>>[-<->]<+++++++++>>>+]++++++++[-<++++<++++++>>]<<<[-<<<<+[-<+]-<+>>+[->+]->>>>+<]>.>.[-]<[-]<<<[->+<]<<+[-<+]>+]>>[-]<<<-<+[-<+]->>+]

Non ho resistito alla tentazione di farlo. Almeno il triangolo è rivolto verso il basso.

L'input arriva come una stringa di caratteri numerici seguita da una singola nuova riga.

L'output conterrà un singolo spazio finale su ogni riga.

Esempi:

$ bf sd.bf
010
0 1 0 
 1 1 
  2 

$ bf sd.bf
123456
1 2 3 4 5 6 
 3 5 7 9 1 
  8 2 6 0 
   0 8 6 
    8 4 
     2 

$ bf sd.bf
9245322
9 2 4 5 3 2 2 
 1 6 9 8 5 4 
  7 5 7 3 9 
   2 2 0 2 
    4 2 2 
     6 4 
      0 

Spiegazione

Poiché è piuttosto difficile spiegare il codice da una prospettiva funzionale, possiamo invece guardarlo dalla prospettiva dello stato del nastro in varie occasioni. L'idea di base qui è che il triangolo che emettiamo viene inizializzato come un array compatto (per BF, comunque) che si restringe di dimensioni di 1 ogni iterazione di un ciclo. Un altro pensiero importante è che usiamo 255per indicare un "segnaposto" che possiamo cercare sul nastro.

Inizializzazione

Questo è il passo più semplice. All'inizio del programma, eseguiamo quanto segue:

>+>>++++[-<++++++++>]->

Ciò forza il nastro nel seguente stato (dove >N<indica la posizione del puntatore sul nastro)

[ 0 1 32 255 >0< 0 0 ...]

Il primo numero qui è una posizione "buffer". Non lo useremo a lungo termine, ma è utile per semplificare le operazioni e per copiare i dati.
Il secondo numero è il numero di spazi che verrà distribuito all'inizio di ogni riga, iniziando dopo la prima riga. La prima riga non avrà spazi iniziali.
Il terzo numero è il carattere spaziale che emettiamo.
Il quarto numero è un segnaposto 255, in modo che possiamo tornare in questa posizione relativamente facilmente.

Ingresso

Da questa posizione, leggeremo tutti i personaggi. Alla fine di questo passaggio, speriamo di trovarci nella seguente situazione:

[ 0 1 32 255 a b c d e f ... >255< 0 0 ... ]

Dove a b c d e f ...indica la stringa di caratteri numerici che è stata immessa (non la nuova riga).

Realizziamo questo con il seguente:

,----------[++++++++++.>>++++++++[-<++++<------>>]<.,----------]-

Ci sono alcune sfumature a questo. Prima di tutto, daremo in uscita ogni personaggio man mano che li otteniamo, e quindi produciamo uno spazio dopo di esso. In secondo luogo, non vogliamo copiare il valore ASCII sul nastro, vogliamo copiare la cifra numerica effettiva. Terzo, vogliamo fermarci quando colpiamo una newline e ci lasciamo in un buon posto in quel momento.
Di 'che il nostro input è 6723. Quindi, dopo aver letto il primo 6, il nostro nastro si presenta così:

[ 0 1 32 255 >54< 0 0 ...]

Controlliamo che questo valore non sia uguale a 10(una nuova riga ASCII) con ,----------[++++++++++. Quindi stampiamo il valore e continuiamo sottraendo contemporaneamente 48 dal valore di input e aggiungendo 32 al valore accanto ad esso ( >>++++++++[-<++++<------>>]<), lasciandoci qui:

[ 0 1 32 255 6 >32< 0 ...]

Si noti come durante questo processo possiamo supporre che tutte le cifre a destra del nostro input siano 0 - questo significa che non corriamo il rischio di rovinare alcuno stato precedente se usiamo i valori a destra per calcolare 6 * 8e 4 * 8.
Ora produciamo il carattere dello spazio che abbiamo appena generato e riceviamo un nuovo input, eliminando lo spazio che abbiamo calcolato lì. Alla fine, l'input verrà terminato da una nuova riga e il loop uscirà, lasciando un punto in 255cui la nuova riga sarebbe stata ( ,----------]-). Questo è il secondo personaggio segnaposto che useremo per navigare nel nastro. A questo punto del nostro scenario, il nostro nastro è esattamente questo:

[ 0 1 32 255 6 7 2 3 >255< 0 0 ... ]

Calcolo

Il modo in cui funziona è che l'elenco delle cifre tra i nostri 255segnaposto si ridurrà di uno ogni iterazione del ciclo. Quando è rimasta solo una cifra, abbiamo finito e dovremmo fermarci immediatamente (nota che, a questo punto, ogni cifra in quella lista è già stata emessa, quindi non dobbiamo preoccuparci di inviarla di nuovo).

Ora usiamo questo trucco per navigare al primo 255segnaposto: <+[-<+]-. Questo cerca efficacemente il nastro a sinistra per un 255, senza cambiare nulla nel mezzo. Ora che abbiamo spostato il puntatore, possiamo verificare la nostra condizione di uscita: se c'è solo una cifra nell'elenco, allora la cella con due spazi a destra conterrà 255. Quindi, controlliamo contro questo e iniziamo un ciclo:>>+[-<<

Il primo passo nel nostro ciclo è quello di creare una nuova riga. Quindi passiamo alla prima cella (la nostra cella buffer), aggiungiamo 10 e output. Il passaggio successivo consiste nell'output di tutti i caratteri spaziali iniziali. Dopo averli emessi, aumentiamo il nostro conteggio per il numero di spazi iniziali. Questi passaggi sono eseguiti dai seguenti:

-<<<<<++++++++++.[-]>[-<+>>.<]<[->+<]>+>>>

Che ci lascia in questo stato:

[ 0 2 32 255 >6< 7 2 3 255 0 0 0 0 0 0 ]

Il nostro prossimo passo è copiare il primo valore nell'elenco, oltre il secondo segnaposto 255:

[[->+]->>+<<<+[-<+]->]

Sostanzialmente lo facciamo saltando avanti e indietro tra i nostri segnaposto 255, lasciandoci qui:

[ 0 2 32 255 >0< 7 2 3 255 0 6 0 0 ... ]

Ora iniziamo un ciclo, ripetendo il resto dell'elenco, fermandoci quando colpiamo 255:>+[-<

A questo punto, la cifra alla nostra sinistra immediatamente è sempre 0. Quindi, poiché li adoriamo, inseriamo un segnaposto 255in modo che possiamo tornare al nostro posto nell'elenco. Il passaggio successivo è spostare il secondo posto nell'elenco nelle posizioni circostanti in cui abbiamo spostato il primo posto, oltre il secondo segnaposto 255. Questi passaggi sono eseguiti dai seguenti:

->
[[->+]->+>>+<<<<+[-<+]->]

Lasciandoci qui: [ 0 2 32 255 255 >0< 2 3 255 7 6 7 0 ] Ora, sia l' 6e 7sono stati spostati in una posizione in cui può verificarsi il calcolo. Abbiamo bisogno di due copie del 7perché anche il prossimo numero nell'elenco ne avrà bisogno. Il 7immediatamente dopo 255serve a questo scopo, mentre l'altro 7sarà consumato dal calcolo.

Innanzitutto, aggiungiamo le due cifre:

<+>->+[->+]->>
[->+<]>

Lasciandoci qui:

[ 0 2 32 255 0 255 2 3 255 7 0 >13< 0 ]

La prossima combinazione di passaggi è la più complicata. Dobbiamo vedere se il numero a cui stiamo puntando è maggiore di 10 e se lo è, sottraggiamo 10. In realtà, ciò che facciamo è sottrarre 10 da esso e vedere se colpisce 0in qualsiasi punto della sottrazione. In tal caso, aggiungeremo 10più tardi. Alla fine, dovremmo avere la somma modulo 10.

Prepare a 10 to the right
+>++++++++++
Leave yet another 255 for a loop condition later
>>-<<
If the number is greater than 10 end up one space to the left
else one space to the right
[-<-[>>]<]<->
Check if the previous 255 is two spaces to the right and if it is
add 10 back to our sum--we've subtracted too much
>>+[-<<<+>>>[-<->]<+++++++++>>>+]

A questo punto, abbiamo raggiunto l'obiettivo. Abbiamo la somma modulo 10! Inoltre, indipendentemente dal fatto che il numero fosse maggiore di 10, finiremo qui:

[ 0 2 32 255 0 255 2 3 255 7 0 3 0 0 >0< ]

I nostri prossimi obiettivi sono produrre questa nuova somma, seguirla con uno spazio e reinserirla nel nostro elenco. Facciamo tutto questo con le nostre precedenti tecniche di 255-hopping e aggiunta 48alla nostra somma, quindi non lo tratterò in dettaglio.

++++++++[-<++++<++++++>>]
<<<[-<<<<+[-<+]-<+>>+[->+]->>>>+<]
>.>.

E siamo qui: [ 0 2 32 255 3 255 2 3 255 7 0 0 51 >32< ] notate come inseriamo un 255segnaposto aggiuntivo dopo la nostra nuova iniezione in 3modo da non perdere posto nella lista. A questo punto, abbiamo generato la nostra somma e il suo spazio, quindi abbiamo bisogno di ripulire e tornare a uno stato in cui la prossima iterazione di questo ciclo funzionerà. Abbiamo bisogno di cancellare il nostro 51e le 32cellule, spostare il7 volta verso destra e navigare verso il segnaposto del nostro elenco in modo da poter ricominciare da capo.

[-]<[-]<<<[->+<]<<+[-<+]

Ora siamo qui: [ 0 2 32 255 3 >0< 2 3 255 0 7 0 ... ]
che è esattamente dove vogliamo essere per la nostra prossima iterazione. Quindi controlla 255 e vai avanti! ( >+])

Quando usciremo dal ciclo, avremo un nuovo elenco - composto dalle somme dell'elenco precedente. La prima volta, sembrerà così:

 [ 0 2 32 255 3 9 5 0 >0< ]

Ora vogliamo ripetere l'intero processo nel nostro nuovo elenco, quindi ploppiamo 255verso il basso a sinistra e ricominciamo da capo! Dobbiamo fare un po 'di pulizia con >>[-]<<, quindi rilasciare il nostro segnaposto <-. Dopodiché, siamo esattamente nello stesso posto in cui eravamo dopo l'input, quindi possiamo cavarcela facendo gli stessi controlli: <+[-<+]->>+e boom! Abbiamo il nostro ciclo completo! Tutti abbiamo bisogno è la parentesi di chiusura, e quando finisce abbiamo già uscita tutto, così abbiamo finito: ].


Bentornato a proposito :) Non hai risposto dal 2015: o
Calvin's Hobbies,

1
@HelkaHomba Lo so! Continuo a visitare con una certa frequenza, ma non ho potuto resistere a scrivere il codice per questo. È perfetto per la lingua :)
BrainSteel,

9
"Perfect for BF" è un concetto che mi elude :-)
Luis Mendo il

7

Gelatina , 20 19 18 byte

Ṛ+2\Ṗп%⁵z”@ṚZGḟ”@

Provalo online!

sfondo

Generare i numeri è semplice in Jelly. L'output è un po 'più complicato.

Jelly ha un atomo di griglia incorporato ( G) che visualizza un elenco 2D con nuove righe tra le righe e spazi tra le colonne. Prendiamo l'array di numeri 2D (generato con ogni riga invertita) e lo trasponiamo con il valore di riempimento @. Dopo aver riverito l'array risultante e aver trasposto nuovamente, l'applicazione Gproduce quanto segue.

9 2 4 5 3 2 2
@ 1 6 9 8 5 4
@ @ 7 5 7 3 9
@ @ @ 2 2 0 2
@ @ @ @ 4 2 2
@ @ @ @ @ 6 4
@ @ @ @ @ @ 0

Per ottenere la forma triangolare desiderata, tutto ciò che dobbiamo fare è rimuovere il valore di riempimento.

Come funziona

Ṛ+2\Ṗп%⁵z”@ṚZGḟ”@  Main link. Argument: A (list of integers)

Ṛ                   Reverse A.
    Ṗп             While there's more than one element:
 +2\                  Compute the pairwise sum.
                    Collect all intermediate results in a list.
       %⁵           Take all resulting integers modulo 10.
         z”@        Transpose with fill value '@'.
            Ṛ       Reverse the order of the rows.
             Z      Transpose.
              G     Grid.
               ḟ”@  Filter; remove the fill value.

5

Pyth - 18 byte

j.e+*dkjdbP.ueM+Vt

Test Suite .

j                                       Join by newlines
 .e                                     Loop over seq in var b and index in var k
  +                                     Concatenate
   *dk                                  Space repeated k times
    jdb                                 Join b by spaces
  P                                     [:-1] to get rid of empty line
   .u             (Q implicit)          Cumulative fixed point over input (var G)
    eM                                  Mod 10 mapped over list
     +V                                 Vectorized addition
      t(G implict)                      G[1:]
      (G implict)                       Vectorize cuts this off to G[:-1]

5

Python 3.5, 74 72 71 byte

f=lambda L,*S:f([sum(x)%10for x in zip(L,L[1:print(*S,*L)]or 1)],'',*S)

L'input è un elenco di numeri interi (ad es. f([1,2,3,5,8])), L'output è STDOUT. Il %10fatto che maprestituisca un mapoggetto in Python 3 è un po 'fastidioso, il che significa che non possiamo farlomap(lambda*x:sum(x)%10,L,L[1:]) o simili.

La funzione si disattiva, ma a quel punto l'output sarebbe stato completato. Grazie a @xsot per -1 byte trovando un buon posto dove attaccare print.


3
Non ho installato 3.5 ma questo dovrebbe funzionare:f=lambda L,*S:f([sum(x)%10for x in zip(L,L[1:print(*S,*L)]or 1)],'',*S)
xsot

1
@xsot Questo è ... un uso straordinario di None!
Sp3000,

Come printrestituisce qualcosa? Non conosco la printfunzione di ritorno.
Erik the Outgolfer,

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Oh aspetta, vuoi dire che la printfunzione di Python ritorna - sì, ritorna Noneal completamento
Sp3000,

Voglio dire, quanto è utile Noneper tagliare?
Erik the Outgolfer,

5

05AB1E , 20 19 17 byte

Codice:

DvNð×?T%Ððý,¦‚ø€O

Spiegazione:

D                     # Duplicate the input.
 v                    # Map over it, running the following len(input) times.
  Nð×                 # Multiply the iteration number with a space.
     ?                # Pop and print without a newline.
      T%              # Take all integers modulo 10.
        Ð             # Triplicate the array.
         ðý,          # Join by spaces and print with a newline.
            ¦         # Remove the first element of the array.
             ‚        # Wrap it up, (pop a, b push [a, b]).
              ø       # Zip.
               €O     # Sum up each element.

Usa il codifica CP-1252 . Provalo online! .


4

MATL, 32 30 29 28 27 26 25 24 byte

t"X@qZ"y1X9&VhDTTH&Y+10\

1 byte salvato grazie a @Luis

Provalo online!

Versione modificata per tutti i casi di test

Spiegazione

        % Implicitly grab input
t       % Duplicate the input
"       % For each element of the input (really just a shortcut to loop numel(input) times)
  X@q   % Determine the current loop index and subtract 1
  Z"    % Create an array of blanks this size (these are the padding to the left)
  y     % Copy the current array of numbers from the stack
  1X9   % Get the pre-defined output format of %.15g from the clipboard
  &V    % Convert the input to it's character representation with single spacing
  h     % Horizontally concatenate the left padding and the numbers
  D     % Display the result (consumes the string)
  TT    % Create a two-element vector of 1's ([1 1])
  H&Y+  % Convolve [1 1] with the array (computes the pair-wise sum)
  10\   % Mod 10 the result
        % Implicitly close for loop

Bello! Stavo cercando di trovare un modo per ottenere gli spazi principali. Ho dimenticato le Vspecifiche del formato. Puoi salvare 1 byte usando Z"invece di O: vedi questo link (sto riscontrando problemi con il formato nel commento)
Luis Mendo

@LuisMendo Grazie per la punta! Sì, ho ottenuto le specifiche del formato da Dcui utilizza quel singolo spazio tra i numeri per impostazione predefinita.
Suever,

2

In realtà, 43 byte

;l;D+#"{:^%d}"%╗W;' j1╟╜f.;pXZ`i+9u@%`MdXWX

Provalo online!

Questo programma stampa una nuova riga finale dopo l'output.

Spiegazione:

;l;D+#"{:^%d}"%╗W;' j1╟╜f.;pXZ`i+9u@%`MdXWX
;l;D+                                        calculate the width of the field (2L-1 where L = len(input))
     #"{:^%d}"%╗                             push to a list, make a Python new-style format string for centering text, save in reg0
                W;' j1╟╜f.;pXZ`i+9u@%`MdXW   while the top of the stack is truthy:
                 ;' j1╟                        duplicate list, join with spaces, push string to a list
                       ╜f.                     center string and print  
                          ;pXZ                 zip list with itself shifted forward by 1 (zip(a,a[1:]))
                              `i+9u@%`M        map: add each pair and mod by 10
                                       dX      discard the last value (which was not added with anything)
                                          X  discard the now-empty list after the loop to avoid printing it

2

Mathematica, 67 byte

MatrixForm@NestList[Mod[Total/@Partition[#,2,1],10]&,#,Length@#-1]&

Esempio:inserisci qui la descrizione dell'immagine


2

CJam, 25 byte

q~{_2ew::+Af%}h;]eeSff*N*

Provalo online!

Spiegazione

Questo utilizza un trucco abbastanza accurato per generare il layout del triangolo.

q~      e# Read and evaluate input.
{       e# While the list of digits is non-empty...
  _2ew  e#   Duplicate and get all sublists of length 2.
  ::+   e#   Sum each pair.
  Af%   e#   Take each result modulo 10.
}h
;]      e# Discard the final empty list and wrap the others in an array.
ee      e# Enumerate the array. E.g. for input `[7 5 0 9]` we now get this:
        e# [[0 [7 5 0 9]]
        e#  [1 [2 5 9]]
        e#  [2 [7 4]]
        e#  [3 [1]]]
Sff*    e# Perform S* on each element at depth two. For the integers from the
        e# enumeration this gives a string of that many spaces, i.e. the correct
        e# indentation. For the lists of digits this inserts a space character
        e# between every two digits, thereby spacing out the digits as necessary.
N*      e# Put linefeeds between the pairs of indentation and digit list.

1

JavaScript (ES6) 147 byte

a=>{o=0;e=(c=>console.log(' '.repeat(o++)+c.join` `));l=1;while(l){p=0,d=[],e(a),a.map(b=>{p?d.push((v+b)%10):0;p=1,v=b});d.length<2?l=0:a=d};e(d)}

Hmm, ho un paio di idee per giocare a golf
Bálint,


1

Pyke, 21 byte

lVDm}R$],FsT%)od*pKDP

Provalo qui!

Mi piacerebbe pensare che questo metodo sia un po 'diverso.

[1, 2, 3, 5, 8] - take the input
[2, 4, 6, 10, 16] - double it
[1, 2, 3, 5, 8] - take the input again
[1, 1, 2, 3] - get the deltas
[[2,1], [4,1], [6,2], [10,3]] - transpose them together
[3, 5, 8, 13] - apply addition
[3, 5, 8, 3] - mod 10

1

Perl 6 ,  65 63 62  61 byte

{put ' 'x my$++,$_ for @_,{.rotor(2=>-1).map(*.sum%10).list}...1}
{put ' 'x my$++,$_ for @_,{@(.rotor(2=>-1).map(*.sum%10))}...1}
{put ' 'x my$++,$_ for @_,{@(map *.sum%10,.rotor(2=>-1))}...1}
{put ' 'x my$++,$_ for @_,{[map *.sum%10,.rotor(2=>-1)]}...1}

Spiegazione:

{ # anonymous block that takes the list as input (@_)

  put # print with trailing newline

    ' ' x ( my $ )++, # pad with one more space than previous iteration
    $_                   # the list to print for this iteration
    # The 「.Str」 method on a List puts spaces between elements
    # which is what 「put」 calls on anything that isn't a Str

  for # do that for every list produced from the following

    @_, # the input list

    { # anonymous block that takes the previous list as input ($_)

      [ # turn the following from a Seq into an Array

        map
          *.sum % 10, # sum the values and modulus 10 of the following:

          # take the previous list 2 at a time, backing up one
          $_.rotor( 2 => -1 )

      ]

    }

    ... # repeatedly call that block until:

    1   # the result is only one element long
}

Esempio:

my &digital-triangle-sum = {put ' 'x my$++,$_ for @_,{[map *.sum%10,.rotor(2=>-1)]}...1}

for [7,5,0,9], [0,1,0], [1,0,0,0], [9,2,4,5,3,2,2] -> \List {
   digital-triangle-sum List

   put '';
}
7 5 0 9
 2 5 9
  7 4
   1

0 1 0
 1 1
  2

1 0 0 0
 1 0 0
  1 0
   1

9 2 4 5 3 2 2
 1 6 9 8 5 4
  7 5 7 3 9
   2 2 0 2
    4 2 2
     6 4
      0


@Mego risolto
Brad Gilbert b2gills il

1

TSQL, 198 194 191 byte

Usando GOTO invece di uno dei WHILE, sono stato in grado di giocare a golf 3 personaggi

golfed

DECLARE @ varchar(100)= '1 2 3 4 5 6 7'

DECLARE @j INT=1,@i INT=LEN(@)a:
PRINT @
WHILE @i>@j
SELECT
@=STUFF(@,@i-1,2,RIGHT(SUBSTRING(@,@i-2,1)+SUBSTRING(@,@i,1)*1,1)+' '),@i-=2SELECT
@=STUFF(@,@j,1,' '),@j+=1,@i=LEN(@)IF @i>0GOTO a

Provalo online (usando il vecchio script con 2 * WHILE)


1

Java 7, 230 215 213 byte

int c=0;void m(int[]a){int l=a.length,j=-1,i=-1;if(l<1)return;int[]x=new int[l-1];while(++j<c)p(" ");for(;++i<l;p(a[i]+" "))if(i<l&i>0)x[i-1]=(a[i-1]+a[i])%10;p("\n");c++;m(x);}<T>void p(T s){System.out.print(s);}

Questo ha finito per essere un po 'più lungo di quanto pensassi .. Forse può essere giocato un po' di più però, dal momento che ho un po 'incasinato penso ..

Alcuni byte salvati grazie a @GiacomoGarabello .

Codice non testato e test:

Provalo qui.

class Main{
  static int c = 0;

  static void m(int[] a){
    int l = a.length,
        j = -1,
        i = -1;
    if(l < 1){
      return;
    }
    int[] x = new int[l-1];
    while(++j < c){
      p(" ");
    }
    for(; ++i < l; p(a[i] + " ")){
      if(i < l & i > 0){
        x[i - 1] = (a[i - 1] + a[i]) % 10;
      }
    }
    p("\n");
    c++;
    m(x);
  }

  static <T> void p(T s){
    System.out.print(s);
  }

  static void printAndReset(int[] a){
    m(a);
    c = 0;
    System.out.println();
  }

  public static void main(String[] a){
    printAndReset(new int[]{ 7, 5, 0, 9 });
    printAndReset(new int[]{ 0 });
    printAndReset(new int[]{ 1, 2 });
    printAndReset(new int[]{ 8, 7 });
    printAndReset(new int[]{ 0, 0 });
    printAndReset(new int[]{ 1, 4, 2 });
    printAndReset(new int[]{ 0, 1, 0 });
    printAndReset(new int[]{ 1, 0, 0, 0 });
    printAndReset(new int[]{ 1, 2, 3, 4 });
    printAndReset(new int[]{ 1, 2, 3, 5, 8 });
    printAndReset(new int[]{ 9, 2, 4, 5, 3, 2, 2 });
  }
}

Produzione:

7 5 0 9 
 2 5 9 
  7 4 
   1 

0 

1 2 
 3 

8 7 
 5 

0 0 
 0 

1 4 2 
 5 6 
  1 

0 1 0 
 1 1 
  2 

1 0 0 0 
 1 0 0 
  1 0 
   1 

1 2 3 4 
 3 5 7 
  8 2 
   0 

1 2 3 5 8 
 3 5 8 3 
  8 3 1 
   1 4 
    5 

9 2 4 5 3 2 2 
 1 6 9 8 5 4 
  7 5 7 3 9 
   2 2 0 2 
    4 2 2 
     6 4 
      0 

Creare una funzione void p(String s){System.out.print(s);}e sostituire la stampa standard. Per l' printlnuso p("\n"). Sposta il int ie int jvicino al int c=0;( int c=0,i,j;) e sposta la condizione print(a[i]+" ")interna in formodo da poter rimuovere le parentesi per un totale di -11
Giacomo Garabello

@GiacomoGarabello Oggi ho imparato questa variante di stampa più corta: <T>void p(T s){System.out.print(s);}invece di void p(String s){System.out.print(s);}.
Kevin Cruijssen,

Wow ... 2 byte più vicini a Pyth e Jelly! Grazie!
Giacomo Garabello,

@GiacomoGarabello "2 byte più vicini a Pyth and Jelly!" Hehe. 'Guarda sempre il lato positivo della vita.' ;)
Kevin Cruijssen il

1

C # 6, 125 + 31 125 + 18 = 143 byte

string f(int[] n,string s="")=>s+string.Join(" ",n)+"\n"+(n.Length>1?f(n.Zip(n.Skip(1),(a,b)=>(a+b)%10).ToArray(),s+" "):"");

Il +18 è per using System.Linq;

Grazie a @TheLethalCoder per aver salvato 13 byte, sottolineando un'istruzione using non necessaria


0

JavaScript (ES6), 77 byte

a=a.map((_,i)=>(b=a,a=[a.map((e,j)=>j>i?(e+a[j-1])%10:''),b.join` `)).join`
`

0

C, 138 byte

golfed

c,d;main(int a,char**b){b++;while(c++,d=0,--a)while(d<a)printf("%*c%c",!d?c:1,*b[d],(d+2>a)*10),++d<a?*b[d-1]=(*b[d-1]+*b[d]-96)%10+48:0;}

Ungolfed

c,d;
main(int a,char**b){
b++;
while(c++,d=0,--a)
    while(d<a)
        printf("%*c%c",
          !d?c:1,      //number of blanks in front of digit
          *b[d],       //digit
          (d+2>a)*10), //returns 10(new line) only for d+1 == a
        ++d<a
          ? *b[d-1]=(*b[d-1]+*b[d]-96)%10+48 //update digit 
          :  0;
}

0

C #, 167 byte

In realtà sono abbastanza orgoglioso di questa soluzione, le espressioni lambda sono così divertenti una volta che ne hai capito

void f(List<int> a){int x=a.Count;for(int s=0;s<x;s++){Console.WriteLine(new String(' ',s)+string.Join(" ",a));a=a.Take(x-s-1).Select((v,i)=>(a[i+1]+v)%10).ToList();}}

qui libero per ulteriori miglioramenti:

void f(List<int> a)
{
int x = a.Count;
for (int s = 0; s<x ;s++)
{
    Console.WriteLine(new String(' ',s)+string.Join(" ",a));
    a=a.Take(x-s-1).Select((v,i)=>(a[i+1]+v)%10).ToList();
}
}

provalo qui


È possibile salvare 2 byte utilizzando un array per l'input anziché un elenco. List<int> a-> int[] a, int x=a.Count-> int x=a.Length, .ToList()->ToArray()
Dal

0

Haskell, 139 byte

f=mapM(\(r,s)->putStrLn$r++(s>>=(++" ").show)).zip(iterate(' ':)"").takeWhile(/=[]).iterate g where g(_:[])=[];g(y:p:ys)=mod(y+p)10:g(p:ys)

Accetta input come argomento, output su STDOUT.

Versione non golfata:

f = mapM (\(r, s) -> putStrLn $ r ++ (s >>= (++ " ") . show))
    . zip (iterate (' ' :) "")
    . takeWhile (/= [])
    . iterate sumTerms
    where sumTerms (_:[]) = []
          sumTerms (y:p:ys) = mod (y+p) 10 : sumTerms (p:ys)

0

Python 3, 97 byte

def f(x):print(*x);x[-1]==''or f(['']+[(x[i]+x[i+1])%10if''!=x[i]else''for i in range(len(x)-1)])

Stampa una nuova riga finale.

Come funziona

def f(x):                            function with input of list of numbers
print(*x)                            print the old line of the triangle
x[-1]==''or...                       if no more numbers, stop...
(x[i]+x[i+1])%10if''!=x[i]else''...  ...else compute the next entry in the new line if
                                     possible...
...for i in range(len(x)-1)          ...for all relevant digit pairs...
['']+...                             ...concatenate with empty string to force new leading
                                     space...
f(...)                               ...and pass to function

Provalo su Ideone



0

Javascript (utilizzando una libreria esterna) (198 byte)

n=>{a=_.From(n);b=a.Write(" ");c=1;while(++c){a=a.BatchAccumulate(2).Where(y=>y.Count()==2).Select(z=>z.Sum()%10);if(a.Count()==0){break;}b+="\r\n"+_.Range(0,c).Write(" ",x=>"")+a.Write(" ")}return b}

Link alla lib: https://github.com/mvegh1/Enumerable/

Spiegazione del codice: è stato facile usare la libreria! Non vince in byte, ma il codice non è troppo dettagliato e facile da leggere. Quindi, l'input "n 'è un array di numeri interi. Caricalo nella libreria, memorizzato nella variabile" a "." B "è la stringa di ritorno, memorizza la stringa unita con" "come delimitatore in b. C è il iterazione corrente, usa questa opzione per determinare il numero di spazi da inserire NOTA: sembra funzionare bene solo quando l'input è compreso tra 0 e 9. Quindi, quando è vero, ripeti un certo set di codice. Questo codice serve a creare un batch adiacente insiemi dell'attuale enumerabile "a", ovvero se abbiamo [1,2,3,4,5,6] otteniamo [1,2], [2,3], [3,4], ... [ 6] ... quindi filtriamo in modo da avere solo i lotti di dimensione 2. Quindi lo mappiamo a una raccolta delle somme dei lotti% 10. Se a è vuoto, abbiamo finito, altrimenti aggiungiamo la nuova linea al nostro ritorno. Finalmente ritorna ...

Foto in arrivo tra qualche minuto.

inserisci qui la descrizione dell'immagine

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.