PROG0574 - Pizzino

no tags 

Pizzino (plural: pizzini) is an Italian language word derived from Sicilian language equivalent pizzinu. Despite it generically meaning "small piece of paper", the word is now widely used to refer to small slips of paper that the Sicilian Mafia uses for high-level communications. Sicilian Mafia boss Bernardo Provenzano is among those best known for using pizzini, most notably in his instruction that Messina Denaro become his successor. The pizzini of other mafioso have significantly aided police investigations about the Sicilian Mafia.

Bernardo
      Provenzano
Bernardo Provenzano (born January 31, 1933 in Corleone, Sicily) is a member of the Sicilian Mafia (Cosa Nostra) and is suspected of having been the head of the Corleonesi, a Mafia faction that originated in the town of Corleone, and de facto capo di tutti capi (boss of bosses) of the entire Sicilian Mafia until his arrest in 2006. His nickname is Binnu u tratturi (Sicilian for "Binnie the tractor") because, in the words of one informant, "he mows people down."

Provenzano hid the pizzini containing his instructions at an old sheep farm under rocks or under the ground. The were immediately destructed after reading. Provencano's pizzini also used a code in which letters replaced by numbers indicating their position in the alphabet (A=1, B=2, …). Each of these number was than incremented by three. The numbers thus obtains for each of the letters in a word, were simply concatenated to and up with a large number. This mia might become 16124, because $$\mbox{m} = 13 + 3 = 16,\ \mbox{i} = 9 + 3 = 12 \mbox{ en a} = 1 + 3 = 4$$ Note that the alphabet used is the Italian alphabet, which has a slightly different order and number of characters than the Latin alphabet:

ABCDEFGHILMNOPQRSTUVZ

All in all, this was a very simple and old code (tracing back to Julius Caesar wartime communications), with the only point of difficulty being the initial confusion of the ambiguous role of the various digits as independent or part of two-digit numbers. For example, one reported note by Provenzano read

I met 512151522 191212154 and we agreed that we will see each other after the holidays…

This name was decoded as Binnu Riina. Bruce Schneider — an American cryptography expert — was quoted in Discovery Channel News saying

Looks like kindergarten cryptography to me. It will keep your kid sister out, but it won't keep the police out. But what do you expect from someone who is computer illiterate?

Italian police got a chance to read many pizzini when close associates of Provenzano turned informant. Once in possession of enough pizzini, police were able to break the code quickly. A biographer of Provenzano also reports that Provenzano used a more complicated code — yet to be deciphered — which referenced selected words that Provenzano had underlined in his copy of the Bible.

Assignment

In this assignment we ask you to encode words as positive integers, using an encryption scheme inspired by the code Provenzano used to write his pizzini. In doing you, you proceed as follows.

  • Write a funtion encodeLetter that takes three arguments: i) a single letter (string), ii) an integer $n \in \mathbb{N}$, and iii) a string of letters. The function must return an integer that is computed as the sum of $n$ and the position of the given letter (first argument) in the given string of letters (third argument). The positions of the letters in the third argument are indexed starting from one (the first letter is at position 1, the second letter at position 2, …).
  • Write a function encodeWord that takes three arguments: i) a word (string), ii) an integer $n \in \mathbb{N}$, and iii) a string of letters. The function must return an integer that is constructed by chaining all digits of all numbers that are obtained by converting the individual letters of the given word using the function encodeLetter.

In both functions, the third argument represents a given alphabet, in which you may assume that each character occurs only once. In addition you may assume in both cases that all characters of the string passed as the first argument occur in the given alphabet. Both function should make no distinction between uppercase and lowercase letters.

Example

>>> italian = 'ABCDEFGHILMNOPQRSTUVZ'
>>> encodeLetter('M', 3, italian)
14
>>> encodeWord('MIA', 3, italian)
14124
>>> encodeWord('Binnu', 3, italian)
512151522
>>> encodeWord('Riina', 3, italian)
191212154

>>> latin = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> encodeLetter('M', 3, latin)
16
>>> encodeWord('MIA', 3, latin)
16124
>>> encodeWord('Binnu', 3, latin)
512171724
>>> encodeWord('Riina', 3, latin)
211212174

Pizzino (meervoud: pizzini) is een Italiaans woord dat werd afgeleid van het Siciliaanse equivalent pizzinu. Naast zijn oorspronkelijke betekenis van "klein stukje papier", wordt het woord vandaag de dag meer algemeen gebruikt om te verwijzen naar de kleine handgeschreven papiertjes die de Siciliaanse maffia gebruikt als communicatiemiddel tussen de verschillende kopstukken. De Siciliaanse maffiabaas Bernardo Provenzano behoort tot de bekendste maffiosi die gebruik maakten van pizzini, met name voor zijn instructies die Messina Denaro aanwezen als zijn opvolger. De pizzini van andere maffiosi hebben aanzien geholpen bij het politieonderzoek naar de Siciliaanse maffia.

Bernardo
      Provenzano
