#!/usr/bin/perl
# 6N Nonogram
while ($sk=<>){
# eilučių sudėjimas į masyvą:
for (0..$sk-1){
$skait=<>;
@mas=(@mas,$skait);
}
# subrutina, verčianti pvz. XX..X → 2 1
sub lineSolver {
@ats=();
for $k(0..@_-1){
$_=shift; # pašiftinamas masyvas @_, kuris yra įėjusio (pvz. @mas) kopija, t.y. gaunama eilutė. s/\b(X+)\b/length$1/ge; # eilutėje ieškoma iš eilės einančių 1 ar daugiau IKSŲ. Apskliaustas
# surastas reiškinys išsisaugo į $1. Tada IKSŲ eilučių vietose įrašomas
# iš IKSŲ sudarytos eilutės ilgis (apskaičiuoja modifikatorius "e").
# Operacija kartojama vieną kartą praeinant visą eilutę K→D (modif. "g").
s/\D+/ /g; # visos iš eilės einančių 'ne skaitmenų' eilutės pakeičiamos tarpais.
s/^ //; # eilutės pradžioje panaikinamas tarpas, jeigu yra.
s/ $//; # eilutės pabaigoje panaikinamas tarpas, jeigu yra.
s/^$/0/; # jeigu eilutė tuščia, joje įrašomas 0.
$_.="\n";
$ats[$k]=$_; # apdorota eilutė įrašoma į masyvą @ats, kaip jo k-tasis elementas.
}
}
lineSolver(@mas);
# Dvigubas ciklas. Karpo po n-tąją visų eilučių raidę, suklijuodamas jas į nają eilutę naujam masyvui:
for $j(0..$sk-1){
foreach $i(0..$sk-1){
chomp($mas[$i]); # nukerpa gale "\n", jeigu toks yra.(Efektyviau būtų iškelt :) ) $sam[$sk-1-$j].=chop($mas[$i]); # nukerpa gale 1 simbolį, ir priklijuoja jį prie masyvo @sam elemento. }
$sam[$sk-1-$j].="\n"; # kiekvienam sukonstruotam stulpeliui gale priklijuojamas "\n".
}
lineSolver(@sam);
# masyvų išvalymas:
@mas=();
@sam=();
}
IyEvdXNyL2Jpbi9wZXJsCiMgNk4gTm9ub2dyYW0KCndoaWxlICgkc2s9PD4pewoKIyBlaWx1xI1pxbMgc3VkxJdqaW1hcyDEryBtYXN5dsSFOiAKZm9yICgwLi4kc2stMSl7CiAgICAkc2thaXQ9PD47CiAgICBAbWFzPShAbWFzLCRza2FpdCk7Cn0KCiMgc3VicnV0aW5hLCB2ZXLEjWlhbnRpIHB2ei4gIFhYLi5YIOKGkiAyIDEKc3ViIGxpbmVTb2x2ZXIgewogICAgCiAgICBAYXRzPSgpOwogICAgZm9yICRrKDAuLkBfLTEpewogICAgJF89c2hpZnQ7ICAjIHBhxaFpZnRpbmFtYXMgbWFzeXZhcyBAXywga3VyaXMgeXJhIMSvxJdqdXNpbyAocHZ6LiBAbWFzKSBrb3BpamEsIHQueS4gZ2F1bmFtYSBlaWx1dMSXLiAKICAgIHMvXGIoWCspXGIvbGVuZ3RoJDEvZ2U7ICAjIGVpbHV0xJdqZSBpZcWha29tYSBpxaEgZWlsxJdzIGVpbmFuxI1pxbMgMSBhciBkYXVnaWF1IElLU8WyLiBBcHNrbGlhdXN0YXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHN1cmFzdGFzIHJlacWha2lueXMgacWhc2lzYXVnbyDEryAkMS4gVGFkYSBJS1PFsiBlaWx1xI1pxbMgdmlldG9zZSDEr3JhxaFvbWFzIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgacWhIElLU8WyIHN1ZGFyeXRvcyBlaWx1dMSXcyBpbGdpcyAoYXBza2FpxI1pdW9qYSBtb2RpZmlrYXRvcml1cyAiZSIpLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgT3BlcmFjaWphIGthcnRvamFtYSB2aWVuxIUga2FydMSFIHByYWVpbmFudCB2aXPEhSBlaWx1dMSZIEvihpJEIChtb2RpZi4gImciKS4KICAgIHMvXEQrLyAvZzsgICAgICAjIHZpc29zIGnFoSBlaWzEl3MgZWluYW7EjWnFsyAnbmUgc2thaXRtZW7FsycgZWlsdXTEl3MgcGFrZWnEjWlhbW9zIHRhcnBhaXMuCiAgICBzL14gLy87ICAgICAgICAgIyBlaWx1dMSXcyBwcmFkxb5pb2plIHBhbmFpa2luYW1hcyB0YXJwYXMsIGplaWd1IHlyYS4KICAgIHMvICQvLzsgICAgICAgICAjIGVpbHV0xJdzIHBhYmFpZ29qZSBwYW5haWtpbmFtYXMgdGFycGFzLCBqZWlndSB5cmEuCiAgICBzL14kLzAvOyAgICAgICAgIyBqZWlndSBlaWx1dMSXIHR1xaHEjWlhLCBqb2plIMSvcmHFoW9tYXMgMC4KICAgICRfLj0iXG4iOwogICAgJGF0c1ska109JF87ICAgICMgYXBkb3JvdGEgZWlsdXTElyDEr3JhxaFvbWEgxK8gbWFzeXbEhSBAYXRzLCBrYWlwIGpvIGstdGFzaXMgZWxlbWVudGFzLgogICAgfQp9CgpsaW5lU29sdmVyKEBtYXMpOwpwcmludCBAYXRzOwoKIyBEdmlndWJhcyBjaWtsYXMuIEthcnBvIHBvIG4tdMSFasSFIHZpc8WzIGVpbHXEjWnFsyByYWlkxJksIHN1a2xpanVvZGFtYXMgamFzIMSvIG5hasSFIGVpbHV0xJkgbmF1amFtIG1hc3l2dWk6CmZvciAkaigwLi4kc2stMSl7CiAgICBmb3JlYWNoICRpKDAuLiRzay0xKXsKICAgICAgICBjaG9tcCgkbWFzWyRpXSk7ICAgICMgbnVrZXJwYSBnYWxlICJcbiIsIGplaWd1IHRva3MgeXJhLihFZmVrdHl2aWF1IGLFq3TFsyBpxaFrZWx0IDopICkKICAgICAgICAkc2FtWyRzay0xLSRqXS49Y2hvcCgkbWFzWyRpXSk7ICAjIG51a2VycGEgZ2FsZSAxIHNpbWJvbMSvLCBpciBwcmlrbGlqdW9qYSBqxK8gcHJpZSBtYXN5dm8gQHNhbSBlbGVtZW50by4KICAgIH0KJHNhbVskc2stMS0kal0uPSJcbiI7ICMga2lla3ZpZW5hbSBzdWtvbnN0cnVvdGFtIHN0dWxwZWxpdWkgZ2FsZSBwcmlrbGlqdW9qYW1hcyAiXG4iLgp9CgpsaW5lU29sdmVyKEBzYW0pOwpwcmludCBAYXRzOwoKIyBtYXN5dsWzIGnFoXZhbHltYXM6CkBtYXM9KCk7CkBzYW09KCk7Cn0K