diff --git a/src/asy_library b/src/asy_library
index 9169b89..4b7335e 160000
--- a/src/asy_library
+++ b/src/asy_library
@@ -1 +1 @@
-Subproject commit 9169b894b375b9142f72463ce4bba590b8f8306e
+Subproject commit 4b7335e821d4969c872c57969489722ad8d3b250
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/contest.mdx b/src/fibonacci-primarie/2023-seconda-fase/contest/contest.mdx
new file mode 100644
index 0000000..9f9939d
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/contest.mdx
@@ -0,0 +1,28 @@
+import { P1CicliCondizioni } from "problemset";
+import { P2BalleDiFieno } from "problemset";
+import { P3PileDiCarote } from "problemset";
+import { P4Contatore } from "problemset";
+import { S1OrdinaPalloni } from "problemset";
+import { S2GaraSalto } from "problemset";
+import { S3SquadreBasket } from "problemset";
+import { S4TorriGemelle } from "problemset";
+
+
+
+## Sezione 1: procedimenti procedurali
+
+
+
+## Sezione 2: programmazione
+
+
+
+
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/header.md b/src/fibonacci-primarie/2023-seconda-fase/contest/header.md
new file mode 100644
index 0000000..0847a2f
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/header.md
@@ -0,0 +1,24 @@
+Questa prova contiene _6 domande_ da risolvere in _100 minuti_.
+Le domande sono a **scelta multipla** o a **blocchi**, e sono divise in due parti:
+
+- domande di interpretazione di **procedimenti procedurali** come programmi a blocchi, e
+- domande di **programmazione** tramite blocchi.
+
+In entrambe le parti, le domande sono ordinate per difficoltà crescente.
+**Attento che la difficoltà è soggettiva!** Se stai passando tanto tempo cercando di risolvere una domanda, prova a passare ad altre domande e altre categorie!
+
+## Punteggio
+
+Tutte le domande a _scelta multipla_ hanno 5 opzioni, di cui **solo una** è corretta. Il punteggio che puoi ottenere è:
+
+- 5 punti per una risposta _corretta_;
+- 1 punto per una risposta _non data_;
+- 0 punti per una risposta _sbagliata_.
+
+Le domande a _blocchi_ richiedono di scrivere un singolo programma a blocchi, che viene valutato su tre diversi livelli.
+Per ciascuna domanda e per ciascun livello, Il punteggio che puoi ottenere è:
+
+- 5 punti se il programma produce la risposta _corretta_;
+- 0 punti se il programma produce una risposta _sbagliata_.
+
+Quindi ogni domanda a blocchi può valere fino a 15 punti in totale.
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/p-1-cicli-condizioni/code.asy b/src/fibonacci-primarie/2023-seconda-fase/contest/p-1-cicli-condizioni/code.asy
new file mode 100644
index 0000000..e8557d5
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/p-1-cicli-condizioni/code.asy
@@ -0,0 +1,99 @@
+access "../../../../asy_library/structures/layout.asy" as layout;
+
+unravel layout; // per evitare di scrivere layout.cose tutto il tempo
+
+unitsize(1cm);
+
+TEXT_SIZE = 2;
+ALIGN = (0, 0.5);
+
+element P = row(
+ 5*BLOCK_PADDING,
+ fill_space=0,
+ block_sequence(
+ start_block(element("Opzione 1:")),
+ for_block(
+ block_content(e("ripeti"), data_block(e("8")), e("volte:")),
+ block_sequence(
+ instr_block(element("mangia carota")),
+ instr_block(element("avanza"))
+ )
+ ),
+ instr_block(element("mangia carota"))
+ ),
+ block_sequence(
+ start_block(element("Opzione 2:")),
+ for_block(
+ block_content(e("ripeti"), data_block(e("8")), e("volte:")),
+ block_sequence(
+ if_block(
+ block_content(e("se"), cond_block(e("roccia marrone"))),
+ instr_block(element("mangia carota"))
+ ),
+ instr_block(element("avanza"))
+ )
+ ),
+ instr_block(element("mangia carota"))
+ ),
+ block_sequence(
+ start_block(element("Opzione 3:")),
+ for_block(
+ block_content(e("ripeti"), data_block(e("2")), e("volte:")),
+ block_sequence(
+ instr_block(element("mangia carota")),
+ for_block(
+ block_content(e("ripeti"), data_block(e("4")), e("volte:")),
+ block_sequence(
+ instr_block(element("avanza")),
+ if_block(
+ block_content(e("se"), cond_block(e("roccia marrone"))),
+ instr_block(element("mangia carota"))
+ )
+ )
+ )
+ )
+ )
+ ),
+ block_sequence(
+ start_block(element("Opzione 4:")),
+ instr_block(element("mangia carota")),
+ for_block(
+ block_content(e("ripeti"), data_block(e("4")), e("volte:")),
+ block_sequence(
+ instr_block(element("avanza")),
+ if_block(
+ block_content(e("se"), cond_block(e("roccia marrone"))),
+ instr_block(element("mangia carota"))
+ ),
+ instr_block(element("avanza"))
+ )
+ ),
+ instr_block(element("mangia carota"))
+ ),
+ block_sequence(
+ start_block(element("Opzione 5:")),
+ for_block(
+ block_content(e("ripeti"), data_block(e("4")), e("volte:")),
+ block_sequence(
+ if_block(
+ block_content(e("se"), cond_block(e("roccia marrone"))),
+ instr_block(element("mangia carota"))
+ ),
+ instr_block(element("avanza"))
+ )
+ ),
+ instr_block(element("mangia carota")),
+ for_block(
+ block_content(e("ripeti"), data_block(e("4")), e("volte:")),
+ block_sequence(
+ instr_block(element("avanza")),
+ if_block(
+ block_content(e("se"), cond_block(e("roccia marrone"))),
+ instr_block(element("mangia carota"))
+ )
+ )
+ )
+ )
+);
+
+add(P.drawing());
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/p-1-cicli-condizioni/fig.asy b/src/fibonacci-primarie/2023-seconda-fase/contest/p-1-cicli-condizioni/fig.asy
new file mode 100644
index 0000000..8be8426
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/p-1-cicli-condizioni/fig.asy
@@ -0,0 +1,18 @@
+unitsize(1cm);
+
+access "../../../../asy_library/pictures/carrot.asy" as carrot;
+access "../../../../asy_library/pictures/flat_rock.asy" as flat_rock;
+access "../../../../asy_library/pictures/bunny_polychrome.asy" as bunny_polychrome;
+access "../../../../asy_library/pictures/vertical_door.asy" as vertical_door;
+
+pen[] cols = {brown, gray};
+int[] rocks = {0, 0, 1, 0, 1, 0, 1, 0, 0};
+bool[] carts = {true, true, false, true, true, true, false, true, true};
+
+for (int i=0; i Tip-Tap riesce a mangiare tutte le carote sia seguendo l'opzione 3 che l'opzione 5.
+>
+> _Nell'opzione 3, inizia mangiando la prima carota, poi le carote sulle rocce marroni tra le 4 successive, poi un'altra carota
+> (quella sulla roccia grigia centrale), e ancora le carote sulle rocce marroni tra le 4 successive._
+>
+> _Nell'opzione 5, inizia mangiando le carote sulle rocce marroni tra le prime 4, poi un'altra carota
+> (quella sulla roccia grigia centrale), e ancora le carote sulle rocce marroni tra le 4 successive._
+>
+> In tutte le altre tre opzioni, Tip-Tap non riesce a fare quanto richiesto.
+>
+> _Nell'opzione 1, Tip-Tap tenta di mangiare carote anche dove non ce ne sono, mordendosi la lingua._
+>
+> _Nell'opzione 2, Tip-Tap mangia tutte le carote sulle rocce marroni, ma non mangia la carota sulla roccia grigia centrale._
+>
+> _Nell'opzione 4, Tip-Tap mangia la prima carota, poi una carota ogni due rocce, e infine mangia anche l'ultima carota.
+> Anche in questo caso non mangia la carota sulla roccia grigia centrale._
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/p-2-balle-di-fieno/code.asy b/src/fibonacci-primarie/2023-seconda-fase/contest/p-2-balle-di-fieno/code.asy
new file mode 100644
index 0000000..7459dde
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/p-2-balle-di-fieno/code.asy
@@ -0,0 +1,30 @@
+access "../../../../asy_library/structures/layout.asy" as layout;
+
+unravel layout; // per evitare di scrivere layout.cose tutto il tempo
+
+unitsize(1cm);
+
+TEXT_SIZE = 2;
+ALIGN = (0, 0.5);
+
+element P = row(
+ BLOCK_PADDING,
+ fill_space=0,
+ block_sequence(
+ instr_block(element("imposta"), choice_block(e("posizione")), element("a"), data_block(e("1"))),
+ for_block(
+ block_content(e("ripeti mentre"), cond_block(data_block(e("posizione")), e("minore di"), data_block(e("9"))), e(":")),
+ block_sequence(
+ else_block(
+ block_content(e("se"), cond_block(data_block(e("altezza della pila"), data_block(data_block(e("posizione")), e("+"), data_block(e("1")))), e("minore di"), data_block(e("altezza della pila"), data_block(e("posizione"))))),
+ instr_block(e("diminuisci"), choice_block(e("posizione")), element("di"), data_block(e("1"))),
+ block_content(e("altrimenti: ")),
+ instr_block(e("aumenta"), choice_block(e("posizione")), element("di"), data_block(e("2")))
+ )
+ )
+ ),
+ instr_block(element("esci dal fienile"))
+ )
+);
+
+add(P.drawing());
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/p-2-balle-di-fieno/opzioni.asy b/src/fibonacci-primarie/2023-seconda-fase/contest/p-2-balle-di-fieno/opzioni.asy
new file mode 100644
index 0000000..b52e924
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/p-2-balle-di-fieno/opzioni.asy
@@ -0,0 +1,30 @@
+unitsize(1cm);
+
+access "../../../../asy_library/pictures/bunny_polychrome.asy" as bunny;
+access "../../../../asy_library/pictures/hay_cube.asy" as hay_cube;
+access "../../../../asy_library/structures/layout.asy" as layout;
+
+unravel layout; // per evitare di scrivere layout.cose tutto il tempo
+
+element option(int num, int[] pile) {
+ picture pic;
+ unitsize(pic, 1cm);
+
+ label(pic, scale(2.5)*(string(num)+":"), (-3-0.4,2-1.6));
+ for (int i=0; i Bunny riesce ad uscire dal fienile nell'opzione 1 e nella 2.
+>
+> _Nell'opzione 1, inizia dalla pila 1, poi salta di due in due fino alla pila 9._
+>
+> _Nell'opzione 2, inizia dalla pila 1, salta sulla 3, indietreggia sulla due, salta sulla 4, salta sulla 6, indietreggia sulla 5, salta sulla 7 e finisce sulla 9._
+>
+> _Nell'opzione 3, Bunny non riesce ad uscire perchè rimane bloccato saltando in circolo tra le pile 3, 4, 5 senza mai smettere._
\ No newline at end of file
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/p-3-pile-di-carote/code.asy b/src/fibonacci-primarie/2023-seconda-fase/contest/p-3-pile-di-carote/code.asy
new file mode 100644
index 0000000..6d71fbb
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/p-3-pile-di-carote/code.asy
@@ -0,0 +1,38 @@
+access "../../../../asy_library/structures/layout.asy" as layout;
+
+unravel layout; // per evitare di scrivere layout.cose tutto il tempo
+
+unitsize(1cm);
+
+TEXT_SIZE = 2;
+ALIGN = (0, 0.5);
+
+element P = row(
+ BLOCK_PADDING,
+ fill_space=0,
+ block_sequence(
+ instr_block(element("imposta"), choice_block(e("mucchio sinistro")), element("a"), data_block(e("2024")), e("carote")),
+ instr_block(element("imposta"), choice_block(e("mucchio destro")), element("a"), data_block(e("3024")), e("carote")),
+ for_block(
+ block_content(e("ripeti fino a che"), cond_block(cond_block(data_block(e("mucchio sinistro")), e("ha meno carote di"), data_block(e("7"))), e("o"), cond_block(data_block(e("mucchio destro")), e("ha meno carote di"), data_block(e("7")))), e(":")),
+ block_sequence(
+ else_block(
+ block_content(e("se"), cond_block(data_block(e("mucchio sinistro")), e("ha meno carote di"), data_block(e("mucchio destro")))),
+ block_sequence(
+ instr_block(choice_block(e("Bunny")), e("mangia"), data_block(e("3")), e("carote da"), choice_block(e("mucchio sinistro"))),
+ instr_block(choice_block(e("Tip-Tap")), e("mangia"), data_block(e("7")), e("carote da"), choice_block(e("mucchio destro")))
+ ),
+ block_content(e("altrimenti:")),
+ block_sequence(
+ instr_block(choice_block(e("Tip-Tap")), e("mangia"), data_block(e("6")), e("carote da"), choice_block(e("mucchio sinistro"))),
+ instr_block(choice_block(e("Bunny")), e("mangia"), data_block(e("4")), e("carote da"), choice_block(e("mucchio destro")))
+ )
+ )
+ )
+ ),
+ instr_block(choice_block(e("Carol")), e("mangia"), data_block(e("mucchio sinistro")), e("carote da"), choice_block(e("mucchio sinistro"))),
+ instr_block(choice_block(e("Carol")), e("mangia"), data_block(e("mucchio destro")), e("carote da"), choice_block(e("mucchio destro")))
+ )
+);
+
+add(P.drawing());
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/p-3-pile-di-carote/question.md b/src/fibonacci-primarie/2023-seconda-fase/contest/p-3-pile-di-carote/question.md
new file mode 100644
index 0000000..f374796
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/p-3-pile-di-carote/question.md
@@ -0,0 +1,29 @@
+I conigli della fattoria Fibonacci hanno preparato due enormi mucchi di carote.
+All'inizio il mucchio sinistro contiene 2024 carote, mentre il mucchio destro ne contiene 3024.
+Bunny, Tip-Tap e Carol le mangiano seguendo questo procedimento:
+
+
+
+Quante carote mangia Carol?
+- [ ] 0
+- [ ] 1
+- [ ] 2
+- [ ] 4
+- [x] 8
+
+> Si può notare che ad ogni passaggio della ripetizione, indipendentemente da quale mucchio
+> abbia più carote, Tip-Tap e Bunny in totale mangiano $10$ carote.
+> Visto che all'inizio ci sono $2024 + 3024 = 5048$ carote, i due conigli andranno avanti
+> a mangiare $10$ carote per volta fino a quando rimarranno $8$ carote tra i due mucchi.
+> A quel punto tutte le carote rimaste le mangerà Carol!
+>
+> **Approfondimento:** visto che la condizione che termina la ripetizione chiede solo che
+> una delle due pile contenga meno di $7$ carote, si potrebbe pensare che alla fine potrebbero
+> rimanere più carote per Carol, come $18$, $28$, $38$, eccetera. Questo però non è possibile!
+>
+> Infatti, si può notare che ogni volta Tip-Tap e Bunny mangiano più carote dalla pila più grande
+> e meno dalla pila più piccola. Questo porta a ridurre la differenza tra le due pile, finché
+> la differenza non è **al massimo 3**. Da quel punto in poi la differenza tra le due pila rimarrà
+> sempre al massimo 3, e quindi quando una pila arriva ad avere meno di $7$ carote (quindi al massimo
+> $6$), l'altra pila non può avere più di $6 + 3 = 9$ carote, per un totale di al massimo $9 + 6 = 15$
+> carote, che è meno di $18$.
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/p-4-contatore/code.asy b/src/fibonacci-primarie/2023-seconda-fase/contest/p-4-contatore/code.asy
new file mode 100644
index 0000000..3b68e11
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/p-4-contatore/code.asy
@@ -0,0 +1,32 @@
+access "../../../../asy_library/structures/layout.asy" as layout;
+
+unravel layout; // per evitare di scrivere layout.cose tutto il tempo
+
+unitsize(1cm);
+
+TEXT_SIZE = 2;
+ALIGN = (0, 0.5);
+
+element P = row(
+ BLOCK_PADDING,
+ fill_space=0,
+ block_sequence(
+ instr_block(element("imposta"), choice_block(e("contatore")), element("a"), data_block(e("0"))),
+ for_block(
+ block_content(e("conta con"), choice_block(e("i")), e("da"), data_block(e("1")), e("a"), data_block(e("42")), e(":")),
+ block_sequence(
+ if_block(
+ block_content(e("se"), cond_block(e(""), choice_block(e("i")), e("è multiplo di"), data_block(e("7")), e("")), e(":")),
+ instr_block(element("aumenta"), choice_block(e("contatore")), element("di"), data_block(e("1")))
+ ),
+ if_block(
+ block_content(e("se"), cond_block(e(""), choice_block(e("i")), e("è multiplo di"), data_block(e("9")), e("")), e(":")),
+ instr_block(element("diminuisci"), choice_block(e("contatore")), element("di"), data_block(e("1")))
+ )
+ )
+ ),
+ instr_block(element("stampa"), choice_block(e("contatore")))
+ )
+);
+
+add(P.drawing());
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/p-4-contatore/question.md b/src/fibonacci-primarie/2023-seconda-fase/contest/p-4-contatore/question.md
new file mode 100644
index 0000000..285e9a5
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/p-4-contatore/question.md
@@ -0,0 +1,15 @@
+Tip-Tap sistemando la sua soffitta si è imbattuto in un libro di programmazione molto vecchio. Nella prima pagina trova il seguente procedimento:
+
+
+
+Purtroppo la successiva pagina è rovinata perciò Tip-Tap non riesce a capire che numero verrà stampato alla fine, aiutalo tu! Quale numero viene stampato dall'ultimo blocco?
+- [ ] 0
+- [x] 2
+- [ ] 4
+- [ ] 6
+- [ ] 10
+
+> Il programma incrementa il contatore per ogni multiplo di $7$ fino a $42$,
+> e lo decrementa per ogni multiplo di $9$ fino a $42$.
+> Siccome i multipli di $7$ fino a $42$ sono $6$ e i multipli di $9$ fino a $42$ sono $4$,
+> il contatore alla fine varrà $6 - 4 = 2$.
\ No newline at end of file
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/asy/ball0.asy b/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/asy/ball0.asy
new file mode 100644
index 0000000..bfcfb42
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/asy/ball0.asy
@@ -0,0 +1,12 @@
+access "../../../../../asy_library/pictures/basket_ball.asy" as basket_ball;
+access "../../../../../asy_library/pictures/soccer_ball.asy" as soccer_ball;
+
+unitsize(1cm);
+
+picture ball(int i) {
+ real y = i % 2 == 0 ? 0.5 : 1;
+ picture b = i < 2 ? soccer_ball.drawing() : basket_ball.drawing();
+ return yscale(y)*scale(0.8)*b;
+}
+
+add(ball(0));
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/asy/ball1.asy b/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/asy/ball1.asy
new file mode 100644
index 0000000..42b50a2
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/asy/ball1.asy
@@ -0,0 +1,12 @@
+access "../../../../../asy_library/pictures/basket_ball.asy" as basket_ball;
+access "../../../../../asy_library/pictures/soccer_ball.asy" as soccer_ball;
+
+unitsize(1cm);
+
+picture ball(int i) {
+ real y = i % 2 == 0 ? 0.5 : 1;
+ picture b = i < 2 ? soccer_ball.drawing() : basket_ball.drawing();
+ return yscale(y)*scale(0.8)*b;
+}
+
+add(ball(1));
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/asy/ball2.asy b/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/asy/ball2.asy
new file mode 100644
index 0000000..13c7bab
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/asy/ball2.asy
@@ -0,0 +1,12 @@
+access "../../../../../asy_library/pictures/basket_ball.asy" as basket_ball;
+access "../../../../../asy_library/pictures/soccer_ball.asy" as soccer_ball;
+
+unitsize(1cm);
+
+picture ball(int i) {
+ real y = i % 2 == 0 ? 0.5 : 1;
+ picture b = i < 2 ? soccer_ball.drawing() : basket_ball.drawing();
+ return yscale(y)*scale(0.8)*b;
+}
+
+add(ball(2));
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/asy/ball3.asy b/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/asy/ball3.asy
new file mode 100644
index 0000000..2227421
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/asy/ball3.asy
@@ -0,0 +1,12 @@
+access "../../../../../asy_library/pictures/basket_ball.asy" as basket_ball;
+access "../../../../../asy_library/pictures/soccer_ball.asy" as soccer_ball;
+
+unitsize(1cm);
+
+picture ball(int i) {
+ real y = i % 2 == 0 ? 0.5 : 1;
+ picture b = i < 2 ? soccer_ball.drawing() : basket_ball.drawing();
+ return yscale(y)*scale(0.8)*b;
+}
+
+add(ball(3));
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/asy/bunny.asy b/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/asy/bunny.asy
new file mode 100644
index 0000000..9d0a185
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/asy/bunny.asy
@@ -0,0 +1,5 @@
+unitsize(1cm);
+
+access "../../../../../asy_library/pictures/bunny_polychrome.asy" as bunny;
+
+add(reflect((2, 1), (2, 0))*bunny.drawing(0.85, bunny.tiptap_col));
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/asy/shelf.asy b/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/asy/shelf.asy
new file mode 100644
index 0000000..cb29579
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/asy/shelf.asy
@@ -0,0 +1,5 @@
+unitsize(1cm);
+
+access "../../../../../asy_library/pictures/shelf.asy" as shelf;
+
+add(shelf.drawing(aspect=1.6, num=3));
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/asy/trash.asy b/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/asy/trash.asy
new file mode 100644
index 0000000..5de5d9e
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/asy/trash.asy
@@ -0,0 +1,5 @@
+unitsize(1cm);
+
+access "../../../../../asy_library/pictures/trash_transparent.asy" as trash;
+
+add(trash.drawing());
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/customBlocks.yaml b/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/customBlocks.yaml
new file mode 100644
index 0000000..97f8aa7
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/customBlocks.yaml
@@ -0,0 +1,83 @@
+- type: start
+ message0: inizia qui
+ nextStatement: null
+ colour: 20
+ tooltip: L'esecuzione inizia da qui
+ helpUrl: ""
+ maxInstances: 1
+ js: ""
+
+- type: N
+ message0: N
+ output: Number
+ colour: 20
+ tooltip: numero totale di palloni da sistemare
+ helpUrl: ""
+ js:
+ - hiddenState.N
+ - ORDER_MEMBER
+
+- type: pallone da calcio
+ message0: pallone da calcio
+ output: Boolean
+ colour: 20
+ tooltip: il prossimo pallone è da calcio?
+ helpUrl: ""
+ js:
+ - |
+ hiddenState.pos < hiddenState.N ? hiddenState.balls[hiddenState.pos] < 2 : exit(false, "non ci sono più palloni")
+ - ORDER_CONDITIONAL
+
+- type: pallone gonfio
+ message0: pallone gonfio
+ output: Boolean
+ colour: 20
+ tooltip: il prossimo pallone è gonfio?
+ helpUrl: ""
+ js:
+ - |
+ hiddenState.pos < hiddenState.N ? hiddenState.balls[hiddenState.pos] % 2 : exit(false, "non ci sono più palloni")
+ - ORDER_CONDITIONAL
+
+- type: tieni
+ message0: tieni
+ previousStatement: null
+ nextStatement: null
+ colour: 20
+ tooltip: metti da parte il prossimo pallone
+ helpUrl: ""
+ js: |
+ if (hiddenState.pos == hiddenState.N)
+ exit(false, "non ci sono più palloni");
+ hiddenState.deposited += 1;
+ hiddenState.placement[hiddenState.pos] = hiddenState.deposited;
+ hiddenState.pos += 1;
+ if (hiddenState.balls[hiddenState.pos-1] === 2)
+ exit(false, "questo pallone era da buttare");
+
+- type: butta
+ message0: butta
+ previousStatement: null
+ nextStatement: null
+ colour: 20
+ tooltip: butta il prossimo pallone
+ helpUrl: ""
+ js: |
+ if (hiddenState.pos == hiddenState.N)
+ exit(false, "non ci sono più palloni");
+ hiddenState.trashed += 1;
+ hiddenState.placement[hiddenState.pos] = -hiddenState.trashed;
+ hiddenState.pos += 1;
+ if (hiddenState.balls[hiddenState.pos-1] !== 2)
+ exit(false, "questo pallone era da tenere");
+
+- type: termina
+ message0: termina
+ previousStatement: null
+ colour: 20
+ tooltip: termina il procedimento
+ helpUrl: ""
+ js: |
+ if (hiddenState.pos < hiddenState.N)
+ exit(false, "non hai finito di sistemare i palloni");
+ exit(true, "hai sistemato i palloni, complimenti!");
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/initialBlocks.json b/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/initialBlocks.json
new file mode 100644
index 0000000..64bd836
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/initialBlocks.json
@@ -0,0 +1,14 @@
+{
+ "blocks": {
+ "languageVersion": 0,
+ "blocks": [
+ {
+ "type": "start",
+ "id": "y=zq)Uya2A/{vyOtN[i6",
+ "x": 61,
+ "y": 81
+ }
+ ]
+ },
+ "variables": []
+}
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/question.mdx b/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/question.mdx
new file mode 100644
index 0000000..21a5818
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/question.mdx
@@ -0,0 +1,33 @@
+import initialBlocks from "./initialBlocks.json";
+import customBlocks from "./customBlocks.yaml";
+import testcases from "./testcases.py";
+import Visualizer from "./visualizer.jsx";
+
+Tip-Tap deve sistemare la sua vecchia collezione di $N$ palloni.
+Non avendo spazio per tutti, ha deciso che terrà **tutti i palloni da calcio** e i **palloni da basket gonfi**,
+mentre butterà i **palloni da basket sgonfi**.
+
+Per farlo, Tip-Tap può compiere le seguenti azioni:
+
+- `tieni`: metti via il prossimo pallone nello scaffale.
+- `butta`: butta via il prossimo pallone nel cestino.
+- `pallone da calcio`: condizione vera se il prossimo pallone è da calcio.
+- `pallone gonfio`: condizione vera se il prossimo pallone è gonfio.
+- `termina`: finisci di mettere a posto i palloni.
+
+Scrivi un programma che consenta a Tip-Tap di sistemare tutti i suoi palloni!
+
+
+
+> Un possibile programma corretto è il seguente:
+>
+> 
+>
+> Secondo questo programma, per ognuno degli $N$ palloni che Tip-Tap deve sistemare, il protagonista
+> controlla se il prossimo pallone è da calcio o gonfio. Se sì lo tiene, altrimenti lo butta.
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/sol.png b/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/sol.png
new file mode 100644
index 0000000..7437e69
Binary files /dev/null and b/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/sol.png differ
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/testcases.py b/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/testcases.py
new file mode 100644
index 0000000..48ed0d0
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/testcases.py
@@ -0,0 +1,12 @@
+import random
+import json
+random.seed(0)
+testcases = []
+type = [False, True, False]
+N = [8, 20, 50]
+for t,n in zip(type,N):
+ opt = [1,2] if t else [0,1,2,3]
+ balls = opt + random.choices(opt, k=n-len(opt))
+ random.shuffle(balls)
+ testcases.append({"balls": balls, "placement": [0 for _ in range(n)], "pos": 0, "trashed" : 0, "deposited" : 0, "N": n})
+print(json.dumps(list(testcases)))
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/visualizer.jsx b/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/visualizer.jsx
new file mode 100644
index 0000000..23ced48
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/visualizer.jsx
@@ -0,0 +1,58 @@
+import React from "react";
+import { range } from "lodash-es";
+
+import { Canvas, Sprite, Variables } from "~/utils/visualizer";
+
+import bunny from "./asy/bunny.asy?w=66";
+import shelf from "./asy/shelf.asy?h=170";
+import trash from "./asy/trash.asy?w=120";
+
+const balls = import.meta.glob("./asy/ball*.asy", {
+ eager: true,
+ import: "default",
+ query: { w: 40 },
+});
+
+export default function Visualizer({ variables }) {
+ const { blocklyVariables, hiddenState } = variables;
+ if (!hiddenState) return;
+
+ function position(i) {
+ const batch = hiddenState.N > 20 ? 9 : 4;
+ const step = hiddenState.N > 20 ? 0.2 : 0.4;
+ let p = [0, 3];
+ if (i >= hiddenState.pos) {
+ p = [0.35 * (i - hiddenState.pos) + 2.4, 1.4];
+ } else if (hiddenState.placement[i] > 0) {
+ const col = (hiddenState.placement[i] - 1) % batch;
+ const row = (hiddenState.placement[i] - 1 - col) / batch;
+ p = [col * step + 0.08, 1.27 - row * 0.4];
+ } else {
+ const row = -hiddenState.placement[i] - 1;
+ const col = ((7 * row) % 11) - 5;
+ p = [1.6 + col * (0.04 + row * 0.001), 2.7 - row * 0.06];
+ }
+ if (hiddenState.balls[i] % 2) p[1] -= 0.14;
+ return p;
+ }
+
+ return (
+ <>
+
+
+ >
+ );
+}
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-2-gara-salto/asy/bunny.asy b/src/fibonacci-primarie/2023-seconda-fase/contest/s-2-gara-salto/asy/bunny.asy
new file mode 100644
index 0000000..6e2b799
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-2-gara-salto/asy/bunny.asy
@@ -0,0 +1,5 @@
+unitsize(1cm);
+
+access "../../../../../asy_library/pictures/bunny_polychrome.asy" as bunny;
+
+add(reflect((2, 1), (2, 0))*bunny.drawing(0.85, bunny.carol_col));
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-2-gara-salto/asy/carrot.asy b/src/fibonacci-primarie/2023-seconda-fase/contest/s-2-gara-salto/asy/carrot.asy
new file mode 100644
index 0000000..a7c7642
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-2-gara-salto/asy/carrot.asy
@@ -0,0 +1,5 @@
+unitsize(1cm);
+
+access "../../../../../asy_library/pictures/carrot.asy" as carrot;
+
+add(carrot.drawing(0.12));
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-2-gara-salto/asy/hay.asy b/src/fibonacci-primarie/2023-seconda-fase/contest/s-2-gara-salto/asy/hay.asy
new file mode 100644
index 0000000..493019a
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-2-gara-salto/asy/hay.asy
@@ -0,0 +1,5 @@
+unitsize(1cm);
+
+access "../../../../../asy_library/pictures/hay_tied.asy" as hay;
+
+add(hay.drawing());
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-2-gara-salto/customBlocks.yaml b/src/fibonacci-primarie/2023-seconda-fase/contest/s-2-gara-salto/customBlocks.yaml
new file mode 100644
index 0000000..e9b5f82
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-2-gara-salto/customBlocks.yaml
@@ -0,0 +1,85 @@
+- type: start
+ message0: inizia qui
+ nextStatement: null
+ colour: 20
+ tooltip: L'esecuzione inizia da qui
+ helpUrl: ""
+ maxInstances: 1
+ js: ""
+
+- type: N
+ message0: N
+ output: Number
+ colour: 20
+ tooltip: numero totale di palloni da sistemare
+ helpUrl: ""
+ js:
+ - hiddenState.N
+ - ORDER_MEMBER
+
+- type: altezza della pila
+ message0: altezza della pila %1
+ args0:
+ - type: input_value
+ name: LENGTH
+ value: 0
+ check: Number
+ output: Number
+ colour: 20
+ tooltip: altezza della pila i-esima
+ helpUrl: ""
+ js:
+ - |-
+ (function(i) {
+ hiddenState.pos = i - (hiddenState.pos > i-1 ? 0.5 : 1.5);
+ if (i < 1 || i > hiddenState.N)
+ exit(false, "la pila " + i + " non esiste");
+ return hiddenState.H[i-1];
+ })(%0)
+ - ORDER_FUNCTION_CALL
+
+- type: aggiungi carota alla pila
+ message0: aggiungi carota alla pila %1
+ args0:
+ - type: input_value
+ name: LENGTH
+ value: 0
+ check: Number
+ previousStatement: null
+ nextStatement: null
+ colour: 20
+ tooltip: aggiungi una carota alla pila i-esima
+ helpUrl: ""
+ js: |-
+ (function(i) {
+ hiddenState.pos = i - (hiddenState.pos > i-1 ? 0.5 : 1.5);
+ if (i < 1 || i > hiddenState.N)
+ exit(false, "la pila " + i + " non esiste");
+ hiddenState.C[i-1] += 1;
+ hiddenState.carrots[hiddenState.carrots.length] = i;
+ if (hiddenState.C[i-1] === 3)
+ exit(false, "hai messo una terza carota");
+ })(%0);
+
+- type: termina
+ message0: termina
+ previousStatement: null
+ colour: 20
+ tooltip: termina il procedimento
+ helpUrl: ""
+ js: |-
+ for (var i=0; i
+
+> Un possibile programma corretto è il seguente:
+>
+> 
+>
+> Questo programma, mette subito una carota sulla prima pila, che richiede il primo salto: il primo
+> salto è sempre maggiore degli _zero_ salti fatti prima! Il programma poi ricorda che il massimo
+> salto finora (_maxsalto_) è alto come la prima pila, ed è stato fatto nella pila $1$ (_dovesalto_).
+>
+> A questo punto, il programma itera su tutte le altre pile, dalla seconda alla fine.
+> Per ciascuna di queste, calcola quanto è grande il _salto_ che serve per arrivare all'$i$-esima pila.
+> Se questo salto è maggiore del massimo salto finora, allora va ad aggiungere una carota e lo
+> memorizza in _maxsalto_ e _dovesalto_.
+>
+> Una volta terminato di scorrere tutte le pile, Carol torna all'ultima pila a cui ha aggiunto una
+> carota (_dovesalto_) e ci aggiunge la seconda carota.
\ No newline at end of file
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-2-gara-salto/sol.png b/src/fibonacci-primarie/2023-seconda-fase/contest/s-2-gara-salto/sol.png
new file mode 100644
index 0000000..cffedea
Binary files /dev/null and b/src/fibonacci-primarie/2023-seconda-fase/contest/s-2-gara-salto/sol.png differ
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-2-gara-salto/testcases.py b/src/fibonacci-primarie/2023-seconda-fase/contest/s-2-gara-salto/testcases.py
new file mode 100644
index 0000000..401cb0e
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-2-gara-salto/testcases.py
@@ -0,0 +1,34 @@
+import random
+import json
+random.seed(0)
+testcases = []
+type = [1, 2, 3]
+N = [6, 20, 50]
+for t,n in zip(type,N):
+ if t == 1:
+ H = random.sample(range(1,8), n-1)
+ H.sort()
+ H.append(8)
+ else:
+ H = [random.randint(1,10) for _ in range(n)]
+ H[0] = 1
+ for i in range(1,n):
+ if H[i]-H[i-1] > i*10//n + 1:
+ H[i] = H[i-1] + i*10//n + 1
+ if t < 3:
+ d = max(H[i]-H[i-1] for i in range(1,n-1))
+ if H[-1]-H[-2] <= d:
+ H[-1] = H[-2] + d+1
+ C = [0 for _ in range(n)]
+ sol = list(C)
+ dbest = H[0]
+ ibest = 0
+ sol[0] += 1
+ for i in range(1,n):
+ if H[i] - H[i-1] > dbest:
+ sol[i] += 1
+ dbest = H[i] - H[i-1]
+ ibest = i
+ sol[ibest] += 1
+ testcases.append({"N": n, "H": H, "C": C, "sol": sol, "carrots": [], "pos": -1})
+print(json.dumps(list(testcases)))
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-2-gara-salto/visualizer.jsx b/src/fibonacci-primarie/2023-seconda-fase/contest/s-2-gara-salto/visualizer.jsx
new file mode 100644
index 0000000..d54739a
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-2-gara-salto/visualizer.jsx
@@ -0,0 +1,38 @@
+import React from "react";
+import { range } from "lodash-es";
+
+import { Canvas, Sprite, Variables } from "~/utils/visualizer";
+
+import bunny from "./asy/bunny.asy?w=40";
+import carrot from "./asy/carrot.asy?w=25";
+import hay from "./asy/hay.asy?w=60";
+
+export default function Visualizer({ variables }) {
+ const { blocklyVariables, hiddenState } = variables;
+ if (!hiddenState) return;
+
+ return (
+ <>
+
+
+ >
+ );
+}
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-3-squadre-basket/asy/ball.asy b/src/fibonacci-primarie/2023-seconda-fase/contest/s-3-squadre-basket/asy/ball.asy
new file mode 100644
index 0000000..c450cfd
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-3-squadre-basket/asy/ball.asy
@@ -0,0 +1,5 @@
+access "../../../../../asy_library/pictures/basket_ball.asy" as basket_ball;
+
+unitsize(1cm);
+
+add(basket_ball.drawing());
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-3-squadre-basket/asy/bunny.asy b/src/fibonacci-primarie/2023-seconda-fase/contest/s-3-squadre-basket/asy/bunny.asy
new file mode 100644
index 0000000..f8f6fe5
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-3-squadre-basket/asy/bunny.asy
@@ -0,0 +1,5 @@
+unitsize(1cm);
+
+access "../../../../../asy_library/pictures/bunny_polychrome.asy" as bunny;
+
+add(reflect((2, 1), (2, 0))*bunny.drawing(0.85, bunny.bunny_col));
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-3-squadre-basket/asy/fibonacci.asy b/src/fibonacci-primarie/2023-seconda-fase/contest/s-3-squadre-basket/asy/fibonacci.asy
new file mode 100644
index 0000000..9ce1a84
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-3-squadre-basket/asy/fibonacci.asy
@@ -0,0 +1,5 @@
+unitsize(1cm);
+
+access "../../../../../asy_library/pictures/bunny_monochrome.asy" as bunny;
+
+add(bunny.drawing(0.85, bunny.fibonacci_col, mediumred, scale(2)*"\texttt{F}", black));
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-3-squadre-basket/asy/fig.asy b/src/fibonacci-primarie/2023-seconda-fase/contest/s-3-squadre-basket/asy/fig.asy
new file mode 100644
index 0000000..ccdccf2
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-3-squadre-basket/asy/fig.asy
@@ -0,0 +1,28 @@
+unitsize(1cm);
+
+access "../../../../../asy_library/pictures/bunny_monochrome.asy" as bunny;
+access "../../../../../asy_library/structures/layout.asy" as layout;
+
+unravel layout; // per evitare di scrivere layout.cose tutto il tempo
+
+ALIGN = (0.5, 0);
+
+element player(real height, string name) {
+ pen[] cols = {bunny.turing_col, heavyblue, white};
+ if (name == "F") cols = new pen[]{bunny.fibonacci_col, mediumred, black};
+ return e(yscale(height)*bunny.drawing(0.8, cols[0], cols[1], scale(1.6)*("\texttt{" + name + "}"), cols[2]));
+}
+
+element team(string name ... real[] heights) {
+ element[] els;
+ for (int i=0; i hiddenState.sol)
+ exit(false, "problema di correzione");
+ exit(true, "hai scelto bene le squadre, complimenti!");
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-3-squadre-basket/initialBlocks.json b/src/fibonacci-primarie/2023-seconda-fase/contest/s-3-squadre-basket/initialBlocks.json
new file mode 100644
index 0000000..64bd836
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-3-squadre-basket/initialBlocks.json
@@ -0,0 +1,14 @@
+{
+ "blocks": {
+ "languageVersion": 0,
+ "blocks": [
+ {
+ "type": "start",
+ "id": "y=zq)Uya2A/{vyOtN[i6",
+ "x": 61,
+ "y": 81
+ }
+ ]
+ },
+ "variables": []
+}
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-3-squadre-basket/question.mdx b/src/fibonacci-primarie/2023-seconda-fase/contest/s-3-squadre-basket/question.mdx
new file mode 100644
index 0000000..4bdc8ab
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-3-squadre-basket/question.mdx
@@ -0,0 +1,40 @@
+import initialBlocks from "./initialBlocks.json";
+import customBlocks from "./customBlocks.yaml";
+import testcases from "./testcases.py";
+import Visualizer from "./visualizer.jsx";
+
+Bunny deve selezionare due squadre di basket da **più giocatori possibile** per la sfida tra la fattoria Fibonacci e la fattoria Turing!
+Per fare una partita bilanciata, vuole che le due squadre siano composte da uno stesso numero di giocatori della stessa altezza, come in questo caso:
+
+
+
+Bunny ha quindi messo in fila, in ordine crescente di altezza, i conigli di entrambe le fattorie.
+Ora può fare queste operazioni:
+- `fine della fila Fibonacci`: condizione vera se la fila della fattoria Fibonacci è terminata.
+- `fine della fila Turing`: condizione vera se la fila della fattoria Turing è terminata.
+- `altezza primo della fila Fibonacci`: l'altezza del primo coniglio nella fila della fattoria Fibonacci.
+- `altezza primo della fila Turing`: l'altezza del primo coniglio nella fila della fattoria Turing.
+- `prendi dalla fila Fibonacci`: prendi il prossimo coniglio dalla fila della fattoria Fibonacci.
+- `prendi dalla fila Turing`: prendi il prossimo coniglio dalla fila della fattoria Turing.
+- `scarta dalla fila Fibonacci`: scarta il prossimo coniglio dalla fila della fattoria Fibonacci.
+- `scarta dalla fila Turing`: scarta il prossimo coniglio dalla fila della fattoria Turing.
+- `termina`: completa le squadre e inizia la partita a basket.
+
+Aiuta Bunny a fare le squadre per la partita!
+
+
+
+> Un possibile programma corretto è il seguente:
+>
+> 
+>
+> Questo programma procede a selezionare i conigli fino a che una delle due file non si svuota.
+> Se i due primi della fila hanno la stessa altezza, è possibile prenderli entrambi per
+> ingrandire la squadra. Se non hanno la stessa altezza Bunny scarta il più basso dei due,
+> visto che non ha più speranze di trovare un avversario della stessa altezza nell'altra fila.
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-3-squadre-basket/sol.png b/src/fibonacci-primarie/2023-seconda-fase/contest/s-3-squadre-basket/sol.png
new file mode 100644
index 0000000..da1fe31
Binary files /dev/null and b/src/fibonacci-primarie/2023-seconda-fase/contest/s-3-squadre-basket/sol.png differ
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-3-squadre-basket/testcases.py b/src/fibonacci-primarie/2023-seconda-fase/contest/s-3-squadre-basket/testcases.py
new file mode 100644
index 0000000..261a2e9
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-3-squadre-basket/testcases.py
@@ -0,0 +1,28 @@
+import random
+import json
+random.seed(0)
+testcases = []
+type = [1, 2, 3]
+N = [10, 20, 60]
+for t,n in zip(type,N):
+ heights = range(20, 41, 3 if t == 1 else 1)
+ data = []
+ for _ in range(2):
+ num = random.randint(n*2//3, n)
+ H = random.sample(heights, num) if t == 2 else random.choices(heights, k=num)
+ H.sort()
+ data.append({"H": H, "pos": 0, "presi": [], "scartati": [], "scelta": []})
+ i = 0
+ j = 0
+ sol = 0
+ while i < len(data[0]["H"]) and j < len(data[1]["H"]):
+ if data[0]["H"][i] < data[1]["H"][j]:
+ i += 1
+ elif data[0]["H"][i] > data[1]["H"][j]:
+ j += 1
+ else:
+ sol += 1
+ i += 1
+ j += 1
+ testcases.append({"data": data, "sol": sol})
+print(json.dumps(list(testcases)))
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-3-squadre-basket/visualizer.jsx b/src/fibonacci-primarie/2023-seconda-fase/contest/s-3-squadre-basket/visualizer.jsx
new file mode 100644
index 0000000..49b11e8
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-3-squadre-basket/visualizer.jsx
@@ -0,0 +1,49 @@
+import React from "react";
+import { range } from "lodash-es";
+
+import { Canvas, Sprite, Variables } from "~/utils/visualizer";
+
+import bunny from "./asy/bunny.asy?w=66";
+import ball from "./asy/ball.asy?w=35";
+import fibonacci from "./asy/fibonacci.asy?h=100";
+import turing from "./asy/turing.asy?h=100";
+
+export default function Visualizer({ variables }) {
+ const { blocklyVariables, hiddenState } = variables;
+ if (!hiddenState) return;
+
+ const teams = [fibonacci, turing];
+
+ return (
+ <>
+
+
+ >
+ );
+}
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/asy/bunny_left.asy b/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/asy/bunny_left.asy
new file mode 100644
index 0000000..d1cb8b2
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/asy/bunny_left.asy
@@ -0,0 +1,5 @@
+unitsize(1cm);
+
+access "../../../../../asy_library/pictures/bunny_polychrome.asy" as bunny;
+
+add(bunny.drawing(0.85, bunny.tiptap_col));
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/asy/bunny_right.asy b/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/asy/bunny_right.asy
new file mode 100644
index 0000000..9d0a185
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/asy/bunny_right.asy
@@ -0,0 +1,5 @@
+unitsize(1cm);
+
+access "../../../../../asy_library/pictures/bunny_polychrome.asy" as bunny;
+
+add(reflect((2, 1), (2, 0))*bunny.drawing(0.85, bunny.tiptap_col));
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/asy/stairs1.asy b/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/asy/stairs1.asy
new file mode 100644
index 0000000..2bb2b9b
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/asy/stairs1.asy
@@ -0,0 +1,5 @@
+unitsize(1cm);
+
+access "../../../../../asy_library/pictures/stairs.asy" as stairs;
+
+add(stairs.drawing(0.85, 5));
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/asy/stairs2.asy b/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/asy/stairs2.asy
new file mode 100644
index 0000000..47713c0
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/asy/stairs2.asy
@@ -0,0 +1,5 @@
+unitsize(1cm);
+
+access "../../../../../asy_library/pictures/stairs.asy" as stairs;
+
+add(stairs.drawing(0.85, 33));
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/asy/stairs3.asy b/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/asy/stairs3.asy
new file mode 100644
index 0000000..2f9f0e0
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/asy/stairs3.asy
@@ -0,0 +1,5 @@
+unitsize(1cm);
+
+access "../../../../../asy_library/pictures/stairs.asy" as stairs;
+
+add(stairs.drawing(0.85, 161));
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/customBlocks.yaml b/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/customBlocks.yaml
new file mode 100644
index 0000000..91a240a
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/customBlocks.yaml
@@ -0,0 +1,123 @@
+- type: start
+ message0: inizia qui
+ nextStatement: null
+ colour: 20
+ tooltip: L'esecuzione inizia da qui
+ helpUrl: ""
+ maxInstances: 1
+ js: ""
+
+- type: S
+ message0: S
+ output: Number
+ colour: 20
+ tooltip: altezza della colonna di sinistra da costruire
+ helpUrl: ""
+ js:
+ - hiddenState.S
+ - ORDER_MEMBER
+
+- type: D
+ message0: D
+ output: Number
+ colour: 20
+ tooltip: altezza della colonna di destra da costruire
+ helpUrl: ""
+ js:
+ - hiddenState.D
+ - ORDER_MEMBER
+
+- type: M
+ message0: M
+ output: Number
+ colour: 20
+ tooltip: numero di blocchetti nel set da costruzioni
+ helpUrl: ""
+ js:
+ - hiddenState.M
+ - ORDER_MEMBER
+
+- type: altezza colonna destra
+ message0: altezza colonna destra
+ output: Number
+ colour: 20
+ tooltip: altezza corrente della colonna di destra
+ helpUrl: ""
+ js:
+ - hiddenState.pos[2]
+ - ORDER_MEMBER
+
+- type: altezza colonna sinistra
+ message0: altezza colonna sinistra
+ output: Number
+ colour: 20
+ tooltip: altezza corrente della colonna di sinistra
+ helpUrl: ""
+ js:
+ - hiddenState.pos[0]
+ - ORDER_MEMBER
+
+- type: impila blocchetto a destra
+ message0: impila blocchetto %1 a destra
+ args0:
+ - type: input_value
+ name: LENGTH
+ value: 0
+ check: Number
+ previousStatement: null
+ nextStatement: null
+ colour: 20
+ tooltip: impila blocchetto alto i alla colonna di destra
+ helpUrl: ""
+ js: |-
+ (function(i) {
+ hiddenState.orient = 1;
+ hiddenState.pos[1] = i;
+ if (hiddenState.blocchi[i-1][0] !== 1)
+ exit(false, "hai già usato il blocchetto " + i);
+ hiddenState.rimasti -= 1;
+ hiddenState.pos[3] = hiddenState.pos[2] + (i-4)/2;
+ hiddenState.blocchi[i-1] = [2, hiddenState.pos[2]];
+ hiddenState.pos[2] += i;
+ if (hiddenState.pos[2] > hiddenState.D)
+ exit(false, "la colonna di destra è troppo alta");
+ })(%0);
+
+- type: impila blocchetto a sinistra
+ message0: impila blocchetto %1 a sinistra
+ args0:
+ - type: input_value
+ name: LENGTH
+ value: 0
+ check: Number
+ previousStatement: null
+ nextStatement: null
+ colour: 20
+ tooltip: impila blocchetto alto i alla colonna di sinistra
+ helpUrl: ""
+ js: |-
+ (function(i) {
+ hiddenState.orient = 0;
+ hiddenState.pos[1] = i;
+ if (hiddenState.blocchi[i-1][0] !== 1)
+ exit(false, "hai già usato il blocchetto " + i);
+ hiddenState.rimasti -= 1;
+ hiddenState.pos[3] = hiddenState.pos[0] + (i-4)/2;
+ hiddenState.blocchi[i-1] = [0, hiddenState.pos[0]];
+ hiddenState.pos[0] += i;
+ if (hiddenState.pos[0] > hiddenState.S)
+ exit(false, "la colonna di sinistra è troppo alta");
+ })(%0);
+
+- type: termina
+ message0: termina
+ previousStatement: null
+ colour: 20
+ tooltip: termina il procedimento
+ helpUrl: ""
+ js: |-
+ if (hiddenState.pos[0] < hiddenState.S)
+ exit(false, "la colonna di sinistra è troppo bassa");
+ if (hiddenState.pos[2] < hiddenState.D)
+ exit(false, "la colonna di destra è troppo bassa");
+ exit(true, "hai costruito bene le colonne, complimenti!");
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/initialBlocks.json b/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/initialBlocks.json
new file mode 100644
index 0000000..64bd836
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/initialBlocks.json
@@ -0,0 +1,14 @@
+{
+ "blocks": {
+ "languageVersion": 0,
+ "blocks": [
+ {
+ "type": "start",
+ "id": "y=zq)Uya2A/{vyOtN[i6",
+ "x": 61,
+ "y": 81
+ }
+ ]
+ },
+ "variables": []
+}
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/question.mdx b/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/question.mdx
new file mode 100644
index 0000000..ec168f0
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/question.mdx
@@ -0,0 +1,44 @@
+import initialBlocks from "./initialBlocks.json";
+import customBlocks from "./customBlocks.yaml";
+import testcases from "./testcases.py";
+import Visualizer from "./visualizer.jsx";
+
+Tip-Tap vuole costruire una nuova tettoia per la sua fattoria!
+Come prima cosa, ha bisogno di costruire le due colonne portanti:
+una a sinistra alta $S$ centimetri, e una a destra alta $D$ centimetri.
+
+Per farlo intende impilare alcuni blocchetti presi da un set da costruzioni,
+composto da un singolo blocchetto per ogni altezza possibile tra un minimo
+di 1 centimetro e un massimo di $M$ centimetri, e che in tutto arrivano
+esattamente all'altezza totale delle due colonne. Ora può fare queste operazioni:
+- `altezza colonna destra`: l'altezza corrente della colonna di destra.
+- `altezza colonna sinistra`: l'altezza corrente della colonna di sinistra.
+- `impila blocchetto i a destra`: aggiunge il blocchetto alto $i$ centimetri alla colonna di destra, se non l'ha già usato.
+- `impila blocchetto i a sinistra`: aggiunge il blocchetto alto $i$ centimetri alla colonna di sinistra, se non l'ha già usato.
+- `termina`: completa le colonne e costruisci la tettoia.
+
+Aiuta Tip-Tap a completare la tettoia come previsto!
+
+
+
+> Un possibile programma corretto è il seguente:
+>
+> 
+>
+> Questo programma procede a selezionare i blocchetti dal più grande al più piccolo.
+> Per ogni blocchetto, prova prima se può metterlo nella colonna a sinistra.
+> Se non può, prova anche a destra prima di scartarlo definitivamente.
+>
+> **Approfondimento:** Si può dimostrare che questo procedimento riesce sempre a costruire
+> le colonne. Per mostrarlo, consideriamo cosa succede quando vogliamo piazzare il
+> blocchetto alto $M$. La più alta delle due colonne deve essere alta più della metà del
+> totale, ma $M$ è al massimo la metà del totale dei blocchetti da $1$ a $M$, quindi
+> posso sicuramente farlo stare in una delle due colonne. Mettendolo, abbiamo ridotto sia l'altezza
+> totale da costruire che l'altezza totale dei blocchetti di $M$, quindi è ancora vero che
+> l'altezza totale dei blocchetti è uguale all'altezza totale delle colonne da costruire.
\ No newline at end of file
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/sol.png b/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/sol.png
new file mode 100644
index 0000000..ef7c93b
Binary files /dev/null and b/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/sol.png differ
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/testcases.py b/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/testcases.py
new file mode 100644
index 0000000..f56f516
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/testcases.py
@@ -0,0 +1,12 @@
+import random
+import json
+random.seed(0)
+testcases = []
+type = [False, True, False]
+M = [6, 14, 31]
+for t,m in zip(type,M):
+ tot = sum(range(1,m+1))
+ S = (random.randint(1, tot) + random.randint(1, tot) + random.randint(1, tot) + random.randint(1, tot))//4
+ D = tot-S
+ testcases.append({"S": S, "D": D, "M": m, "blocchi": [[1,i] for i in range(m)], "pos": [0,0,0,0], "rimasti": m, "orient": 1})
+print(json.dumps(list(testcases)))
diff --git a/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/visualizer.jsx b/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/visualizer.jsx
new file mode 100644
index 0000000..5addc45
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/visualizer.jsx
@@ -0,0 +1,88 @@
+import React from "react";
+import { range } from "lodash-es";
+
+import { Canvas, Rectangle, Sprite, Variables } from "~/utils/visualizer";
+
+import bunny_left from "./asy/bunny_left.asy?w=66";
+import bunny_right from "./asy/bunny_right.asy?w=66";
+import stairs1 from "./asy/stairs1.asy?w=80";
+import stairs2 from "./asy/stairs2.asy?w=80";
+import stairs3 from "./asy/stairs3.asy?w=80";
+
+export default function Visualizer({ variables }) {
+ const { blocklyVariables, hiddenState } = variables;
+ if (!hiddenState) return;
+
+ const stairs = [stairs1, stairs2, stairs3][hiddenState.M <= 6 ? 0 : hiddenState.M <= 14 ? 1 : 2];
+ const bunnies = [bunny_left, bunny_right];
+ const hf = 2.0;
+ const wf = 3.0;
+
+ const colors = [
+ "#4093b0",
+ "#bf4eb4",
+ "#44c966",
+ "#4473c9",
+ "#c2a948",
+ "#7468c5",
+ "#9c5ebd",
+ "#7cc258",
+ "#a3b651",
+ "#40af91",
+ "#4473c9",
+ "#c2a948",
+ "#7468c5",
+ "#9c5ebd",
+ "#7cc258",
+ "#a3b651",
+ ];
+
+ let bsplit = 0;
+ for (let i = 0; i < hiddenState.pos[1]; ++i) {
+ if (hiddenState.blocchi[i][0] === 1) bsplit += 1;
+ }
+
+ let bx = 3 - bsplit * (wf + 1);
+ return (
+ <>
+
+
+ >
+ );
+}
diff --git a/src/fibonacci-primarie/2023-seconda-fase/index.jsx b/src/fibonacci-primarie/2023-seconda-fase/index.jsx
new file mode 100644
index 0000000..3e6a73e
--- /dev/null
+++ b/src/fibonacci-primarie/2023-seconda-fase/index.jsx
@@ -0,0 +1,16 @@
+import { OlinfoAuth } from "~/utils/olinfo-auth";
+
+import Header from "./contest/header.md";
+import Statement from "./contest/contest.mdx";
+
+export const title = "Giochi di Fibonacci 2023/2024 - Fase II - Scuole primarie";
+export const description = "Seconda fase dei Giochi di Fibonacci 2023/2024 per le scuole primarie";
+
+export function App() {
+ return (
+
+
+
+
+ );
+}
diff --git a/src/fibonacci-secondarie/2023-seconda-fase/contest/contest.mdx b/src/fibonacci-secondarie/2023-seconda-fase/contest/contest.mdx
new file mode 100644
index 0000000..50c6d12
--- /dev/null
+++ b/src/fibonacci-secondarie/2023-seconda-fase/contest/contest.mdx
@@ -0,0 +1,28 @@
+import { P1CicliCondizioni } from "problemset";
+import { P2BalleDiFieno } from "problemset";
+import { P3PileDiCarote } from "problemset";
+import { P4Contatore } from "problemset";
+import { S1OrdinaPalloni } from "problemset";
+import { S2GaraSalto } from "problemset";
+import { S3SquadreBasket } from "problemset";
+import { S4TorriGemelle } from "problemset";
+
+
+
+## Sezione 1: procedimenti procedurali
+
+
+
+## Sezione 2: programmazione
+
+
+
+
diff --git a/src/fibonacci-secondarie/2023-seconda-fase/contest/header.md b/src/fibonacci-secondarie/2023-seconda-fase/contest/header.md
new file mode 100644
index 0000000..0847a2f
--- /dev/null
+++ b/src/fibonacci-secondarie/2023-seconda-fase/contest/header.md
@@ -0,0 +1,24 @@
+Questa prova contiene _6 domande_ da risolvere in _100 minuti_.
+Le domande sono a **scelta multipla** o a **blocchi**, e sono divise in due parti:
+
+- domande di interpretazione di **procedimenti procedurali** come programmi a blocchi, e
+- domande di **programmazione** tramite blocchi.
+
+In entrambe le parti, le domande sono ordinate per difficoltà crescente.
+**Attento che la difficoltà è soggettiva!** Se stai passando tanto tempo cercando di risolvere una domanda, prova a passare ad altre domande e altre categorie!
+
+## Punteggio
+
+Tutte le domande a _scelta multipla_ hanno 5 opzioni, di cui **solo una** è corretta. Il punteggio che puoi ottenere è:
+
+- 5 punti per una risposta _corretta_;
+- 1 punto per una risposta _non data_;
+- 0 punti per una risposta _sbagliata_.
+
+Le domande a _blocchi_ richiedono di scrivere un singolo programma a blocchi, che viene valutato su tre diversi livelli.
+Per ciascuna domanda e per ciascun livello, Il punteggio che puoi ottenere è:
+
+- 5 punti se il programma produce la risposta _corretta_;
+- 0 punti se il programma produce una risposta _sbagliata_.
+
+Quindi ogni domanda a blocchi può valere fino a 15 punti in totale.
diff --git a/src/fibonacci-secondarie/2023-seconda-fase/contest/p-1-cicli-condizioni b/src/fibonacci-secondarie/2023-seconda-fase/contest/p-1-cicli-condizioni
new file mode 120000
index 0000000..f8e27e5
--- /dev/null
+++ b/src/fibonacci-secondarie/2023-seconda-fase/contest/p-1-cicli-condizioni
@@ -0,0 +1 @@
+../../../fibonacci-primarie/2023-seconda-fase/contest/p-1-cicli-condizioni/
\ No newline at end of file
diff --git a/src/fibonacci-secondarie/2023-seconda-fase/contest/p-2-balle-di-fieno b/src/fibonacci-secondarie/2023-seconda-fase/contest/p-2-balle-di-fieno
new file mode 120000
index 0000000..2a03740
--- /dev/null
+++ b/src/fibonacci-secondarie/2023-seconda-fase/contest/p-2-balle-di-fieno
@@ -0,0 +1 @@
+../../../fibonacci-primarie/2023-seconda-fase/contest/p-2-balle-di-fieno/
\ No newline at end of file
diff --git a/src/fibonacci-secondarie/2023-seconda-fase/contest/p-3-pile-di-carote b/src/fibonacci-secondarie/2023-seconda-fase/contest/p-3-pile-di-carote
new file mode 120000
index 0000000..a449a4a
--- /dev/null
+++ b/src/fibonacci-secondarie/2023-seconda-fase/contest/p-3-pile-di-carote
@@ -0,0 +1 @@
+../../../fibonacci-primarie/2023-seconda-fase/contest/p-3-pile-di-carote/
\ No newline at end of file
diff --git a/src/fibonacci-secondarie/2023-seconda-fase/contest/p-4-contatore b/src/fibonacci-secondarie/2023-seconda-fase/contest/p-4-contatore
new file mode 120000
index 0000000..e34d731
--- /dev/null
+++ b/src/fibonacci-secondarie/2023-seconda-fase/contest/p-4-contatore
@@ -0,0 +1 @@
+../../../fibonacci-primarie/2023-seconda-fase/contest/p-4-contatore/
\ No newline at end of file
diff --git a/src/fibonacci-secondarie/2023-seconda-fase/contest/s-1-ordina-palloni b/src/fibonacci-secondarie/2023-seconda-fase/contest/s-1-ordina-palloni
new file mode 120000
index 0000000..c71e296
--- /dev/null
+++ b/src/fibonacci-secondarie/2023-seconda-fase/contest/s-1-ordina-palloni
@@ -0,0 +1 @@
+../../../fibonacci-primarie/2023-seconda-fase/contest/s-1-ordina-palloni/
\ No newline at end of file
diff --git a/src/fibonacci-secondarie/2023-seconda-fase/contest/s-2-gara-salto b/src/fibonacci-secondarie/2023-seconda-fase/contest/s-2-gara-salto
new file mode 120000
index 0000000..ae23f59
--- /dev/null
+++ b/src/fibonacci-secondarie/2023-seconda-fase/contest/s-2-gara-salto
@@ -0,0 +1 @@
+../../../fibonacci-primarie/2023-seconda-fase/contest/s-2-gara-salto/
\ No newline at end of file
diff --git a/src/fibonacci-secondarie/2023-seconda-fase/contest/s-3-squadre-basket b/src/fibonacci-secondarie/2023-seconda-fase/contest/s-3-squadre-basket
new file mode 120000
index 0000000..2d40899
--- /dev/null
+++ b/src/fibonacci-secondarie/2023-seconda-fase/contest/s-3-squadre-basket
@@ -0,0 +1 @@
+../../../fibonacci-primarie/2023-seconda-fase/contest/s-3-squadre-basket/
\ No newline at end of file
diff --git a/src/fibonacci-secondarie/2023-seconda-fase/contest/s-4-torri-gemelle b/src/fibonacci-secondarie/2023-seconda-fase/contest/s-4-torri-gemelle
new file mode 120000
index 0000000..fdb5268
--- /dev/null
+++ b/src/fibonacci-secondarie/2023-seconda-fase/contest/s-4-torri-gemelle
@@ -0,0 +1 @@
+../../../fibonacci-primarie/2023-seconda-fase/contest/s-4-torri-gemelle/
\ No newline at end of file
diff --git a/src/fibonacci-secondarie/2023-seconda-fase/index.jsx b/src/fibonacci-secondarie/2023-seconda-fase/index.jsx
new file mode 100644
index 0000000..7e3eeb0
--- /dev/null
+++ b/src/fibonacci-secondarie/2023-seconda-fase/index.jsx
@@ -0,0 +1,16 @@
+import { OlinfoAuth } from "~/utils/olinfo-auth";
+
+import Header from "./contest/header.md";
+import Statement from "./contest/contest.mdx";
+
+export const title = "Giochi di Fibonacci 2023/2024 - Fase II - Scuole secondarie";
+export const description = "Seconda fase dei Giochi di Fibonacci 2023/2024 per le scuole secondarie";
+
+export function App() {
+ return (
+
+
+
+
+ );
+}