# Aggiunto Java!

**URL:** <https://forum.olinfo.it/t/aggiunto-java/7996>\
**Category:** Meta\
**Created:** [18 Gennaio 2023, 10:51am UTC](https://forum.olinfo.it/t/aggiunto-java/7996 "2023-01-18T10:51:01Z")\
**Posts on this page:** 15\
**Page:** 1

<div class="post-metadata">

**Author:** ![dp\_1](https://forum.olinfo.it/user_avatar/forum.olinfo.it/dp_1/32/2635_2.png) [@dp\_1](https://forum.olinfo.it/u/dp_1)\
**Post date:** [18 Gennaio 2023, 10:51am UTC](https://forum.olinfo.it/t/aggiunto-java/7996/1 "2023-01-18T10:51:01Z")

</div>

Ciao!

Alcuni di voi potrebbero aver notato delle piccole modifiche alla piattaforma di allenamento negli ultimi giorni, e in particolare un nuovo indicatore che elenca i linguaggi di programmazione permessi in ogni problema. Questo era per arrivare a supportare anche Java, cosa che da oggi è completa.

Non tutti i problemi lo supportano: se un task utilizza i grader, i linguaggi supportati rimangono gli stessi di prima (C++ per la maggior parte dei problemi, e in alcuni casi anche C/Pascal). Tutti gli altri task, e in particolare quelli delle olimpiadi a squadre, possono ora essere risolti anche in Java.

Se deciderete di provare a risolvere un problema in Java, dovrete chiamare la classe che contiene il vostro codice come il nome breve del problema. Ad esempio, per risolvere [easy1 (Trova il massimo)](https://training.olinfo.it/#/task/easy1/statement), dovrete fare qualcosa del genere:

```java
public class easy1 {
    public static void main(String args[]) {
        // codice complicatissimo
   }
}

```

Trovate il nome breve del problema come parte dell’URL, e in ogni caso avrete un suggerimento col nome corretto da usare quando selezionate il linguaggio:

 ![Screenshot from 2023-01-18 11-43-58](https://forum.olinfo.it/uploads/default/original/2X/a/ab0b37ac46febdd6adbb5b760151c228c1092fdb.png)

Per qualsiasi domanda rispondete pure in questo thread!

---

<div class="post-metadata">

**Author:** ![FLAK\_ZOSO](https://forum.olinfo.it/user_avatar/forum.olinfo.it/flak_zoso/32/1491_2.png) [@FLAK\_ZOSO](https://forum.olinfo.it/u/FLAK_ZOSO)\
**Post date:** [19 Gennaio 2023, 9:42pm UTC](https://forum.olinfo.it/t/aggiunto-java/7996/2 "2023-01-19T21:42:00Z")

</div>

Attenzione: nel tempo nel quale un comune mortale digita…

```java
public class solution {
    public static void main(String args[]) {

    }
}

```

…è probabile che Lugli abbia già fullato il round.

* * *

Essendo il masochismo un’opzione, è consigliabile ricorrere ad un coltello da cucina, anche perché quelli vengono venduti insieme al grader!

---

<div class="post-metadata">

**Author:** ![dp\_1](https://forum.olinfo.it/user_avatar/forum.olinfo.it/dp_1/32/2635_2.png) [@dp\_1](https://forum.olinfo.it/u/dp_1)\
**Post date:** [20 Gennaio 2023, 5:52pm UTC](https://forum.olinfo.it/t/aggiunto-java/7996/3 "2023-01-20T17:52:32Z")

</div>

Piccola correzione: per alcuni dei problemi delle OIS non va incluso il prefisso `ois_` nel nome della classe. Il nome suggerito quando mandate una soluzione è quello corretto.

---

<div class="post-metadata">

**Author:** ![lupin](https://forum.olinfo.it/user_avatar/forum.olinfo.it/lupin/32/311_2.png) [@lupin](https://forum.olinfo.it/u/lupin)\
**Post date:** [20 Maggio 2023, 2:19pm UTC](https://forum.olinfo.it/t/aggiunto-java/7996/4 "2023-05-20T14:19:13Z")

</div>

Ho provato a risolvere un problema ([cabala](https://training.olinfo.it/#/task/ois_cabala/statement)) con Java. I test falliscono sempre con l’indicazione “Execution failed because the return code was nonzero”. Visto che Java non è citato nel testo (che risale al 2015) ma c’è comunque il file sorgente con lo scheletro, cosa occorre modificare per riuscire a far girare i test?

---

<div class="post-metadata">

**Author:** ![dp\_1](https://forum.olinfo.it/user_avatar/forum.olinfo.it/dp_1/32/2635_2.png) [@dp\_1](https://forum.olinfo.it/u/dp_1)\
**Post date:** [20 Maggio 2023, 3:41pm UTC](https://forum.olinfo.it/t/aggiunto-java/7996/5 "2023-05-20T15:41:20Z")

</div>

Ciao, devi leggere e scrivere da file, as esempio con :

```java
fin = new FileInputStream("input.txt");
fout = new FileOutputStream("output.txt");

```

Nei problemi più vecchi è ancora necessario

---

<div class="post-metadata">

**Author:** ![lupin](https://forum.olinfo.it/user_avatar/forum.olinfo.it/lupin/32/311_2.png) [@lupin](https://forum.olinfo.it/u/lupin)\
**Post date:** [20 Maggio 2023, 8:06pm UTC](https://forum.olinfo.it/t/aggiunto-java/7996/6 "2023-05-20T20:06:42Z")

</div>

Grazie, ha funzionato. In [cabala](https://training.olinfo.it/#/task/ois_cabala/statement) occorrerebbe anche rivedere negli allegati il tipo dei parametri passati alla funzione “occulta” da scrivere perché sono errati sia nella versione C che in quella Java (M deve essere, rispettivamente, long long e long).

---

<div class="post-metadata">

**Author:** ![dp\_1](https://forum.olinfo.it/user_avatar/forum.olinfo.it/dp_1/32/2635_2.png) [@dp\_1](https://forum.olinfo.it/u/dp_1)\
**Post date:** [21 Maggio 2023, 7:01am UTC](https://forum.olinfo.it/t/aggiunto-java/7996/7 "2023-05-21T07:01:43Z")

</div>

Leggo 2 \leq M \leq 10^9, che sta in un int. Sbaglio qualcosa?

---

<div class="post-metadata">

**Author:** ![fabriziogiacomi](https://forum.olinfo.it/user_avatar/forum.olinfo.it/fabriziogiacomi/32/2523_2.png) [@fabriziogiacomi](https://forum.olinfo.it/u/fabriziogiacomi)\
**Post date:** [21 Maggio 2023, 4:23pm UTC](https://forum.olinfo.it/t/aggiunto-java/7996/8 "2023-05-21T16:23:14Z")

</div>

Non penso, anzi, secondo me la funzione `occulta` sarebbe potuta tranquillamente essere dichiarata con return type `int`, siccome deve ritornare il valore di C mod M (sapendo che M sta perfettamente in un `int`).

Comunque, per confermare la teoria (M sta in un `int` ed è \leq 10^9), ho provato a eseguire questi test:

```cpp
#include <cassert>
#include <fstream>
#include <limits>

using namespace std;

int main() {
    assert(numeric_limits<int>::max() > 1000000000); // se 10^9 fosse meno della dimensione massima di un int, questo fallirebbe
    
    ifstream fin("input.txt");
    ofstream fout("output.txt");
    
    int T;
    fin >> T;
    for (int t = 0; t < T; t++) {
        long long N, M;
        fin >> N >> M;
        
        assert(M == (int)M); // se ci fosse integer overflow, questo fallirebbe
        assert(M <= 1000000000); // se M fosse > 10^9, questo fallirebbe
        assert(2 <= M); // se M fosse < 2, questo fallirebbe
    }
}

```

Siccome nessuno è fallito (`assert(false)` provoca “Execution killed”) allora direi che M può essere messo in un `int`.

---

<div class="post-metadata">

**Author:** ![lupin](https://forum.olinfo.it/user_avatar/forum.olinfo.it/lupin/32/311_2.png) [@lupin](https://forum.olinfo.it/u/lupin)\
**Post date:** [22 Maggio 2023, 8:54pm UTC](https://forum.olinfo.it/t/aggiunto-java/7996/9 "2023-05-22T20:54:28Z")

</div>

Sono pienamente d’accordo, ma con int sia in C che in Java il mio risultato è 30/100 e non 100/100. Sbaglierò senz’altro qualcosa…

---

<div class="post-metadata">

**Author:** ![dp\_1](https://forum.olinfo.it/user_avatar/forum.olinfo.it/dp_1/32/2635_2.png) [@dp\_1](https://forum.olinfo.it/u/dp_1)\
**Post date:** [22 Maggio 2023, 9:00pm UTC](https://forum.olinfo.it/t/aggiunto-java/7996/10 "2023-05-22T21:00:29Z")

</div>

Non conosco i dettagli del problema, ma vedo che la funzione ritorna un `long long`. Probabilmente per calcolare l’output hai bisogno di lavorare con i `long long`, anche se in input ti arriva un `int`. Ad esempio, se volessi calcolare x^2 per x \le 10^9, ti servirebbe qualcosa di questo tipo per convertire `x` in `long long` prima di usarlo:

```c
long long calcola(int x) {
    return x * 1LL * x;
}

```

O in alternativa

```c
long long calcola(int _x) {
    long long x = _x;
    return x * x;
}

```

---

<div class="post-metadata">

**Author:** ![fabriziogiacomi](https://forum.olinfo.it/user_avatar/forum.olinfo.it/fabriziogiacomi/32/2523_2.png) [@fabriziogiacomi](https://forum.olinfo.it/u/fabriziogiacomi)\
**Post date:** [22 Maggio 2023, 10:07pm UTC](https://forum.olinfo.it/t/aggiunto-java/7996/11 "2023-05-22T22:07:37Z")

</div>

Dipende dalla tua implementazione. Sicuramente, il numero C può causare integer overflow (con N \leq 18 cifre)… Però il problema richiede di trovare il valore C mod M, e siccome M è un `int`, allora anche C mod M sarà `int`.

La funzione attraverso cui risolvo il problema ritorna un `int` e il mio codice da 100/100. Anche se questi sono dettagli dell’implementazione, per risolvere il problema la funzione potrebbe essere tranquillamente dichiarata così:

```cpp
int occulta(int N, int M);

```

Queste sono le mie congetture, spero sia tutto corretto. Buona serata!

> **Pseudo-codice da 100/100 (con int)**
>
> ```auto
> funzione risolvi(cifre rimanenti, numero considerato, ultima cifra, M):
> nuovo modulo = numero considerato % M
> se cifre rimanenti == 0, ritorna nuovo modulo
> 
> per ogni cifra in [3, 6, 9]:
> se ultima cifra != cifra:
> nuovo modulo = massimo(nuovo modulo, risolvi(rimanenti - 1, partenza * 10 + cifra, cifra, M))
> 
> ritorna nuovo modulo
> 
> ```
> 
> In questo modo, la funzione ritornerà solo `int`. N.B. il `numero considerato` deve essere long long (ma si potrebbe trovare un modo per non usarlo, forse).

---

<div class="post-metadata">

**Author:** ![lupin](https://forum.olinfo.it/user_avatar/forum.olinfo.it/lupin/32/311_2.png) [@lupin](https://forum.olinfo.it/u/lupin)\
**Post date:** [24 Maggio 2023, 7:27am UTC](https://forum.olinfo.it/t/aggiunto-java/7996/12 "2023-05-24T07:27:57Z")

</div>

L’hai provata in C11/gcc? A me fornisce 30/100, cambiando in long numero\_considerato, nuovo\_modulo e valore di ritorno restituisce 100/100.  
Il perché mi è assolutamente oscuro, dato che concordo con te sulla sufficienza degli int.

---

<div class="post-metadata">

**Author:** ![fve5](https://forum.olinfo.it/user_avatar/forum.olinfo.it/fve5/32/3229_2.png) [@fve5](https://forum.olinfo.it/u/fve5)\
**Post date:** [24 Maggio 2023, 10:30am UTC](https://forum.olinfo.it/t/aggiunto-java/7996/13 "2023-05-24T10:30:56Z")

</div>

Senza vedere il codice è molto difficile capire cosa sta succedendo. Se provi a mandarlo si può capire meglio.

---

<div class="post-metadata">

**Author:** ![fabriziogiacomi](https://forum.olinfo.it/user_avatar/forum.olinfo.it/fabriziogiacomi/32/2523_2.png) [@fabriziogiacomi](https://forum.olinfo.it/u/fabriziogiacomi)\
**Post date:** [24 Maggio 2023, 12:29pm UTC](https://forum.olinfo.it/t/aggiunto-java/7996/14 "2023-05-24T12:29:46Z")

</div>

Certamente, `numero_considerato` può avere al più N = 18 cifre (chiaramente, quindi, non entra in un `int`). Io riesco a prendere 100/100 usando `int` sia in C che in C++ (con codice leggermente diverso per C++, ma ovviamente funzionerebbe anche quello di C).

Per capire meglio la tua situazione, potresti provare a mandare l’implementazione?

---

<div class="post-metadata">

**Author:** ![lupin](https://forum.olinfo.it/user_avatar/forum.olinfo.it/lupin/32/311_2.png) [@lupin](https://forum.olinfo.it/u/lupin)\
**Post date:** [24 Maggio 2023, 6:34pm UTC](https://forum.olinfo.it/t/aggiunto-java/7996/15 "2023-05-24T18:34:43Z")

</div>

Vero, ora me lo spiego: solo numero\_considerato non deve essere int. Analisi carente da parte mia. Grazie dell’aiuto e il supporto.
