Een wereldberoemde maar anonieme artiest heeft er haar handelsmerk van gemaakt om kunstwerken te ontwerpen die samengesteld worden uit een reeks afzonderlijke blokjes. Elke blokje is bedrukt met een karakter uit het ASCII-alfabet. Als de blokjes op de juiste manier in een rechthoekig $$m \times n$$ rooster met $$m$$ rijen en $$n$$ kolommen gerangschikt worden, dan vormen hun bedrukkingen samen een prachtige afbeelding. Dit is bijvoorbeeld één van de topstukken uit de collectie:

((((((((((((((((((((((((((((((
((((((((((((((((((((((((((((((
((((((          ./((((((((((((
((((((                ((((((((
((((((      ((/,        ((((((
((((((      ((((((.      (((((
((((((      (((((((      /((((
((((((      (((((((,     ,((((
((((((      (((((((,     ,((((
((((((      (((((((      /((((
((((((      ((((((/      (((((
((((((      ((((/       ((((((
((((((                ,(((((((
((((((            .(((((((((((
((((((((((((((((((((((((((((((
((((((((((((((((((((((((((((((

Het handige is dat de blokjes afzonderlijk kunnen ingepakt en verzonden worden als de kunstwerken rondreizen om in de meest toonaangevende musea van de wereld tentoongesteld te worden. Om de kunstwerken ter plaatse makkelijk te kunnen samenstellen, krijgt elk blokje van een kunstwerk een uniek volgnummer (vanaf 1). Ze moeten dan in de gebruikelijke leesrichting (van links naar rechts en van boven naar onder) in het rooster geplaatst worden: op de bovenste rij komen van links naar rechts de blokjes met nummers 1 tot en met $$n$$, op de rij daaronder komen van links naar rechts de blokjes met nummers $$n + 1$$ tot en met $$2n$$, enzoverder.

Opgave

Een tekstbestand bevat een lijst met blokjes van een kunstwerk van de wereldberoemde maar anonieme artiest. Elke regel van het bestand beschrijft één blokje door zijn uniek volgnummer, gevolgd door een tab en het karakter van het ASCII-alfabet dat op het blokje gedrukt staat. Dit is bijvoorbeeld hoe de eerste regels van zo'n bestand eruit kunnen zien:

157	 
197	(
178	(
224	(
357	(
136	,
78	/
254	(
23	(
389	(
…

In het Unix commando dat we hieronder reeds gedeeltelijk opgesteld hebben, wordt een dergelijke lijst met blokjes uitgeschreven naar stdout. De shell variabele COLS geeft aan uit hoeveel kolommen het kunstwerk bestaat.

$ COLS=...
$ cat <kunstwerk> |

Vul het commando verder aan zodat de blokjes op hun juiste plaats in het rechthoekig rooster geranchikt worden en de afbeelding die gevormd wordt door hun ASCII-karakters naar stdout wordt uitgeschreven.

Shell variabelen

Een shell variable1 is een naam die verwijst naar een string (tekst). Als je in een Unix commando de naam van de variabele laat voorafgaan door een dollarteken ($) en optioneel tussen accolades zet ({}), dan zal de variabele (het dollarteken, de naam en de optionele accolades) door de shell vervangen worden door de geassocieerde string voordat het commando wordt uitgevoerd.

$ NAME="Linus"
$ echo "Hallo $NAME!"
Hallo Linus!
$ echo "Hallo ${NAME}!"
Hallo Linus!

Let er wel op dat de shell deze variable substitution2 enkel uitvoert als er geen escaping3 wordt toegepast op het dollarteken. Het voorgaande voorbeeld toont aan dat de shell wel nog variable substitution uitvoert als het dollarteken tussen dubbele aanhalingstekens staat. Dat is echter niet het geval als het dollarteken tussen enkele aanhalingstekens staat of wordt voorafgegaan door een backslash (\).

$ NAME="Linus"
$ echo 'Hallo $NAME!'
Hallo $NAME!
$ echo Hallo \$NAME!
Hallo $NAME!

Voorbeeld

$ COLS=30
$ cat dodona.txt4 | …
((((((((((((((((((((((((((((((
((((((((((((((((((((((((((((((
((((((          ./((((((((((((
((((((                ((((((((
((((((      ((/,        ((((((
((((((      ((((((.      (((((
((((((      (((((((      /((((
((((((      (((((((,     ,((((
((((((      (((((((,     ,((((
((((((      (((((((      /((((
((((((      ((((((/      (((((
((((((      ((((/       ((((((
((((((                ,(((((((
((((((            .(((((((((((
((((((((((((((((((((((((((((((
((((((((((((((((((((((((((((((

Richtlijnen bij het indienen

Dien enkel het stuk van het commando in dat moet ingevuld worden op de plaats van de drie puntjes (…).