Track
/
Lean
Lean
/
Esercizi
/
Cifrario a recinzione
Cifrario a recinzione

Cifrario a recinzione

Medio

Istruzioni

Implementa la codifica e la decodifica del cifrario rail fence.

Il cifrario Rail Fence è una forma di cifrario a trasposizione che prende il nome dal modo in cui viene codificato. Era già usato dagli antichi Greci.

Nel cifrario Rail Fence, il messaggio viene scritto verso il basso su «rails» successivi di una recinzione immaginaria, poi risalendo quando si arriva in fondo (come uno zig-zag). Infine il messaggio viene letto riga per riga.

Per esempio, usando tre «rails» e il messaggio «WE ARE DISCOVERED FLEE AT ONCE», chi cifra scrive:

W . . . E . . . C . . . R . . . L . . . T . . . E
. E . R . D . S . O . E . E . F . E . A . O . C .
. . A . . . I . . . V . . . D . . . E . . . N . .

Poi legge:

WECRLTEERDSOEEFEAOCAIVDEN

Per decifrare un messaggio, si prende la forma a zig-zag e si riempiono le righe con il testo cifrato.

? . . . ? . . . ? . . . ? . . . ? . . . ? . . . ?
. ? . ? . ? . ? . ? . ? . ? . ? . ? . ? . ? . ? .
. . ? . . . ? . . . ? . . . ? . . . ? . . . ? . .

La prima riga ha sette posizioni che possono essere riempite con «WECRLTE».

W . . . E . . . C . . . R . . . L . . . T . . . E
. ? . ? . ? . ? . ? . ? . ? . ? . ? . ? . ? . ? .
. . ? . . . ? . . . ? . . . ? . . . ? . . . ? . .

Ora la seconda riga prende «ERDSOEEFEAOC».

W . . . E . . . C . . . R . . . L . . . T . . . E
. E . R . D . S . O . E . E . F . E . A . O . C .
. . ? . . . ? . . . ? . . . ? . . . ? . . . ? . .

Lasciando «AIVDEN» per l'ultima riga.

W . . . E . . . C . . . R . . . L . . . T . . . E
. E . R . D . S . O . E . E . F . E . A . O . C .
. . A . . . I . . . V . . . D . . . E . . . N . .

Se ora leggi lungo la forma a zig-zag, puoi leggere il messaggio originale.

Subtypes

Questo esercizio definisce un Subtype chiamato Positive, per tutti i numeri naturali maggiori di 0. Un Subtype si può pensare come una coppia ⟨x, h⟩, dove x è il valore e h è la dimostrazione della sua validità.

Si può accedere al valore contenuto in un Subtype (x, in questo caso) usando .val, per esempio x.val. Alla sua dimostrazione si può accedere usando .property, per esempio x.property. Ad entrambi si può accedere anche tramite il pattern matching, come al solito.

Per costruire un valore per un Subtype, è necessario dimostrarne la validità, in questo caso che il numero sia maggiore di 0.

In Lean ci sono diversi lemmi e teoremi che possono servire come punto di partenza per questa dimostrazione. Per esempio, Nat.zero_lt_succ è un lemma che afferma che per ogni numero naturale n: 0 < n + 1.

Advanced

Un buon riferimento per la dimostrazione di teoremi in Lean si trova in la documentazione principale.


Fonte

WikipediaIl link si apre in una nuova finestra o scheda
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Lean Exercism

Vuoi iniziare Cifrario a recinzione?

Iscriviti a Exercism per imparare e padroneggiare Lean con 100 esercizi e il mentoring di persone reali, tutto gratis.