fork(1) download
  1. #!/usr/bin/perl
  2. # 6N Nonogram
  3.  
  4. while ($sk=<>){
  5.  
  6. # eilučių sudėjimas į masyvą:
  7. for (0..$sk-1){
  8. $skait=<>;
  9. @mas=(@mas,$skait);
  10. }
  11.  
  12. # subrutina, verčianti pvz. XX..X → 2 1
  13. sub lineSolver {
  14.  
  15. @ats=();
  16. for $k(0..@_-1){
  17. $_=shift; # pašiftinamas masyvas @_, kuris yra įėjusio (pvz. @mas) kopija, t.y. gaunama eilutė.
  18. s/\b(X+)\b/length$1/ge; # eilutėje ieškoma iš eilės einančių 1 ar daugiau IKSŲ. Apskliaustas
  19. # surastas reiškinys išsisaugo į $1. Tada IKSŲ eilučių vietose įrašomas
  20. # iš IKSŲ sudarytos eilutės ilgis (apskaičiuoja modifikatorius "e").
  21. # Operacija kartojama vieną kartą praeinant visą eilutę K→D (modif. "g").
  22. s/\D+/ /g; # visos iš eilės einančių 'ne skaitmenų' eilutės pakeičiamos tarpais.
  23. s/^ //; # eilutės pradžioje panaikinamas tarpas, jeigu yra.
  24. s/ $//; # eilutės pabaigoje panaikinamas tarpas, jeigu yra.
  25. s/^$/0/; # jeigu eilutė tuščia, joje įrašomas 0.
  26. $_.="\n";
  27. $ats[$k]=$_; # apdorota eilutė įrašoma į masyvą @ats, kaip jo k-tasis elementas.
  28. }
  29. }
  30.  
  31. lineSolver(@mas);
  32. print @ats;
  33.  
  34. # Dvigubas ciklas. Karpo po n-tąją visų eilučių raidę, suklijuodamas jas į nają eilutę naujam masyvui:
  35. for $j(0..$sk-1){
  36. foreach $i(0..$sk-1){
  37. chomp($mas[$i]); # nukerpa gale "\n", jeigu toks yra.(Efektyviau būtų iškelt :) )
  38. $sam[$sk-1-$j].=chop($mas[$i]); # nukerpa gale 1 simbolį, ir priklijuoja jį prie masyvo @sam elemento.
  39. }
  40. $sam[$sk-1-$j].="\n"; # kiekvienam sukonstruotam stulpeliui gale priklijuojamas "\n".
  41. }
  42.  
  43. lineSolver(@sam);
  44. print @ats;
  45.  
  46. # masyvų išvalymas:
  47. @mas=();
  48. @sam=();
  49. }
  50.  
Success #stdin #stdout 0s 4596KB
stdin
3
XXX
.XX
.X.
3
X.X
..X
X..
5
..X..
.XXX.
X.X.X
..X..
..X..
0
stdout
3
2
1
1
3
2
1 1
1
1
1 1
0
2
1
3
1 1 1
1
1
1
1
5
1
1