Chi bussa a questa porta? E a quest’ora!?

Non ti aspetteresti mai sentire bussare al citofono intorno alle 15.30, soprattutto il 7 di agosto. Eppure questo 7 agosto, alle ore 15.30 circa ecco che suona il citofono.
Di pomeriggio in genere sono comunque attivo, ho solo un breve momento di mancamento dovuto al sangue che accorre allo stomaco per la digestione e di conseguenza il cervello ne rimane privo.
In tutte le culture questo momento è noto e definito da termini precisi: da noi è detto “controra”, ma potrebbe anche essere indicato con termini più tecnici come “coma digestivo” oppure “nummrumpitocazz”.
Cercando di riprendermi dal brusco risveglio e rispondo al citofono: comunicazioni dell’ENEL. Ho capito già tutto, ma sono una persona curiosa e mi interessa capire quale faccia da disperato può avere uno che alle 15.30 del 7 agosto, temperatura misurata 38° C, temperatura percepita 45° C, gira per le strade di un infimo paesino di provincia a procacciare clienti.
Esco in cortile, e mi rendo conto che sono abbigliato in maniera perfetta per una pennichella sul divano di casa propria, ma non per presentarsi ad un estraneo, ma penso “masticazzichisenefrega”: lo voglio vedere, voglio guardarlo in faccia a tutti i costi.
Finalmente eccolo, giovane, avrà avuto appena 18 anni, perfetto nel suo completo giacca e cravatta, l’unico che ha, comprata apposta per festeggiare il suo recente 18° compleanno: auguri!
Si proteggeva dal sole cercando riparo dal muretto, rosso in faccia, giacca e cravatta, il 7 agosto alle ore 15.30, con una temperatura misurata 38° C all’ombra, al sole saranno stati almeno 50. Con lui un ragazzina che stava patendo allo stesso modo: che bello essere giovani, nessuno ti ferma, può piovere o fare caldo, resisti a qualunque cosa. Beata gioventù!
Mi istruisce sul fatto che è necessario passare al mercato libero, e chiede di vedere la mia ultima fattura dell’enel per controllare un codice. Se corrisponde posso avere uno sconto del 30%.
Non ho voluto infierire, sono stato gentile quando l’ho scacciato.
Per i giovani venditori porta a porta dell’enel (enel energia o quello che è) una prece.

Koch Snowflake

Divertiamoci un po’

Koch Snowflake
Koch Snowflake

Ogni tanto vale la pena rilassarsi un po’ con questo bell’ambiente di sviluppo che si chiama Scratch e disegniamo un bel frattale, uno semplice: il fiocco di neve di Koch. Si disegna un triangolo equilatero; ogni suo lato viene trasformato in 4 segmenti in modo da formare tanti triangolini, e poi da essi ancora tanti triangolini senza mai smettere e si ottiene un disegno del genere.

Bello vero?

 

 

 

 

 

Codice sorgente

Il codice per realizzare questo disegno non è molto complicato, si tratta di ripetere iterativamente queste istruzioni (per i curiosi il codice completo si può vedere qui).

 

 

 

 

 

 

 

 

 

 
Mentre per vedere in azione il risultato della codifica premere sulla bandierina:

È solo una questione di Logica

Gli argomenti di logica matematica che più solleticano la fantasia sono quelli che sembrano andare contro il senso comune. Tra questi il caso più interessante e ricco di spunti è la descrizione del significato dell’implicazione logica.
L’implicazione è un operatore che si applica a due frasi valide; il risultato è una terza frase, composta dalle prime due che avrà una struttura del tipo “se … allora …” e sarà anch’essa una frase valida.
Ho usato qui il termine “frase valida” in maniera impropria per evitare di usare il termine più corretto ma trippo “pomposo” di formula ben formata (tanto che in genere per essa si usa l’abbreviazione fbf), che, sempre per semplificare, si può definire come una frase che assume uno e uno solo dei valori tra vero e falso.
Dal punto di vista più formale, siano A e B due frasi valide, applicando l’implicazione logica otteniamo la frase valida “se A allora B“, che se spesso si può trovare nella forma “A è condizione sufficiente per B” o “B è condizione necessaria per A“, o ancora, utilizzando la simbologia A[math]\implies[/math]B. Al pari di A e B anche A[math]\implies[/math]B, in quanto frase valida, sarà vera o falsa. In particolare sarà sempre vera tranne nel caso in cui A è vera e B falsa.
Per chiarire la definizione di un operatore logico (per chi non lo sa, ce ne sono altri oltre l’implicazione) si usa spesso la tavola della verità, cioè si enumerano tutte le possibili combinazioni di valori di verità di A e B e si indica il corrispondente valore della frase composta:

A B A[math]\implies[/math]B
V V V
V F F
F V V
F F V

In Matematica, e a maggior ragione in Logica Matematica, una definizione non si discute ma la si tratta come una pura convenzione. Aver chiamato quest’operatore implicazione e leggerla come “se A allora B” non significa ad esempio che tra A e B ci sia una relazione di causa-effetto, ed in generale non bisogna farsi trarre in inganno dal significato che una frase del genere ha nel “linguaggio comune”.
Per chiarire ciò caliamo questo discorso in un caso reale; può capitare ad esempio di essere impiegato presso una società (che per esempio può essere una qualunque società di consulenza informatica o quant’altro) per diversi anni e con il tempo trovarsi ad essere relegato in attività sempre più marginali, ad avere sempre meno credito e di conseguenza ottenere delle valutazioni di anno in anno peggiori malgrado si cerchi di contribuire con il proprio impegno e disponibilità (sì, in queste società alla fine dell’anno ti fanno una pagellina, proprio come a scuola, eppure quello che fai è un lavoro e sei inquadrato con un Contratto Collettivo Nazionale). Ci si può chiedere per quale motivo continuare nell’impegnarsi a contribuire al successo del progetto per cui si lavora e in generale per l’azienda, dal momento che non si si otterrà nulla in cambio? Per essere chiari lavorare sì e con impegno, perché è ciò per cui è pagati ed è tuo dovere rispettare l’impegno contrattuale; ma tutto ciò che è extra? Perché essere disposti a dare di più?
La domanda è fondamentale, ma quello che conta soprattutto è la risposta: “se questa società durerà a lungo allora impegnati quanto più è possibile”.
Abbiamo una frase del tipo “se A allora B“, dove:

A=”questa società durerà a lungo”;

B=”impegnati quanto più è possibile”.

Ogni frase ha la sua negazione, cioè una frase valida che è vera se la frase di partenza è falsa e falsa se la frase di partenza è vera:

[math]\neg[/math]A=”questa società non durerà molto”

[math]\neg[/math]B=”impegnati solo il necessario”

Sottolineiamo qui la prima considerazione controintuitiva: la frase A [math]\implies[/math]B non equivale a [math]\neg[/math]A [math]\implies[/math][math]\neg[/math]B: non è corretto dire “se questa società non durerà molto allora impegnati solo il necessario”, bensì la frase corretta deve essere scritta “se impegnati solo il necessario allora questa società non durerà molto”. La cosiddetta forma contronominale dell’implicazione assume la forma [math]\neg[/math]B [math]\implies[/math][math]\neg[/math]A.

Una seconda considerazione riguarda la stessa definizione di implicazione: questa frase è sempre vera a meno che A sia vera e B falsa. Aiutandoci anche con la tabella precedente si ha che l’implicazione è vera nei seguenti casi:

  • “questa società durerà a lungo” è vera e “impegnati quanto più è possibile” è vera
  • “questa società durerà a lungo” è falsa e “impegnati quanto più è possibile” è vera
  • “questa società durerà a lungo” è falsa e “impegnati quanto più è possibile” è falsa

