Triangoli numerici


11

Credito

I miei ringraziamenti alla domanda a lettere di Rand Al'Thor per l'ispirazione per questa sfida di code-golf.

sfondo

La natura di questa sfida si basa sull'algoritmo menzionato da Rand nel suo "Un triangolo formato da tre lettere":

  • Inizia con una sequenza di 10 lettere ognuna delle quali è X, Y o Z.
  • Sotto ogni riga, costruisci la riga successiva come segue. Se due lettere adiacenti sono uguali, scrivi la stessa lettera sotto di esse; se sono diversi, scrivi la terza lettera sotto di loro.

Dovresti quindi ripetere il passaggio precedente fino a quando non hai una lettera nella decima riga.

Sfida

Daremo un giro matematico all'algoritmo sopra:

  • Cominciamo con una sequenza di 10 cifre, ognuna separata da uno spazio e ognuna delle quali è 1, 2 o 3.
  • Sotto ogni riga, costruisci la riga successiva come segue. Se due cifre adiacenti sono uguali, scrivi la stessa cifra sotto di esse; se sono diversi, scrivi la terza cifra sotto di loro.
  • Ripeti il ​​passaggio precedente fino a quando non hai un numero finale.

Quindi, seguendo questo algoritmo, se si inizia con la riga 1 2 3 3 1 3 1 3 1 2, ad esempio, viene generato il seguente triangolo:

Input: 1 2 3 3 1 3 1 3 1 2

Output:

1 2 3 3 1 3 1 3 1 2
 3 1 3 2 2 2 2 2 3 
  2 2 1 2 2 2 2 1  
   2 3 3 2 2 2 3   
    1 3 1 2 2 1    
     2 2 3 2 3     
      2 1 1 1      
       3 1 1       
        2 1        
         3         

Sono anche curioso di conoscere la somma di tutte le cifre nel triangolo numerico, quindi aggiungi tutte queste cifre e metti questo totale in undicesima riga, giustificato a destra fino all'ultima cifra della prima riga. Quindi, il nostro triangolo numerico sarà simile al seguente (gli spazi nel mio esempio sono rappresentati di seguito dal .carattere per mostrare la formattazione).

Input: 1 2 3 3 1 3 1 3 1 2

Output:

1.2.3.3.1.3.1.3.1.2
.3.1.3.2.2.2.2.2.3.
..2.2.1.2.2.2.2.1..
...2.3.3.2.2.2.3...
....1.3.1.2.2.1....
.....2.2.3.2.3.....
......2.1.1.1......
.......3.1.1.......
........2.1........
.........3.........
................109

La tua sfida è scrivere codice che può iniziare con una stringa / array / etc immessa. di dieci cifre, come nel mio esempio, e quindi applicare l'algoritmo per generare le dieci righe che creerebbero il triangolo numerico, seguite da un'undicesima riga che visualizzerebbe il totale di tutte le cifre con giustificazione a destra.

analisi

Il test di questa stringa può essere eseguito con una stringa generata in modo casuale di dieci cifre di tua scelta o una generata dallo snippet di seguito ...

c1=()=>('1331123221'+(Math.random()*(1<<24)|0).toString(4)).replace(/0/g, "").slice(-10).split("").join(" ");

