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.
Autore: franzpizzo
Divertiamoci un po’
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?
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!
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?”
Forse nessuna, ma cercando su internet ci si può imbattere in questa strana formula matematica, e allora qualcosa sotto c’è:
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.
Il calendario perpetuo di 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.
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!
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.
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.
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
awk -v max=1000 'BEGIN{for(n=1;n<max;n++){if ((n%3)*(n%5)==0) sum+=n}print sum;}'
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;}'
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}$
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;} }'
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;}'
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
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;}}'
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; }'
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; }'
21124
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; }'
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; }'
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; }'
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
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; } }'
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; }'
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;}}'
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; }'
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; } }'
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; }'
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; } } }'
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; } } } }'
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(“
“);
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_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(“
“,$session_date);
printf(“
“,$name_link );
printf(“
“,$converted_length);
printf(“
“,$converted_time );
printf(“
\n”,$average );
// printf(“
\n”,$description );
// printf(“
\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(“
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(“
\n”,$path_include );
}
}
?>