mentre è falsa nel caso

  • “questa società durerà a lungo” è vera e “impegnati quanto più è possibile” è falsa

Riscrivendo le frasi in forma negativa, le frasi atomiche sono vere ed è vera anche l’implicazione:

  • “questa società durerà a lungo” e “impegnati quanto più è possibile”
  • “questa società non durerà molto” e “impegnati quanto più è possibile”
  • “questa società non durerà molto” e “impegnati solo il necessario”

mentre in questo caso, malgrado le frasi atomiche siano vere, l’implicazione è falsa:

  • “questa società durerà a lungo” e “impegnati solo il necessario”

In primo luogo, supponendo l’implicazione vera, si nota che B sia vero o meno non ci permette di dire nulla sul valore di verità di A, dal momento che “impegnati quanto più è possibile” è vera, non è detto che sia vero o che “questa società durerà a lungo”, ma lo stesso avviene se “impegnati solo il necessario” è vera: “questa società durerà a lungo” può essere vera o falsa.
A rafforzare tale stranezza tra A e B c’è solo una relazione logica e non una relazione di causa-effetto: “questa società non durerà molto” è causa del fatto che devi “impegnati quanto più è possibile”? Come abbiamo detto la risposta è no.

Un’altra considerazione sull’implicazione consiste nella possibilità di essere scritto in forme alternative completamente equivalenti, ottenendo cioè la stessa tabella di verità. La scrittura alternativa dell’implicazione è [math]\neg[/math]A [math]\lor[/math]B: quest’ultima assume gli stessi valori di verità di A [math]\implies[/math]B, ciò vuol dire che l’implicazione equivale alla frase “questa società non durerà molto o impegnati quanto più è possibile”, che non ha molta relazione con quanto il senso comune ci suggerisce.

Spero che l’aver inspirato abbastanza dubbi, nella speranza di indurre chi legge ad approfondire ma una cosa la posso svelare; per quanto mi riguarda [math]\neg[/math]B (“impegnati solo il necessario”) è quanto ho fatto dal momento che ho realizzato che impegno e disponibilità non corrispondeva nessun tipo di gratificazione, anzi sembrava che avvenisse il contrario; altresì dal momento stavo solo aspettando il momento giusto per cambiare lavoro, cosa che era ormai nell’aria, ho dovuto solo pazientare un po’.

3.14.15 Giorno del Pi-Greco del Secolo

Il giorno del pi-greco ricorre ogni anno il 14 marzo, che scritto in formato americano si indica appunto con 3.14. Quest’anno il giorno del pi-greco sarà ancora particolare, perché le cifre dell’anno formano in numero 3.1415: sarà il giorno del pi-greco del secolo!
latex Teacher Pointing to Pi on Chalkboard
Ogni anno creo un evento su Facebook e per attirare l’attenzione cerco di mettere in evidenza delle curiosità, quest’anno il tema è “Pi-Greco e Simpson. Quale relazione ci può essere tra le due cose?
lisa-homer-pie21
Forse nessuna, ma cercando su internet ci si può imbattere in questa strana formula matematica, e allora qualcosa sotto c’è:
336-simpsons-rule
Si tratta di un metodo di integrazione, ci serve una funzione da integrare; il risultato potrebbe servirci per approssimare pi-greco. L’idea più immediata potrebbe essere quella di integrare \sqrt{1 + x^2} tra 0 e 1 (area del settore circolare nel 1° quadrante), tenendo conto che l’area del cerchio di raggio 1 è proprio pi-greco, basterà moltiplicare il risultato per 4. Io però eviterai di usare questa funzione, comunque presenta un radicale e si dovrebbe trovare il modo di calcolare la radice, introducendo un ulteriore problema nel problema: evitiamo prendendo una funzione diversa, ma quale?
Precisiamo, giusto per non creare spiacevoli equivoci, la formula di integrazione presentata non è di Homer Simpson, ma prende il nome da Thomas Simpson, anche se la formula era già nota ai suoi tempi. Non è improbabile però che gli autori della serie di cartoni (tutti con competenze e studi scientifici) abbiano dato di proposito al protagonista il cognome del famoso matematico. Famosi sono inoltre i riferimenti matematici, espliciti e nascosti, presenti negli episodi.
Una bella funzione razionale è f(x)=\frac{1}{1 + x^2}, e fa proprio al caso nostro; integrata tra 0 e 1 dà arctg(1) che corrisponde all’angolo di 45°, perché come ben noto (?) tg(45^{\circ})=1. Ma l’angolo di 45° è proprio \pi/4.
Abbiamo quindi una funzione facile da calcolare e da inserire nella formula di Simpson: andiamo avanti senza indugi al calcolo di pi greco!
Per essere più chiari, useremo la suddetta formula di Simpson (meglio nota come Regola di Cavalieri-Simpson) per calcolare in maniera approssimata quest’integrale.
\int_{0}^{1} \frac{1}{1 + x^2} dx = \frac{\pi}{4}.
Ovviamente non proveremo a calcolarlo manualmente: abbiamo il computer e un bellissimo ambiente di programmazione tra l’altro gratuito e facile. Non ci resta che scrivere (anzi comporre in questo caso) il programmino ed è fatta.

John H. Conway

Il calendario perpetuo di Conway

John H. Conway
John H. Conway

Non dovrebbe essere necessario presentare un personaggio come John H. Conway, uno dei più famosi e importanti matematici viventi [quando è stato scritto l’articolo, chi legge ora saprà che della sua morte a causa del coronavirus avvenuta nel 2020, ndr], ma ho notato invece che è necessario presentarlo.
Oltre ad aver raggiunto una fama mondiale nel campo della matematica è famoso anche per il suo carattere estroso e anticonvenzionale. È stato attivo nella ricerca sulla Teoria dei Gruppi, ha contribuito allo studio del cosiddetto “Gruppo Mostro” e alla classificazione dei gruppi semplici finiti, realizzando il famoso Atlante[1].
Il suo carattere lo ha portato a interessarsi di vari e particolari aspetti della matematica ad esempio a sviluppare ricerche in ambiti ludici: dall’analisi di giochi classici all’invenzione di nuovi giochi.

Conway e il Gruppo Mostro
Conway e il Gruppo Mostro

Può essere sicuramente definito un genio, ma non di quelli che preferiscono isolarsi dal mondo per pensare solo al suo lavoro; al contrario Conway è una persona estremamente estroversa a cui piace anche mettere in mostra la propria intelligenza, l’eccezionale memoria, la capacità di effettuare calcoli e arrotolare in vari modi la sua lingua[2].

Tra le sue particolari “invenzioni” vi è la creazione di un algoritmo/metodo mnemonico per conoscere il giorno della settimana di qualunque data.
Il calcolo è abbastanza semplice, dal momento che ogni anno è caratterizzato da un o specifico giorno della settimana, detto doomsday; ad esempio nell’anno 2000 il doomsday era il martedì, nel 2001 il mercoledì e così via con una successione che si svolge con una logica che vedremo più avanti.

