Domanda

La mia soluzione novizio di Project Euler # 1

+/((0=3|1+i.1000-1) +. (0=5|1+i.1000-1)) * (1+i.1000-1)

So che questo può essere riscritta, e trasformato in una funzione, non so come farlo, e avrei dovuto leggere tutti i laboratori per imparare.

È stato utile?

Soluzione

Non è necessario "gestire zero" in quanto l'aggiunta di zero non cambierà la risposta così si può semplicemente utilizzare i. per generare la vostra lista di numeri di sotto di 1000, ad esempio:

   i. 10
0 1 2 3 4 5 6 7 8 9

J funziona meglio con le matrici così si dovrebbe essere in grado di chiedere il residuo (|) di 3 e 5, allo stesso tempo, è possibile utilizzare rango (") per controllare come gli argomenti sono alimentati a residui:

   3 5 |"0 1 i. 10
0 1 2 0 1 2 0 1 2 0
0 1 2 3 4 0 1 2 3 4

Il |"0 1 dice di nutrire l'argomento a sinistra per | un-item-at-a-time, mentre l'alimentazione gli argomenti giusti a-line-at-a-tempo. Poiché l'argomento diritto consiste di una sola linea, è alimentato ripetutamente per ognuno degli elementi argomento a sinistra.

Ora possiamo fare il 0= per l'intero array:

   0 = 3 5 |"0 1 i. 10
1 0 0 1 0 0 1 0 0 1
1 0 0 0 0 1 0 0 0 0

Inserire una condizione OR tra i due elementi (linee) della matrice:

  +./ 0 = 3 5 |"0 1 i. 10
1 0 0 1 0 1 1 0 0 1

Ottenere l'indice di ogni 1 nella lista / vettore:

  I. +./ 0 = 3 5 |"0 1 i. 10
0 3 5 6 9

E sum:

 +/ I. +./ 0 = 3 5 |"0 1 i. 10

23

Si può fare di questo un esplicito funzione / verb abbastanza facilmente:

   euler1=: verb define
+/ I. +./ 0 = 3 5 |"0 1 i. y
)

o una volta a ottenere il blocco di J tacita si potrebbe definire:

   euler1=: +/@I.@(+./)@(0 = 3 5 |"0 1 i.)

Altri suggerimenti

  • Refactor 0= (volontà aumenta la dimensione del programma)

+/((3|1+i.1000-1)+.&(0=])5|1+i.1000-1)*1+i.1000-1

  • Refactor 1+i.1000-1

+/(((3|])+.&(0=[)5|])1+i.1000-1)*1+i.1000-1

  • Refactor 1+i.1000-1 nuovo

+/(*(3|])+.&(0=[)5|])1+i.1000-1

L'unica cosa che non ho potuto refactoring finora è l'operatore |

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top