$("#btn").click(function(){
  $("#str").val(c1());
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="str"><button id="btn">Get numbers</button>
<br>
Please use this snippet to generate a starting row for testing your code. Alternatively, you can also use a string of your choice, so long as it's ten digits (ranging from 1 to 3), separated by single spaces.

Regole

  1. Si applicano le regole del code-golf, quindi il numero più basso di byte vince la sfida. Nel caso in cui vi siano due voci con lo stesso punteggio basso, il vincitore verrà assegnato in base al numero di voti positivi.
  2. Ciò che stiamo sostanzialmente cercando è di 11 righe, 19 caratteri ... Il modo in cui esegui il rendering dell'output finale dipende interamente da te: array, console, output dei file, STDOUT, ecc., Quindi utilizza il metodo di output che preferisci lavorare a proprio vantaggio. L'unica regola nell'output è che abbiamo 11 righe con 19 caratteri in ogni riga in un formato simile a quello sopra ...
  3. Se aiuta il tuo codice, usa qualunque separatore per le cifre ... Ricorda solo che la leggibilità può essere un fattore che contribuisce.
  4. Nessuna scappatoia sciocca .
  5. La codifica hardware dell'ingresso non è consentita. Lo scopo di questo codice è tale che può essere utilizzato per produrre risultati diversi ogni volta con input variabili. La codifica hardware, 1 1 1 1 1 1 1 1 1 1ad esempio, nega completamente l'intero punto dell'algoritmo.

Non vedo l'ora di vedere cosa riuscirai a inventare!



1
Ho bisogno di un separatore se il mio triangolo è allineato al centro (che è quindi leggibile)?
JungHwan Min,

1
Sembra che questo senza lo spazio (la mia risposta, dispone di spazi, che in 10 byte).
JungHwan Min

2
Autorizzazione concessa
WallyWest,

1
Si noti che per una stringa di 10 (o qualsiasi numero 1 maggiore di una potenza di 3) cifre, la cifra finale viene calcolata banalmente dalla prima e dall'ultima cifra della stringa; le altre cifre non fanno differenza.
Neil,

Risposte:


1

05AB1E , 32 26 byte

DvÐOˆðýðN×.ø,ü+3%3^}\¯O19j

Spiegazione

D                 # duplicate input
v                 # for y,N in input,len(input): (10 times do)
 Ð                # triplicate current list
 Oˆ               # sum one copy and add it to global array
 ðý               # merge one copy on spaces
   ðN×.ø          # surround it with N spaces
        ,         # and print it
 ü+               # reduce one copy by addition
   3%             # modulus 3
     3^           # XOR 3
                  # this is the list sent to the next iteration
}                 # end loop
\                 # drop empty list left over from last iteration of loop
 ¯O               # sum the global array giving the triangles total sum
   19j            # join with spaces up to 19 chars

Provalo online!


7

Mathematica, 104 97 90 94 byte