Ci sono alcune date nel corso dell’anno che cadono sempre nel doomsday, da queste si può partire per calcolare il giorno di una qualunque data. Per esempio il doomsday del 2015 è sabato e cadranno di sabato i giorni 03 gennaio, 31 gennaio, i giorni divisibili per 7 dei mesi di febbraio e marzo (7, 14, ecc.), mentre per tutti gli altri mesi vige questa semplice regola mnemonica, nei mesi pari: 04/04, 06/06, 08/08 ecc. sono doomsday, cioè nei mesi pari il giorno uguale al numero del mese è sempre doomsday. Nei mesi dispari invece si può usare un altro semplice trucco per memorizzare i doomsday: i giorni sono 05/09 e 09/05 nonché 11/07 e 07/11. Per la loro simmetria basta fissarne a mente due e conoscere automaticamente gli altri due (in effetti in lingua inglese è possibile usare un trucco mnemonico più forte). Quanto detto vale per gli anni non bisestili come appunto il 2015; gli anni bisestili differiscono solo per quanto riguarda i primi due mesi del calendario.
La regola completa consiste nel distinguere, per i primi due mesi dell’anno, degli anni bisestili dai non bisestili:

Anni non bisestili: sono Doomsday

  • 3 e 31 Gennaio
  • 7, 14, 21, 28 Febbraio

Anni bisestili: sono doomsday

  • 3 e 31 Gennaio
  • 1 e 29 Febbraio

Da notare che l’ultimo giorno del mese di Febbraio è sempre doomsday (sia esso il 28 o il 29).
Per tutti gli altri mesi valgono sempre le regole sopra esposte che sintetizziamo di seguito:

  • a Marzo sono doomsay il 7, 14, 21 e 28
  • nei mesi dispari sono le seguenti date simmetriche: 9/5, 11/7, 5/9, 7/11
  • nei mesi pari: i giorni con lo stesso numero del mese: 4/4, 6/6, 8/8, 10/10, 12/12

Inoltre ci sono alcune date facili da ricordare corrispondenti ad alcune ricorrenze; il 4 Luglio (in USA il giorno dell’Indipendenza) e il 25 aprile (in Italia la Festa della Liberazione); ferragosto, cioè il 15 Agosto, il giorno di Halloween (31 Ottobre), San Silvestro 26 dicembre, cioè il giorno dopo Natale. Per i napoletani può essere utile ricordare che il giorno di San Gennaro (19 Settembre) è un doomsday.
Ci sono poi date che hanno un significato personale e facili da ricordare: anche queste possono essere usate come riferimento, per esempio cade in un doomsday la mia data di nascita (ma anche quella di Conway). Nell’arco dell’anno troviamo quindi molti doomsday facili da ricordare. Volendo stabilire il giorno della settimana di una qualunque data basta cercare il doomsday più vicino.
Resta solo da capire come stabilire il Doomsday dell’anno: l’algoritmo non è molto semplice per persone normali, mentre può risultare estremamente facile da memorizzare ed applicare per una persona con il cervello di Conway.

Per semplificare il ragionamento consideriamo questa tabella:

Lun. Mar. Mer. Gio. Ven. Sab. Dom.
1898 1899 1900 1901 1902 1903
1904 1905 1906 1907 1908 1909
1910 1911 1912 1913 1914 1915
1916 1917 1918 1919 1920
1921 1922 1923 1924 1925 1926
1927 1928 1929 1930 1931
1932 1933 1934 1935 1936 1937
1938 1939 1940 1941 1942 1943
1944 1945 1946 1947 1948
1949 1950 1951 1952 1953 1954
1955 1956 1957 1958 1959
1960 1961 1962 1963 1964 1965
1966 1967 1968 1969 1970 1971
1972 1973 1974 1975 1976
1977 1978 1979 1980 1981 1982
1983 1984 1985 1986 1987
1988 1989 1990 1991 1992 1993
1994 1995 1996 1997 1998 1999
2000 2001 2002 2003 2004
2005 2006 2007 2008 2009 2010
2011 2012 2013 2014 2015
2016 2017 2018 2019 2020 2021
2022 2023 2024 2025 2026 2027
2028 2029 2030 2031 2032
2033 2034 2035 2036 2037 2038
2039 2040 2041 2042 2043
2044 2045 2046 2047 2048 2049
2050 2051 2052 2053 2054 2055
2056 2057 2058 2059 2060
2061 2062 2063 2064 2065 2066
2067 2068 2069 2070 2071
2072 2073 2074 2075 2076 2077
2078 2079 2080 2081 2082 2083
2084 2085 2086 2087 2088
2089 2090 2091 2092 2093 2094
2095 2096 2097 2098 2099 2100

E la sequenza sembra abbastanza chiara: il doomsday si sposta di un giorno ogni anno, nei bisestili si sposta di due. Il ciclo si ripete in 28 anni.

Il gioco che faceva spesso Conway per stupire l’interlocutore era indovinare il giorno della settimana ad esempio quello della sua data di nascita; ad esempio se l’interlocutore fosse nato il 26 agosto 1965, nota dalla tabella che il doomsday del 1965 è la domenica (Conway era in grado di determinarlo con calcoli basati sull’aritmetica modulare a mente). La data di agosto di riferimento è l’otto agosto (08/08), che è capitata quindi di domenica, con un semplice conteggio si può capire che il 26 agosto 1965 era giovedì.

[1] John H. Conway; R. T. Curtis; S. P. Norton; R. A. Parker; R. A. Wilson: “Atlas of Finite Groups: Maximal Subgroups and Ordinary Characters for Simple Groups” Oxford, 1985
[2] Marcus Du Sautoy: “Il disordine perfetto: L’avventura di un matematico nei segreti della simmetria” BUR, 2010

Premi invio, anzi no!

comandi_dos_senza_invio

Le spiegazioni di questo problema possono essere tante: incapacità di fare un’analisi, ignoranza, scarsa voglia di capire, a cui si aggiunge l’assoluta incapacità di esprimersi in maniera corretta. Non metto in dubbio che venga riscontrato un problema, ma non è possibile scrivere una cosa del genere senza capire che si rischia di fare una figura da imbecille. Inoltre sembra che solo io mi sia accorto della cosa, per cui posso pensare che oltre alla incapacità di esprimersi in maniera corretta, sia molto diffusa l’incapacità di comprendere un testo scritto.

ArthurSchopenhauer
“Un uomo intelligente costretto a vivere insieme a degli sciocchi assomiglia a colui che ha un orologio che va bene in una città le cui torri hanno tutte orologi che vanno male. Lui solo ha l’ora giusta: ma a che gli serve? Tutta la città si regola secondo gli orologi cittadini sbagliati, persino coloro i quali sanno che soltanto il suo orologio indica l’ora vera”

Arthur Schopenhauer.

Non è certo quanto io sia intelligente, può darsi che anche il mio orologio porti un po’ male, ma non solo devo prendere tristemente atto del livello delle persone che mi circondano, e di un generale appiattimento verso il basso. Ammesso anche che una persona possa prendere una cantonata e scrivere una fesseria, ma se le persone che leggono in copia non si affrettano a chiedere una precisazione vuol dire che per loro va tutto bene, tra l’altro in un ambiente che si ritiene di elevato livello professionale.
Insomma io mi trovo in mezzo a persone così, ci devo lavorare; quelli che dovrebbero esprimere dei giudizi su di me o sono così o notano nulla di strano, e non so quale è la cosa peggiore.

Se li voti sei un coglione