Bernardo Provenzano (geboren op 31 januari 1933 in Corleone, Sicilië) is een lid van de Siciliaanse maffia (Cosa Nostra). Hij wordt ervan verdacht het hoofd geweest te zijn van de Corleonesi, een groepering binnen de maffia die ontstaan is in het stadje Corleone, en de facto ook de capo di tutti capi (baas der bazen) van de volledige Siciliaanse maffia tot aan zijn arrestatie in 2006. Zijn bijnaam is Binnu u tratturi (Siciliaans voor "Binnie de traktor") omdat, volgens de woorden van een informant, "hij mensen zonder verpinken omvermaait".

Provenzano verborg de pizzini met zijn instructies bij een oude schapenboerderij onder stenen of onder de grond. Eenmaal gelezen, werden ze vernietigd. Hierbij gebruikte hij een codeertechniek waarbij elke letter eerst omgezet werd naar een natuurlijk getal overeenkomstig de positie van de letter in het alfabet (A=1, B=2, …), waarna elk van deze getallen nog eens verhoogd werd met drie. De getallen die men op deze manier bekwam voor elk van de letters van een woord, werden eenvoudigweg achter elkaar gezet om zo een groot getal te bekomen. Op die manier werd mia bijvoorbeeld gecodeerd als 16124, omdat $$\mbox{m} = 13 + 3 = 16,\ \mbox{i} = 9 + 3 = 12 \mbox{ en a} = 1 + 3 = 4$$ Hierbij valt op te merken dat er gebruik gemaakt werd van het Italiaanse alfabet, dat een lichtjes gewijzigde volgorde heeft en minder letters telt dan het Latijnse alfabet:

ABCDEFGHILMNOPQRSTUVZ

Alles bij elkaar gaat het om een zeer eenvoudige en zeer oude code, waarvan de enige moeilijkheid erin bestaat dat het bij het decoderen niet eenduidig is of de cijfers individueel moeten behandeld worden of in groepen van twee. Zo las één van de onderschepte pizzini van Provenzano als

Ik ontmoette 512151522 191212154 en we kwamen overeen dat we elkaar na de vakantie terug zouden zien…

De naam werd gedecodeerd als Binnu Riina. Bruce Schneider — een Amerikaanse expert in de cryptografie — zei hierover op Discovery Channel News

Looks like kindergarten cryptography to me. It will keep your kid sister out, but it won't keep the police out. But what do you expect from someone who is computer illiterate?

De Italiaanse politie kreeg de kans om heel wat pizzini te lezen toen handlangers uit de inner circle van Provenzano konden overtuigd worden om als informant op te treden. Eenmaal ze in het bezit waren van voldoende pizzini, was de politie in staat om de code snel te breken. Een biograaf van Provenzano maakt melding van het feit dat hij ook nog een meer gecompliceerde code gebruikte die op heden nog altijd niet kon ontcijferd worden, en waarbij gebruik gemaakt werd van sommige woorden die Provenzano had onderlijnd in zijn Bijbel.

Opgave

In deze opgave vragen we je om woorden te coderen als natuurlijke getallen, volgens een code die geïnspireerd is op de code die Provenzano gebruikte bij het schrijven van zijn pizzini. Hiervoor ga je als volgt te werk.

  • Schrijf een functie codeerLetter waaraan drie argumenten moeten doorgegeven worden: i) één enkele letter (string), ii) een getal $n \in \mathbb{N}$, en iii) een string van letters. De functie moet een natuurlijk getal teruggeven dat bekomen wordt door de positie van de gegeven letter (eerste argument) op te zoeken in de gegeven string van letters (derde argument), en daarbij de waarde $n$ op te tellen. Hierbij worden de posities van de letters in het derde argument genummerd vanaf 1 (eerste letter staat op positie 1, tweede letter op positie 2, …).
  • Schrijf een functie codeerWoord waaraan drie argumenten moeten doorgegeven worden: i) een woord (string), ii) een getal $n \in \mathbb{N}$, en iii) een string van letters. De functie moet een natuurlijk getal teruggeven dat gevormd wordt door de cijfers van alle getallen die je bekomt door de individuele letters van het gegeven woord om te zetten met de functie codeerLetter achter elkaar te zetten.

Voor beide functies stelt het derde argument een gegeven alfabet voor, waarbij je er mag van uitgaan dat elk karakter er hoogstens één keer in voorkomt. Bovendien mag je er in beide gevallen ook van uitgaan dat alle karakters van de string die als eerste argument wordt doorgegeven, voorkomen in het gegeven alfabet. Beide functies mogen ook geen onderscheid maken tussen hoofdletters en kleine letters.

Voorbeeld

>>> italiaans = 'ABCDEFGHILMNOPQRSTUVZ'
>>> codeerLetter('M', 3, italiaans)
14
>>> codeerWoord('MIA', 3, italiaans)
14124
>>> codeerWoord('Binnu', 3, italiaans)
512151522
>>> codeerWoord('Riina', 3, italiaans)
191212154

>>> latijns = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> codeerLetter('M', 3, latijns)
16
>>> codeerWoord('MIA', 3, latijns)
16124
>>> codeerWoord('Binnu', 3, latijns)
512171724
>>> codeerWoord('Riina', 3, latijns)
211212174


Added by:Peter Dawyndt
Date:2015-10-11
Time limit:10s
Source limit:50000B
Memory limit:1536MB
Cluster: Cube (Intel G860)
Languages:PY_NBC