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: + +![code](code.asy) + +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: + +![code](code.asy) + +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: +> +> ![soluzione](sol.png) +> +> 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 ( + <> + + + {range(hiddenState.N).map((i) => ( + + ))} + + + + + + ); +} 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: +> +> ![soluzione](sol.png) +> +> 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 ( + <> + + {range(hiddenState.N).flatMap((i) => { + return range(hiddenState.H[i]).map((h) => ( + + )); + })} + + + {range(hiddenState.carrots.length + 2).map((i) => { + let x = 5 + hiddenState.pos * 6; + let y = -0.1; + if (i < hiddenState.carrots.length) { + const col = hiddenState.carrots[i] - 1; + x = 3.5 + col * 6 + (i % 3) * 0.5; + y = -0.3 + hiddenState.H[col] * 2.8; + } + 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: + +![esempio](asy/fig.asy) + +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: +> +> ![soluzione](sol.png) +> +> 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 ( + <> + + + + {range(2).flatMap((i) => { + const len = hiddenState.data[i].H.length; + return range(i * (len - 1), (len + 1) * (1 - i) - 1, 1 - 2 * i).map((k) => { + const h = hiddenState.data[i].H[k] / 28; + let x = 26 + (k - hiddenState.data[i].pos) * 5; + let y = 30 - 23 * i + (h - 1) * 5; + if (k < hiddenState.data[i].pos) { + if (hiddenState.data[i].scelta[k] > 0) { + x = 14 + (hiddenState.data[i].scelta[k] - hiddenState.data[i].presi.length) * 5; + } else { + x = 21 - hiddenState.data[i].scelta[k] * 3; + y += 10 * (1 - 2 * i); + } + } + 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: +> +> ![soluzione](sol.png) +> +> 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 ( + <> + + + + + + + {range(hiddenState.M).map((i) => { + let x = hiddenState.blocchi[i][0] * 8 + 7.5; + let y = hiddenState.blocchi[i][1] * hf; + if (hiddenState.blocchi[i][0] === 1) { + if (i >= hiddenState.pos[1] && bx < 23) bx = 23.5; + bx += wf + 1; + x = bx; + y = hiddenState.pos[3] * hf + 0.5; + } + 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 ( + +
+ + + ); +}