La politica italiana si è distinta negli ultimi anni per grandi novità, differenziandosi dal passato per i toni e il modo di comunicare, e tali modalità sono state trasferite nella campagna elettorale per le elezioni politiche 2013. Malgrado sia passato un sacco di tempo non ho mai avuto tempo per commentare questi metodi di comunicazione e questo discorso potrebbe sembrare capitato fuori tempo massimo, ma vale la pena spenderci due parole perché è una questione che è destinata a ripetersi, forse addirittura tra pochi mesi. In ogni caso si tratta di una puntualizzazione che mi ero ripromesso di fare prima o poi e adesso trovo l’occasione.
Se li voti sei un coglione!Eccovi quindi un esempio di comunicazione diffusa su Facebook da uno dei tanti attivisti di uno dei maggiori movimenti politici di nuova diffusione: analizziamo i punti che ho individuato.
(1) Lo commento alla fine.
(2) L’immagine condivisa è originata da una pagina FB di un gruppo che si definisce “Nazionalisti Italiani”. Analizzando le loro pagine intuisco subito che si tratta di persone che muovono le loro azioni da ideali politici che non hanno nulla a che vedere con i miei (tanto per usare un eufemismo): ognuno la può pensare come vuole, ma si tratta di una brutta caduta di stile per l’attivista in questione che ha condiviso quest’immagine.
(3) Riguardo il testo: “Ci hanno ridotto in povertà e senza lavoro”, riferendosi ai noti personaggi illustrati nell’immagine. Il punto è che io conosco personalmente l’attivista in questione; non è ridotto in povertà, ha un posto di lavoro fisso. Forse spera di guadagnare consenso per il suo movimento con i guai altrui? In ogni caso un’ulteriore caduta di stile nella comunicazione dell’attivista. “Ci impongono di sacrificare la nostra vita e le nostre famiglie… per cosa?”: sinceramente questa frase non la capisco: cosa significa sacrificare le nostre vite e le nostre famiglie? Non credo che nessuno delle persone ritratte abbia mai proposto un olocausto; si tratta di una frase qualunque messa lì a caso? Vabbé continuiamo… “per mantenere i loro vizi e privilegi e delle cricche che li appoggiano”. Credo proprio che alcune delle persone ritratte non hanno bisogno dei nostri soldi per mantenere “vizi e privilegi”, altri sono interessati al potere più che a “vizi e privilegi”, e un po’ tutti sono convinti di aver fatto e fare il bene altrui. Di ciò sarebbe bene discuterne in maniera approfondita valutando il ruolo che hanno avuto i vari personaggi che si sono susseguiti sulla scena politica, e magari trovando spazio per un’autocritica: in fondo siamo noi i responsabili di tutto. La frase invece termina con “merde!”. Nessun contenuto, nessun ragionamento, nessun distinguo, nessuna autocritica: troppo facile e troppo comodo.
(4) La frase finale “Se li voti sei un coglione!” arriva all’offesa per chi legge. La comunicazione non può arrivare a questo punto.
Ritorniamo adesso a:
(1) Dall’immagine dell’attivista si capisce che abbiamo a che fare con una persona giovane, che tiene a mostrarsi in giacca e cravatta perché vuole apparire al meglio di sé e mostrarsi come una figura rassicurante e professionale. Ne ho oscurato i connotati e il nome; non ce ne sarebbe stata la necessità, il post è stato pubblicato su una piattaforma pubblica, e tra l’altro all’epoca gli feci presente che il post non era appropriato e che sarebbe stato meglio toglierlo, ma non l’ha tolto. Quindi potrei mettere benissimo la sua faccia. Non lo faccio, non si sa mai, meglio evitare. Immancabile il simbolo riportato in questo caso in alto a sinistra, che identifica in maniera esatta l’orientamento e l’origine del post.

Sarebbe stato interessante discutere di politica, ma non in questi termini. Espressioni di questo tipo mi hanno definitivamente portato a nutrire una forte antipatia (che comunque già covavo) nei confronti di questi movimenti.

Project Euler

Progetto Eulero

Si tratta di un contest di tipo matematico/informatico/enigmistico/a-tempo-perso, a cui si accede sul sito https://projecteuler.net

1 – Multiples of 3 and 5

awk -v max=1000 'BEGIN{for(n=1;n<max;n++){if ((n%3)*(n%5)==0) sum+=n}print sum;}'

2 – Even Fibonacci numbers

awk -v max=4000000 'BEGIN{a=1;b=1;while(b<max){r=b;b+=a;a=r;print a;if(a%2==0)sum+=a;}printf "total=%d",sum;}'

3 – Largest prime factor

awk -v m=600851475143 'BEGIN{
a[0]=2;
n=1;
for(i=3;m>2;i++){
for(j=0;j<n;j++){
if(i%a[j]==0){
break;
}
}
if(j==n){a[n]=i;n++;
while(m%i==0){
printf "%d/%d=",m,i;
m/=i;
printf "%d\n",m;
}
}
}
}'

4 – Largest palindrome product

awk 'BEGIN{for(i=100;i<=999;i++)for(j=i+1;j<=999;j++) printf "%d %d %d\n",i,j,i*j;}'|\
awk '{k=$3; m=0;do{ N=k; k=int(N/10);a[m]=N-(k*10);m++;}while(k>0);
if (m==5) if (a[0]==a[4] && a[1]==a[3]) {printf "%d %d %d\n",$1,$2,$3; p=($3>p)?$3:p;} 
if (m==6) if (a[0]==a[5] && a[1]==a[4] && a[2]==a[3]) {printf "%d %d %d\n",$1,$2,$3; p=($3>p)?$3:p;} 
}END{printf "\nThe largest palindrome is %d\n",p;}'

5 – Smallest multiple
1 * 2^4 * 3^2 * 5*7 * 11 * 13 * 17 *19 = 232792560

6 – Sum square difference
These two identity are founded easily solving a linear system of equations:
$S_1(N)=1 + 2 + 3 + … + N =\dfrac{N (N + 1)}{2}$
$S_2(N)=1 + 2^2 + 3^2 + … + N^2 =\dfrac{N (N + 1) (2N + 1)}{6}$
Then
$S_1^2(N)-S_2(N)=\dfrac{N (N^2 – 1) (3N + 2)}{12}$

7 – 10001st prime

awk -v m=10001 'BEGIN{
a[0]=2;
n=1;
for(i=3;;i++){
for(j=0;j<n;j++){
if(i%a[j]==0){
break;
}
}
if(j==n){a[n]=i;n++;printf "%d %d\n",n,i; if(n==m)break;}
}}'

8 – Largest product in a series
X=7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450

awk -v x=$X 'BEGIN{
m=0;
for(i=1;i<=length(x)-12;i++){
y=substr(x,i,13);
p=1;
for(j=1;j<=13;j++){p*=substr(y,j,1);}
if(p>m)m=p;
printf "%s %d\n",y,p;
}
printf "%d\n",m;
}'

9 – Special Pythagorean triplet

awk 'BEGIN{for(a=1;a<=999;a++)for(b=a;b<=999;b++){
c=1000-a-b; if(c>0 && (a*a+b*b==c*c)) printf "%d %d %d -> %d+%d=%d -> %d\n",a,b,c,a*a,b*b,a*a+b*b,a*b*c;}
}'

10 – Summation of primes

awk -v m=2000000 'BEGIN{
a[0]=2;
n=1;
s=a[0];
for(i=3;i<m;i++){
for(j=0;j<n;j++){
if(i%a[j]==0){
break;
}
}
if(j==n){a[n]=i;s+=i;n++;printf "%d %d\n",n,i; }
}
printf "%d\n",s;
}'

11 – Largest product in a grid