{Grid[List@*Row/@#],#~Total~2}~Column~Right&[NestList[3-Mod[+##,3]&@@@Partition[#,2,1]&,#,9]]&

Spiegazione

Partition[#,2,1]

Partiziona l'input in lunghezza 2, offset 1 partizioni.

3-Mod[+##,3]&@@@

Prende ciascuna partizione e calcola l'output corrispondente.

Un trucco qui coinvolto. Ho aggiunto i due numeri, ho preso la mod 3 e ho sottratto il risultato da 3. Questo dà il numero desiderato. (es. 3 - ((2 + 1) mod 3) = 3)

NestList[ ... ,9]

Ripete il processo sopra descritto nove volte, fornendo tutte le iterazioni come output.

Grid[List@*Row/@#]

Formatta ogni iterazione in righe e metti tutto in una colonna (allineato al centro), creando un triangolo.

#~Total~2

Prendi il totale di tutti i numeri.

{...}~Column~Right

Combina il triangolo e il totale e allinea a destra l'intera cosa (il triangolo è già allineato, quindi il suo allineamento non è influenzato).


1
Approccio ispirato con una singola funzione che si prende cura di entrambi i tipi di genitori identici e diversi ... Mi piace!
WallyWest,

3

JavaScript (ES6), 143 142 byte

Salvato 1 byte grazie a @Neil

a=>a.map((_,i)=>(q=" ".repeat(i))+(a=a.map(c=>(x+=r=i&&p^(p=c)||c,r),p=i&&a.shift())).join` `+q,x=0).join`
`+`
`+(" ".repeat(18)+x).slice(-19)

Ho provato a combinare varie parti, ma è risultato più lungo di 5 byte:

a=>[...a.map((_,i)=>(a=a.map(c=>(x+=r=i&&p^(p=c)||c,r),p=i&&a.shift())).join` `+" ".repeat(i),x=0),x].map(q=>(" ".repeat(18)+q).slice(-19)).join`
`

Ottimo lavoro! Il trucco di JHM potrebbe 3-((x+y)%3)essere d'aiuto per ridurre questo codice?
WallyWest,

2
No. p^c||pè già un po 'più breve :-)
ETHproductions,

Ora, come diavolo mi sono perso? Ovviamente! Le funzioni XOR funzionano bene qui!
WallyWest,

1
XOR ?! Non ci avrei pensato. Detto questo, purtroppo, l'uso di XOR rende il mio codice più lungo: P
JungHwan Min

Perché i?p^(p=c)||p:cpuoi usare i&&p^(p=c)||c?
Neil

2

Rubino, 134 101 byte

Usando il trucco del modulo di JHM.

->a{b=*a
(0..8).map{|i|[" "*i,a=a.each_cons(2).map{|x,y|b<<n=3-(x+y)%3
n}]*" "}<<"%19d"%b.reduce(:+)}

Guardalo su eval.in: https://eval.in/649993


2

CJam ,  44  40 byte

l~{S*\_S*\2ew{:+3%3^}%2$N@}A%_s:~:+sJSe[

Provalo online!

Spiegazione

l~       e# Read and evaluate input.
{        e# Map this block over i in the range [0 1 ... 9].
  S*     e#   Get a string of i spaces (the indentation).
  \_     e#   Swap with the current line of trits and duplicate it.
  S*     e#   Join the trits with spaces.
  \2ew   e#   Swap with the other copy of the trits and get all consecutive pairs.
  {      e#   Map this block over the pairs...
    :+   e#     Sum the pair.
    3%   e#     Modulo 3.
    3^   e#     XOR 3.
         e#     This expression (x+y)%3 ^ 3 computes the required mapping.
  }%     e#   Now this is the next line.
  2$     e#   Copy the indentation (to pad the lines to equal length).
  N      e#   Push a linefeed.
  @      e#   Pull up the next line.
}A%      e# The result of this is a nested array whose string representation is
         e# the required triangle.
_s       e# Duplicate and flatten into a string.
:~       e# Eval each character which gives a list of all the trits.
:+       e# Sum that.
s        e# Turn the sum into a string.
JSe[     e# Left-pad it with spaces to width 19.

Come sempre, molto impressionante! Finora sei in testa!
WallyWest,

1
@WallyWest Grazie. :) Aspetta solo Pyth, Jelly e MATL. ;)
Martin Ender il

In realtà, sono curioso di sapere come sarà la soluzione GolfScript ...;)
WallyWest,

Oh, qualcuno fino a pubblicare una soluzione SQL? ;)
WallyWest,

1

Python 2, 164 byte

Una soluzione iterativa relativamente semplice.

L=input()
s=0
for i in range(len(L)):
    print" "*-~i+" ".join(`L`[1::3]);s+=sum(L);N=L;L=[]
    for a,b in zip(N,N[1:]):L+=[list({1,2,3}-{a,b}),[a]][a==b]
print"%19s"%s

Provalo online


1

PHP, 143 byte

<?for($t=$_GET[t];$i<181;$s+=$v,$i+=2)$t[$i+20]=($v=$t[$i])*($z=$t[$i+2])>0&$i!=18?($v+$z)%3^3:" ";echo chunk_split($t.str_pad($s,8," ",0),19);

0

JavaScript (ES6), 112 100 96 byte

Prende un array come input e crea ricorsivamente un triangolo separato da virgole.

f=(s,p=`
`,S=0)=>p+(s[0]?s+f(s.map((v,i)=>(S+=v,v^s[i-1]||v)).slice(1),p+' ',S):(p+S).slice(-9))

console.log(f([1,2,3,3,1,3,1,3,1,2])); // reference example
console.log(f([3,3,2,1,3,1,2,1,2,1])); // random example
console.log(f([1,1,1,1,1,1,1,1,1,1])); // all ones (test case for sum < 100)

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.