awk -v v=20 'BEGIN{i=0;j=0;}{a[i][j]=$1;j=j+1;if(j>v-1){j=0;i=i+1}}END{
max=0;
for(i=0;i<v;i++){for(j=0;j<v-4+1;j++){n=a[i][j]*a[i][j+1]*a[i][j+2]*a[i][j+3];if(n>m)m=n;}}
for(j=0;j<v;j++){for(i=0;i<v-4+1;i++){n=a[i][j]*a[i+1][j]*a[i+2][j]*a[i+3][j];if(n>m)m=n;}}
for(i=0;i<v-4+1;i++){for(j=0;j<v-4+1;j++){n=a[i][j]*a[i+1][j+1]*a[i+2][j+2]*a[i+3][j+3];if(n>m)m=n;}}
for(i=3;i<v;i++){for(j=3;j<v;j++){n=a[i][j]*a[i+1][j-1]*a[i+2][j-2]*a[i+3][j-3];if(n>m)m=n;}}
printf "%d\n",m;
}' list.txt

12 – Highly divisible triangular number

awk -v lim=500 'function D(x){ 
if(a[x]==0)
{
n=0;
for(i=1;i<=x;i++)if(x%i==0)n++;
a[x]=n;
}
return a[x];
}BEGIN{ for(k=0;;k++){d=(k%2==0)?(D(k/2)*D(k+1)):(D((k+1)/2)*D(k));if(d>lim)break;}j=(k+1)*k/2;printf "%d %d\n",j,d;}'

13 – Large sum

awk '{len=length($0);r=0;
for(i=0;i<len;i++)
{
a[i]+=substr($0,len-i,1)+r;r=0;
if(a[i]>=10){
a[i]-=10;
r=1;
}
}
if(n<len) n=len;
for(;i<n;i++){
a[i]+=r;r=0;
if(a[i]>=10){
a[i]-=10;
r=1;
}
}
if(r>0){a[n]+=r;n++;}
for(i=n-1;i>=0;i--)
printf "%d",a[i];
printf "\n";}' LargeSum.txt

14 – Longest Collatz sequence

awk -v lim=1000000 'BEGIN{
max=1;maxlen=1;
for(i=2;i<lim;i++){
n=i;len=1;
while(n!=1){n=(n%2==0)?n/2:3*n+1;len++;}
if (len>maxlen){maxlen=len;max=i;}
}
printf "%d %d\n",max,maxlen;}'
awk -v n=837799 'BEGIN{printf "%d",n;while(n!=1){n=(n%2==0)?n/2:3*n+1;printf "->%d",n;}}'

15 – Lattice paths

awk 'BEGIN{
P[0]=2;P[1]=3;P[2]=5;P[3]=7;P[4]=11;P[5]=13;P[6]=17;P[7]=19;P[8]=23;P[9]=29;P[10]=31;P[11]=37;
for(i=0;i<20;i++)A[i]=40-i;
for(i=0;i<20;i++)
for(k=0;k<12;k++)
while(A[i]%P[k]==0){
A[i]/=P[k];
E[k]++;
}
for(i=0;i<20;i++)A[i]=i+1;
for(i=0;i<20;i++)
for(k=0;k<12;k++)
while(A[i]%P[k]==0){
A[i]/=P[k];
F[k]++;
}
for(i=0;i<12;i++) X[i]=E[i]-F[i];
p=1;
for(i=0;i<12;i++) if(X[i]>0)p*=P[i]^X[i];
printf "%d\n",p;
}'

16 – Power digit sum

awk -v f=1000 'BEGIN{
a[0]=2;
n=1;e=1;
do{
for(i=0;i<n;i++){
R=(i>0)?r[i-1]:0;
r[i]=(a[i]<5)?0:1;
a[i]=R+((a[i]<5)?(2*a[i]):(2*(a[i]-5)));
}
if(r[n-1]>0){a[n]=r[n-1];n++}
e++;
}while(e<f);
for(i=n-1;i>=0;i--) {printf "%d",a[i];s+=a[i];}
printf " -> %d\n",s;
}'

17 – Number letter counts

21124

18 – Maximum path sum I

awk 'BEGIN{
t[0][0]=75;
t[1][0]=95;t[1][1]=64;
t[2][0]=17;t[2][1]=47;t[2][2]=82;
t[3][0]=18;t[3][1]=35;t[3][2]=87;t[3][3]=10;
t[4][0]=20;t[4][1]=4;t[4][2]=82;t[4][3]=47;t[4][4]=65;
t[5][0]=19;t[5][1]=1;t[5][2]=23;t[5][3]=75;t[5][4]=3;t[5][5]=34;
t[6][0]=88;t[6][1]=2;t[6][2]=77;t[6][3]=73;t[6][4]=7;t[6][5]=63;t[6][6]=67;
t[7][0]=99;t[7][1]=65;t[7][2]=4;t[7][3]=28;t[7][4]=6;t[7][5]=16;t[7][6]=70;t[7][7]=92;
t[8][0]=41;t[8][1]=41;t[8][2]=26;t[8][3]=56;t[8][4]=83;t[8][5]=40;t[8][6]=80;t[8][7]=70;t[8][8]=33;
t[9][0]=41;t[9][1]=48;t[9][2]=72;t[9][3]=33;t[9][4]=47;t[9][5]=32;t[9][6]=37;t[9][7]=16;t[9][8]=94;t[9][9]=29;
t[10][0]=53;t[10][1]=71;t[10][2]=44;t[10][3]=65;t[10][4]=25;t[10][5]=43;t[10][6]=91;t[10][7]=52;t[10][8]=97;t[10][9]=51;t[10][10]=14;
t[11][0]=70;t[11][1]=11;t[11][2]=33;t[11][3]=28;t[11][4]=77;t[11][5]=73;t[11][6]=17;t[11][7]=78;t[11][8]=39;t[11][9]=68;t[11][10]=17;t[11][11]=57;
t[12][0]=91;t[12][1]=71;t[12][2]=52;t[12][3]=38;t[12][4]=17;t[12][5]=14;t[12][6]=91;t[12][7]=43;t[12][8]=58;t[12][9]=50;t[12][10]=27;t[12][11]=29;t[12][12]=48;
t[13][0]=63;t[13][1]=66;t[13][2]=4;t[13][3]=68;t[13][4]=89;t[13][5]=53;t[13][6]=67;t[13][7]=30;t[13][8]=73;t[13][9]=16;t[13][10]=69;t[13][11]=87;t[13][12]=40;t[13][13]=31;
t[14][0]=4;t[14][1]=62;t[14][2]=98;t[14][3]=27;t[14][4]=23;t[14][5]=9;t[14][6]=70;t[14][7]=98;t[14][8]=73;t[14][9]=93;t[14][10]=38;t[14][11]=53;t[14][12]=60;t[14][13]=4;t[14][14]=23;
m=0;
for(a=0;a<=16383;a++){
f=1;
x=0;y=0;s=t[y][x];
while(y<15) {y++;x+=(and(a,f)==0)?0:1;s+=t[y][x];f*=2;}
m=(s>m)?s:m;
}
printf "%d\n",m;
}'

19 – Counting Sundays

20 – Factorial digit sum

awk -v n=1100 'BEGIN{
for(i=1;i<=n;i++) a[i]=i;
do{
 flag=0;
 for(i=1;i<=n;i++){
  if(a[i]%5==0){
   for(j=1;j<=n;j++){
    if(a[j]%2==0){
      flag=1;
      a[i]/=5;
      a[j]/=2;
      f++;
      break;
    }
   }
  }
 }
}while(flag==1);
p[1]=1;lp=1;
for(i=1;i<=n;i++){
 if(a[i]>1){
  for(j=1;j<=lp;j++){
   p[j]*=a[i];
  }
  for(j=1;j<=lp;j++){
   if(p[j]>=10){
    z=int(p[j]/10);
    p[j]-=(z*10);
    p[j+1]+=z;
    if(z>0 && j==lp) lp++;
   }
  }
 }
}
printf "%d!=",n;
for(i=lp;i>0;i--){s+=p[i];printf "%d",p[i];}
printf "x10^%d->%d\n",f,s;
}'

21 – Amicable numbers

awk -v max=10000 '
   function SumDiv(loc_num)
   {
     loc_c=(loc_num>1)?1:0;
     loc_r=int(sqrt(loc_num))+1;
     for(loc_j=2;loc_j<loc_r;loc_j++){
       if (loc_num%loc_j==0){
          loc_q=(loc_num/loc_j);
          if (loc_j>loc_q) break;
          loc_c+=(loc_j<loc_q)?loc_j+loc_q:loc_j;
        }
     }
     return loc_c;
   }
BEGIN{
 for(n=1;n<max;n++){
   a=SumDiv(n);
   b=SumDiv(a);
   if(n==b && a!=b){s+=n;printf "%d\n",n;}
 }
 printf "Total=%d\n",s;
}'

22 – Names scores

awk '{AZ="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
n=split($0,a,",");
asort(a);
for(k=1;k<=n;k++){
l=length(a[k]);
s=0;
for(i=1;i<=l;i++){c=substr(a[k],i,1);ix=index(AZ,c);s=s+ix;}t+=(s*k);}
printf "Total score = %d\n",t;
}'  p022_names.txt

23 – Non-abundant sums

awk -v max=28123 '
   function SumDiv(loc_num)
   {
     loc_c=(loc_num>1)?1:0;
     loc_r=int(sqrt(loc_num))+1;
     for(loc_j=2;loc_j<loc_r;loc_j++){
       if (loc_num%loc_j==0){
          loc_q=(loc_num/loc_j);
          if (loc_j>loc_q) break;
          loc_c+=(loc_j<loc_q)?loc_j+loc_q:loc_j;
        }
     }
     return loc_c;
   }
BEGIN{
 printf "Ready... ";
 for(n=1;n<=max;n++){
   a=SumDiv(n);
   if(a>n){list[n]=1;ab++;}
 }
 printf "Go!\n";
 for(n=1;n<=max;n++){
 for(k=1;k<=n;k++){
    if(list[k]==1){
    h=n-k;
    if(h>0 && list[h]==1){s+=n; ns++;break;}
    }
 }
 }
 printf "Abundant numbers = %d\n",ab;
 printf "Numbers sum of two Abundants = %d\n",ns;
 printf "Sum of Numbers sum of two Abundants = %d\n",s;
}'

echo "28123*(28123+1)/2-391285755"|bc

24 – Lexicographic permutations

awk -v c=1000000 -v n=10 'BEGIN{
 c=c-1;f=1;
 for(i=0;i<n;i++){a[i]=i;f*=(i+1);}
 r=c;
 while(f>1){
  f/=n;
  q=int(r/f);
  r=r%f;
  n--;
  printf "%d",a[q];
  for(i=q;i<n;i++)a[i]=a[i+1];a[i]=0;
 }
 printf "%d\n",a[0];
}'

25 – 1000-digit Fibonacci number

awk 'BEGIN{ 
  a[0]=1;na=1;
  b[0]=1;nb=1;
  z=(na>nb)?na:nb;
  k=2;
  while(z<=1000){
   z=(na>nb)?na:nb;
   r=0;
   for(i=0;i<z;i++){
    c=a[i]+b[i]+r;
    r=0;
    if(c>=10){r=1;c-=10;}
     a[i]=c;
    }
	na=z;
	if(r!=0){a[z]+=r;na=z+1;}
    k++;
    printf "n. %d ",k;
    for(i=na-1;i>=0;i--) printf "%d",a[i];
    printf " -> %d\n",na;
    z=(na>nb)?na:nb;
    r=0;
    for(i=0;i<z;i++){
	  c=a[i]+b[i]+r;
      r=0;
      if(c>=10){r=1;c-=10;}
      b[i]=c;
    }
    nb=z;
    if(r!=0){b[z]+=r;nb=z+1;}
    k++;
    printf "n. %d ",k;
    for(i=nb-1;i>=0;i--) printf "%d",b[i];
    printf " -> %d\n",nb;

  }
}'

26 – Reciprocal cycles

awk -v m=10000 'BEGIN{
   maxp=0;
   maxd=0;
   for(d=1;d<=m;d++){
      n=1;
      printf "%d/%d=",n,d;
      a=int(n/d);
      INT=a;
      i=0;
      while(1==1){
         r=n%d;if(r==0) break;
         n=r*10;
         a=int(n/d);
         new=0;
         for(j=0;j<i;j++) if (R[j]==r){new=1;break;}
         if(new==1) break;
         f[i]=a;
         R[i]=r;
         i++;
      }
      printf "%d,",INT;
      for(k=0;k<j;k++) printf "%d",f[k];
      if (new==1){
         printf "(";
         for(k=j;k<i;k++) printf "%d",f[k];
         printf ")\n";
   	     if(maxp<(i-j)){
   	     maxp=(i-j);maxd=d;
   		 }
      }
      else
      {
         for(k=j;k<i;k++) printf "%d",f[k];
         printf "\n";
      }
   }
   printf "Max Div=%d\n",maxd;
}'
awk -v n=1 -v d=983 'BEGIN{
      printf "%d/%d=",n,d;
      a=int(n/d);
      INT=a;
      i=0;
      while(1==1){
         r=n%d;if(r==0) break;
         n=r*10;
         a=int(n/d);
         new=0;
         for(j=0;j<i;j++) if (R[j]==r){new=1;break;}
         if(new==1) break;
         f[i]=a;
         R[i]=r;
         i++;
      }
      printf "%d,",INT;
      for(k=0;k<j;k++) printf "%d",f[k];
      if (new==1){
         printf "(";
         for(k=j;k<i;k++) printf "%d",f[k];
         printf ")\n";
   	     if(maxp<(i-j)){
   	     maxp=(i-j);maxd=d;
   		 }
      }
      else
      {
         for(k=j;k<i;k++) printf "%d",f[k];
         printf "\n";
      }
}'

28 – Number spiral diagonals
Sum of Spiral=(4 n^3+3 n^2 + 8 n – 9)/6

awk -v r=1001 'BEGIN{
n=1;s=n;
for(p=2;;p+=2){
for(i=0;i<4;i++){
n+=p;
s+=n;
}
if (n>=r*r) break;
}
printf "%d\n",s;
}'

30 – Digit fifth powers

awk 'BEGIN{for(i=2;i<9999999;i++) {p=0;for(j=1;j<=length(i);j++){p+=substr(i,j,1)^5;}if(i==p)printf "%d %d\n", i,p;}}'

32 – Pandigital products

awk '
function IsPandigital(locS)
{
	if(length(locS)!=9) return 0;
	for(locI=1;locI<10;locI++){
		if(match(locS,locI)==0) return 0;
	}
	return 1;
}
BEGIN{
	n=0;
	for(c=1000;c<=9999;c++){
		for(a=1;a<99;a++){
				if(c%a==0){
					b=c/a;
					s=sprintf("%d%d%d", a,b,c);
					if(IsPandigital(s)==1){
						for(k=0;k<n;k++){
							if(p[k]==c) break;
						}
						if(k==n){
						sum+=c;
						p[n]=c;
						n++;
						printf "%dx%d=%d\n",a,b,c;
					}
				}
			}
		}
	}
	printf "sum=%d\n",sum;
}'

34 – Digit factorials

awk 'BEGIN{
f[0]=1
for(i=1;i<10;i++){
f[i]=f[i-1]*i;
}
for(i=3;i<=100000;i++){
len=length(i);
s=0;
#printf "%d ",i;
for(j=1;j<=len;j++)
{
c=substr(i,j,1);
s+=f[c];
#printf "%d!=%d ",c,f[c];
}
if(s==i)printf " %d\n",s;
}
}'

35 – Circular primes

awk -v n=1000000 '
function Rotate(locN){
locL=length(locN);
locE=1;
locB=0;
for(locI=locL;locI>1;locI--){
locM=substr(locN,locI,1);
locE*=10;
locB+=(locM*locE);
}
locB+=substr(locN,locI,1);
return locB;
}
function InizializePrimeArray(locN)
{
p[0]=2;np=1;
for(locI=3;locI<locN;locI+=2){
locP=1;
for(locJ=0;locJ<locI && p[locJ]*p[locJ]<locI;locJ++){
if(locI%p[locJ]==0){
locP=0;
break;
}
}
if(locP==1){
p[np]=locI;
np++;
}
}
}
function ValidNum(locN){
if (locN==2||locN==5) return 0;
locL=length(locN);
for(locI=1;locI<=locL;locI++){
if(substr(locN,locI,1)!="1"&&substr(locN,locI,1)!="3"&&substr(locN,locI,1)!="7"&&substr(locN,locI,1)!="9"){
return 1;
}
}
return 0;
}
function IsPrime(locN)
{
if(locN<=1) return 0
locP=1;
for(locJ=0;locJ<np;locJ++)if(locN!=p[locJ] && locN%p[locJ]==0){
locP=0;break;
}
return locP;
}
BEGIN{
InizializePrimeArray(int(sqrt(n)));
for(i=2;i<n;i++){
if(ValidNum(i)==0){
g=i;
if(IsPrime(g)==1){
waste=0;
h=g;
do{
h=Rotate(h);
if(IsPrime(h)==0){waste=1;}
}while(h!=g);
if(waste==0){printf "%d\n",g;count++;}
}
}
}
printf "Count=%d\n",count;
}'

38 – Pandigital multiples

awk '
function IsPandigital(locS)
{
	if(length(locS)!=9) return 0;
	for(locI=1;locI<10;locI++){
		if(match(locS,locI)==0) return 0;
	}
	return 1;
}
BEGIN{
	for(n=2;n<=9;n++){
		L=int(9/n);
		min=10^(L-1);max=10^(L);
		for(i=min;i<max;i++){
			s="";
			for(j=1;j<=n;j++){
				m=j*i;
				s=sprintf("%s%d",s,m);
			}
			if(IsPandigital(s)==1)
				printf "1..%d x %i -> %s\n",n,i,s;
		}
	}
}'

42 – Coded triangle numbers

cat p042_words.txt| tr -d \"| tr -s \, \\n | \
awk 'BEGIN{k=0;a="ABCDEFGHIJKLMNOPQRSTUVWXYZ";}
{n=0;for(i=1;i<=length($1);i++) n+=index(a,substr($1,i,1));t=0;for(i=1;i<25;i++){t+=i;if(n == t) {k++;printf "%s %d\n",$1,n;}}}
END{print k;}'

46 – Goldbach’s other conjecture

awk -v n=10000 '
function InizializePrimeArray(locN)
{
  p[0]=2;np=1;
  for(locI=3;locI<locN;locI+=2){
    locP=1;
    for(locJ=0;locJ<locI && p[locJ]*p[locJ]<locI;locJ++){
      if(locI%p[locJ]==0){
        locP=0;
        break;
      }
    }
    if(locP==1){
      p[np]=locI;
      np++;
    }
  }
}
function IsPrime(locN)
{
  if(locN<=1) return 0
  locP=1;
  for(locJ=0;locJ<np;locJ++)if(locN!=p[locJ] && locN%p[locJ]==0){
    locP=0;break;
  }
  return locP;
}
BEGIN{
  printf "Init...\n";
  InizializePrimeArray(n);
  printf "Begin\n";
  for(i=3;i<=n;i+=2)
  {
    if(IsPrime(i)==0){
      conjecture=0;
      for(j=1;p[j]<i;j++){
        q=(i-p[j])/2;
        sq=int(sqrt(q));
        if(p[j]+2*sq*sq==i){
          printf "%d=%d+2x%d^2\n",i,p[j],sq;
          conjecture=1;
          break;
        }
      }
      if(conjecture==0) {
        printf "%d false\n",i;
        break;
      }
    }
  }
}'

65 – Convergents of e

awk -v n=100 '    
function frac(loc_a,loc_b,loc_c){
  loc_a=loc_a*loc_c+loc_b;
  b=loc_a;
}
function inv(loc_b,loc_c){
  b=loc_c;
  c=loc_b;
}
BEGIN{
  for(m=1;m<=n;m++){
    v[0]=2;
    p=1;
    for(i=1;i<m;i++){
      v[i]=(i%3==2)?2*p++:1;
    }
    b=1;c=v[m-1];
    for(i=m-2;i>=1;i--){
      a=v[i];
      frac(a,b,c);
      inv(b,c);
    }
    a=v[0];
    frac(a,b,c);
    printf "%.0f/%.0f=%f\n",b,c,b/c;
  }
}'

Giochi e divertimento

Gioco della vita di Conway


I parametri x e y sono la dimensione del “campo di gioco”; la geometria utilizzata è quella toroidale.
Le regole impostate sono:
– una casalle “morta” diventa viva se ha esattamente 3 caselle vive a fianco;
– una casella “viva” continua a vivere se ha 2 o 3 caselle vive a fianco;
– negli altri casi (meno di 2 caselle o più 3 caselle vive a fianco) una casella viva muore.

awk 'BEGIN{
x=64;y=32;
srand();
printf "\x1B[2J";
for(i=0;i<y;i++)for(j=0;j<x;j++)b[j,i]=int(rand()+.5);
while(1){
printf "\x1B[1;1H";
for(i=0;i<y;i++){for(j=0;j<x;j++){printf "%s",b[j,i]?".":" ";a[j,i]=b[j,i]}print;}
for(i=0;i<y;i++){for(j=0;j<x;j++) {
L=a[(j-1)%x,(i-1)%y]+a[(j-1)%x,i]+a[(j-1)%x,(i+1)%y]+a[j,(i-1)%y]+a[j,(i+1)%y]+a[(j+1)%x,(i-1)%y]+a[(j+1)%x,i]+a[(j+1)%x,(i+1)%y];
b[j,i]=((a[j,i]==0 && L==3)||(a[j,i]==1 &&(L==2||L==3)))?1:0;
}}}}'

Labirinto infinito

L’output di questo codice a molti potrebbe risultare familiare:

awk 'BEGIN{while(1)printf "%s",int(rand()+.5)?"/":"\\";}'

La nostra inutilità di sistema preferita

$ cowsay moo
 _____
< moo >
 -----
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

Storico gare

“);
printf(“

Data

“);
printf(“

Percorso

“);
printf(“

Lunghezza

“);
printf(“

Tempo

“);
printf(“

Media

\n”);
// printf(“

Tipo

\n”);
// printf(“

Note

\n”);

$result = mysqli_query($db, $query);
while ($row = mysqli_fetch_array($result))
{
$session_id = $row[‘session_id’];
$session_date = $row[‘session_date’];
$training_path_id = $row[‘training_path_id’];
$training_type_id = $row[‘training_type_id’];
$session_length = ( $row[‘session_length’] == NULL ) ? NULL :$row[‘session_length’];
$session_time = $row[‘session_time’];
$session_note = $row[‘session_note’];
$tracking_system_id = $row[‘tracking_system_id’];
$ext_tracking_id = $row[‘ext_tracking_id’];
$path_name = ( $row[‘path_name’] == NULL ) ?
(($session_note == “”) ? “Percorso senza nome”:$session_note)
:$row[‘path_name’];
$path_length = ( $row[‘path_length’] == NULL ) ? NULL : $row[‘path_length’] ;
$path_note = $row[‘path_note’];
$description = $row[‘description’];
$converted_time = NULL;
if ($session_time != NULL){
$session_time_h=(int)($session_time/60/60);
$session_time_m=(int)($session_time/60)-$session_time_h*60;
$session_time_s=$session_time-$session_time_h*60*60-$session_time_m*60;
$converted_time = sprintf(“%02d.%02d.%02d”,$session_time_h,$session_time_m,$session_time_s);
}
$length = ($session_length == NULL) ? $path_length : $session_length;
$converted_length = ( $length == NULL ) ? NULL :number_format($length,2,”,”,”.”);
$average = NULL;
if ($session_time != NULL && $length != NULL) {
$time_second=$session_time/$length;
$average_mm=(int)($time_second/60);
$average_ss=(int)($time_second-$average_mm*60);
$average_ms=(int)(($time_second-(int)($time_second))*100);
$average = sprintf(“%01d.%02d,%d”,$average_mm,$average_ss,$average_ms);
}

$name_link = ““.$path_name.”“;

$note = ($session_note == NULL) ? $path_note : $session_note;
printf(“

%s

“,$session_date);
printf(“

%s

“,$name_link );
printf(“

%s

“,$converted_length);
printf(“

%s

“,$converted_time );
printf(“

%s

\n”,$average );
// printf(“

%s

\n”,$description );
// printf(“

%s

\n”,$note );
}
printf(“

\n”);
}

if ($option==3)
{
$query = “SELECT
S.id as session_id
, S.session_date
, S.training_path_id
, S.training_type_id
, S.session_length
, S.session_time
, S.note as session_note
, S.is_race
, S.tracking_system_id as session_tracking_system_id
, S.ext_tracking_id as session_ext_tracking_id
, P.tracking_system_id as path_tracking_system_id
, P.ext_tracking_id as path_ext_tracking_id
, P.path_name
, P.path_length
, P.note as path_note
, T.description
, Y.description as track_desciption
, Y.homepage as track_homepage
, Y.link_roule as track_roule
, Y.include_roule as track_include
, Z.description as path_track_desciption
, Z.homepage as path_track_homepage
, Z.link_roule as path_track_roule
, Z.include_roule as path_track_include
FROM TRAINING_SESSIONS S
LEFT JOIN TRAINING_PATHS P on S.training_path_id=P.id
LEFT JOIN TRAINING_TYPES T on S.training_type_id=T.id
LEFT JOIN TRACKING_SYSTEMS Y on Y.id = S.tracking_system_id
LEFT JOIN TRACKING_SYSTEMS Z on Z.id = P.tracking_system_id
WHERE S.id = “.$session_id.”
AND S.is_race = 1
ORDER BY S.session_date desc”;

printf(“

“);
printf(“

“);
printf(“

“);
printf(“

“);
printf(“

“);
printf(“

\n”);
// printf(“

\n”);
// printf(“

\n”);

$result = mysqli_query($db, $query);
while ($row = mysqli_fetch_array($result))
{
$session_id = $row[‘session_id’];
$session_date = $row[‘session_date’];
$training_path_id = $row[‘training_path_id’];
$training_type_id = $row[‘training_type_id’];
$session_length = ( $row[‘session_length’] == NULL ) ? NULL :$row[‘session_length’];
$session_tracking_system_id = $row[‘session_tracking_system_id’];
$session_ext_tracking_id = $row[‘session_ext_tracking_id’];
$session_time = $row[‘session_time’];
$session_note = $row[‘session_note’];
$path_tracking_system_id = $row[‘path_tracking_system_id’];
$path_ext_tracking_id = $row[‘path_ext_tracking_id’];
$path_name = ( $row[‘path_name’] == NULL ) ?
(($session_note == “”) ? “Percorso senza nome”:$session_note)
:$row[‘path_name’];
$path_length = ( $row[‘path_length’] == NULL ) ? NULL : $row[‘path_length’] ;
$path_note = $row[‘path_note’];
$description = $row[‘description’];
$track_desciption = $row[‘track_desciption’];
$track_homepage = $row[‘track_homepage’];
$track_roule = $row[‘track_roule’];
$track_include = $row[‘track_include’];

$path_track_desciption = $row[‘path_track_desciption’];
$path_track_homepage = $row[‘path_track_homepage’];
$path_track_roule = $row[‘path_track_roule’];
$path_track_include = $row[‘path_track_include’];

$converted_time = NULL;
if ($session_time != NULL){
$session_time_h=(int)($session_time/60/60);
$session_time_m=(int)($session_time/60)-$session_time_h*60;
$session_time_s=$session_time-$session_time_h*60*60-$session_time_m*60;
$converted_time = sprintf(“%02d.%02d.%02d”,$session_time_h,$session_time_m,$session_time_s);
}
$length = ($session_length == NULL) ? $path_length : $session_length;
$converted_length = ( $length == NULL ) ? NULL :number_format($length,2,”,”,”.”);
$average = NULL;
if ($session_time != NULL && $length != NULL) {
$time_second=$session_time/$length;
$average_mm=(int)($time_second/60);
$average_ss=(int)($time_second-$average_mm*60);
$average_ms=(int)(($time_second-(int)($time_second))*100);
$average = sprintf(“%01d.%02d,%d”,$average_mm,$average_ss,$average_ms);
}

$name_link = ““.$path_name.”“;

$note = ($session_note == NULL) ? $path_note : $session_note;
printf(“

“,$session_date);
printf(“

“,$name_link );
printf(“

“,$converted_length);
printf(“

“,$converted_time );
printf(“

“,$average );
// printf(“

\n”,$description );
printf(“

\n”,$note );
}
printf(“

Data Percorso Lunghezza Tempo Media
Tipo
Note
%s %s %s %s %s
%s
%s

\n”);

if (isset($track_roule) && isset($session_ext_tracking_id))
{
$path_link = str_replace(‘[]’,$session_ext_tracking_id,$track_roule);
printf(“Vai alla mappa\n”,$path_link);
}
elseif (isset($path_track_roule) && isset($path_ext_tracking_id))
{
$path_link = str_replace(‘[]’,$path_ext_tracking_id,$path_track_roule);
printf(“Vai alla mappa\n”,$path_link);
}

if (isset($track_include) && isset($session_ext_tracking_id))
{
$path_include=str_replace(‘[]’,$session_ext_tracking_id,$track_include);
printf(“%s\n”,$path_include );
}
elseif (isset($path_track_include) && isset($path_ext_tracking_id))
{
$path_include=str_replace(‘[]’,$path_ext_tracking_id,$path_track_include);
printf(“

%s

\n”,$path_include );
}

}

?>