Nonogram Yapboz Oluştur


24

Bir nonogram bu (oyundan ekran görüntüleri gibi görünür iki boyutlu mantık bulmaca Pixelo sevdiğim nonogram oyunu):

Boş bir nonogram kartı

Oyunun amacı, bu numaraların hangi görüntüyü kodladığını bulmaktır. Kurallar basit: Bir sütundaki veya satırdaki bir sayı, o sütunda veya satırın herhangi bir yerinde, birçok kutunun bir satırda doldurulduğu anlamına gelir. Örneğin, yukarıdaki resimde yer alan alt satırda dolu kutu bulunmamalı, yukarıdaki kutuda da dolu olan tüm kutulara sahip olmalıdır. Alttan üçüncü satırda 8 tane dolu kutu var ve hepsi bir sırada olacaklar.

Aynı sütun veya satır için iki veya daha fazla sayı, bu uzunluklarla aralarında en az bir boşluk olan doldurulmuş kutuların birden fazla "çalışması" anlamına gelir. Sipariş korunur. Örneğin, yukarıdaki görüntünün sağ sütununda üç doldurulmuş kutu, altlarında en az bir boşluk ve daha sonra bir doldurulmuş kutu daha vardır.

İşte aynı yapboz, neredeyse tamamlandı:

Neredeyse bitmiş bir nonogram kurulu

(X'ler önemli değil, sadece oyuncunun "Bu kare kesinlikle doldurulmadı" demesi için bıraktıkları bir ipucu. Mayın Tarlası'ndaki bayrakları düşünün. Hiçbir anlamı yoktur.)

Umarım, örneğin, "2 2" diyen ipuçlarına sahip orta sütunların kutulara doldurulmuş 2 boyda iki kadeh içerdiğini görebilirsiniz.

Göreviniz, kabul etmeyi seçmeniz durumunda, böyle bir bilmece yaratacak bir program veya işlev yazmaktır. Anakartın boyutuna stdin üzerinde tek bir tamsayı (5 <= n <= 50) veya bir argüman olarak (bir nonogram yapbozun kare olmasının bir nedeni yoktur, ama bu zorluk için olacaktır) verilir. Bundan sonra, görüntüdeki sırasıyla doldurulmuş ve doldurulmamış kareleri temsil eden bir dizi 1 ve 0 verilir. Bunlardan ilki n, üst satır, sonraki satır, vb .dir. 2 * 1 hücreli bir panoya geri dönecek veya basacaksınız (çünkü daha iyi görünüyorlar ve size bir sütun için 2 basamaklı ipuçları için yer veriyor. ), hepsi boş, giriş verilerine karşılık gelen ipuçlarıyla.

Çıkış biçimi

Çıkış biçimi

Numune

Giriş:

./nonogram <<< '5 0 1 1 1 0 1 1 0 1 1 1 0 1 0 1 1 1 0 1 1 0 1 1 1 0'
                                 OR
      n(5,[0,1,1,1,0,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,0,1,1,1,0])

Resim:

İlk örnek resim

Çıktı:

           1
         2 1 2
       3 2 1 2 3
     +----------
    3|
  2 2|
1 1 1|
  2 2|
    3|

Giriş:

./nonogram <<< '15 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 0 0 1 0 1 0 0 1 0 0 0 1 1 1 1 1 0 1 0 1 1 1 1 0 0 0 1 1 1 1 1 0 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1'

Resim:

İkinci örnek resim

Çıktı:

                   1                       1
                 1 1 3       3 5   5 3   3 1
                 7 2 3 2 4 2 3 210 2 3 0 4 215
               +------------------------------
              2|
              1|
              1|
              1|
              1|
            1 1|
        3 3 1 1|
        1 5 1 1|
          3 5 3|
          1 5 1|
          1 3 1|
      1 1 1 1 1|
1 1 1 1 1 1 1 1|
           11 3|
           11 3|

Açıklamalar

  • Çıktınızın çözülebilir bir bilmece olması gerekmez. Program dışı olanların hepsi çözülemez, ancak bu sizin endişeniz değil. Sadece iyi bir bilmece olsun ya da olmasın, girdiye karşılık gelen ipuçlarını çıktılayın.
  • Komut satırında argümanlar alan bir programa izin verilir. Bu yukarıda belirtilen tür, ancak yanlış bir fikir edinmek mümkündür. Açıklamalar bunun için var.
  • 0Kutuları doldurulmamış bir satır veya sütuna yazdırmak zorunludur. Bunu hiçbir yerde kelimelerle söylemiyorum ama örnek verilerde var.

Sadece çözümümle bitirdim. Bir satırda veya sütunda 3 basamaklı bir kutu olmayacağını varsayabilir miyiz?
15

2
@ voidpigeon: 5<=n<=50spec, bu nedenle herhangi bir 3 basamaklı sayı
olamaz

Bu soruyu gönderdikten sonra kendim bir çözüm üzerinde çalışmaya başladım. Henüz göndermeyeceğim ( bu meta cevabına göre), ancak bayt sayımı göndereceğim, böylece sizler için gayret göstereceğiniz bir şey var: Python
undergroundmonorail

İlk örnek çıktınız -olması gerekenden daha fazla içermiyor mu?
Ventero

@Ventro Haklısın! Bunu yapmak için nasıl bir program yazacağımı biliyordum, ama şimdiye kadar yapmamıştım, bu yüzden örnek çıktılarım el ile yapıldı. Hata! (İkinci örnek çıktısını da mahvettim, ancak herhangi bir cevap vermeden önce düzelttim.)
undergroundmonorail

Yanıtlar:


9

GolfScript, 128 karakter

~](:k/.{{1,%{,}%.!,+}%}:^~{' ':s*}%.{,}%$-1=:9{s*\+9~)>'|'n}+%\zip^.{,~}%$0=){.~[s]*@+>{s\+-2>}%}+%zip{9)s*\n}%\[9s*'+''--'k*n]\

Giriş, STDIN'de boşlukla ayrılmış sayılar olarak sağlanmalıdır.

Örneği burada test edebilirsiniz .

Yorumlanan kod:

# Parse the input into an 2D array of digits. The width is saved to variable k
~](:k/

# Apply the code block ^ to a copy of this array
.
{                # begin on code block
  {              # for each line
   1,%           #   split at 0s (1, => [0]) (leading, trailing, multiple 0s are 
                 #   removed because of operator % instead of /)
   {,}%          #   calculate the length of each run of 1s                 
   .!,+          #   special case: only zeros, i.e. []
                 #   in this case the ! operator yiels 1, thus [0], else []
  }%             # end for
}:^              # end of code block
~                # apply

# Format row headers
{' ':s*}%        # join numbers with spaces
.{,}%$-1=:9      # calulate the length of the longest row header
                 # and save it to variable <9>
{                # for each row
  s*\+           #   prepend padding spaces
  9~)>           #   and cut at length <9> from the right
  '|'n           #   append '|' and newline
}+%              # end for

# Format column headers
\zip^            # transpose input array and apply the code block ^
                 # i.e. calculate length of runs
.{,~}%$0=)       # determine (negative) length of the longest column header
{                # for each column
  .~[s]*@+       #   prepend enough spaces
  >              #   and cut at common length (from right)
  {s\+-2>}%      #   format each number/empty to 2 chars width
}+%              # end for
zip              # transpose column header into output lines
{9)s*\n}%        # prepend spaces to each line and append newline

# Inject separator line
\[
9s*              # spaces
'+'              # a plus sign
'--'k*           # k (width) number of '--'
n                # newline
]\

1
+1 güzel, bu
yazıdan

123 karaktere kadar golf oynamayı başardım: ~](:k/.zip\]{{1,%{,}%.!,+}%}/{' ':^*}%{.{,}%$-1=}:f~:r{^*\+r~)>'|'n}+%\f{.~)\[^]*@+>{^\+-2>}%}+%zip{r)^*\n}%r^*'+''--'k*n]((nedense lettercount.com kopyalarsanız 125 karakter diyor, ancak sizi temin ederim, bu 123 karakterdir). Algoritmanın bazı kısımları değiştirildi, ancak çoğunluğu hala aynı. Ayrıca bazı değişken isimlerini de değiştirdim (değişken olarak 9'a sahip olmak akıllıdır, fakat kafa karıştırıcıdır), fakat isterseniz tekrar değiştirebilirsiniz.
Oynaklık

7

Ruby, 216 255

n=$*.shift.to_i;k=*$*.each_slice(n)
u=->k{k.map{|i|r=i.join.scan(/1+/).map{|i|"%2d"%i.size}
[*["  "]*n,*r[0]?r:" 0"][-n,n]}}
puts u[k.transpose].transpose.map{|i|" "*(n-~n)+i*""},"  "*n+?++"--"*n,u[k].map{|i|i*""+?|}

Bu soruda verilen kesin örnek çıktısını üretmese de, özellikleri takip ediyor. Örneklerdeki tek fark birkaç önde gelen boşluk / yeni satır yazdırmamdır.

Örnek:

$ ruby nonogram.rb 15 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 0 0 1 0 1 0 0 1 0 0 0 1 1 1 1 1 0 1 0 1 1 1 1 0 0 0 1 1 1 1 1 0 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1
# empty lines removed for brevity
                                  1                       1  
                                1 1 3       3 5   5 3   3 1  
                                7 2 3 2 4 2 3 210 2 3 0 4 215
                              +------------------------------
                             2|
                             1|
                             1|
                             1|
                             1|
                           1 1|
                       3 3 1 1|
                       1 5 1 1|
                         3 5 3|
                         1 5 1|
                         1 3 1|
                     1 1 1 1 1|
               1 1 1 1 1 1 1 1|
                          11 3|
                          11 3|

Değişiklikler:

  • 240 -> 231: Stdin yerine komut satırı değişkenlerini kullanmak için girdi formatı değiştirildi.
  • 231 -> 230: Değer kontrolünü konumdan hareket ettirerek boşluk kalmadı chunk için map.
  • 230 -> 226: [nil]Aramak yerine çıkartArray#compact .
  • 226 -> 216: İpucu oluşturma işlemini basitleştirin.

Bazı ekstra yeni satırlar ve boşluklar yazdırıyorsunuz, ancak şimdiye kadar yaptığım tüm testlerde "0 veya daha fazla" şartnameye uydular, bu yüzden iyisiniz. Sizi şimdi uyarıyorum, yine de, soldaki havada yüzen sayıları görmeye başlarsam, monitörümden diskalifiye etmek zorunda kalacağım :)
undergroundmonorail

1
@ undergroundmonorail: Çıktı öyle bir şekilde basılır length(leading spaces + numbers to the left) == 2*nve height(leading newlines + numbers at the top) == n... monitörünüz 3*n+1 × 2*n+2karakterler için yeterince büyük olduğu sürece , beni diskalifiye etmeniz gerekmez. :)
Ventero

4

Ruby, 434

n=$*[i=0].to_i
a,b=[],[]
a.push $*.slice!(1..n)*""while $*.size>1
(b.push a.map{|c|c[i]}*"";i+=1)while i<n
a,b=*[a,b].map{|c|c.map{|d|e=d.split(/[0]+/).map(&:size).select{|f|f>i=0}.map &:to_s;(e.size>0)?e:[?0]}}
m,k=*[a,b].map{|c|c.map(&:size).max}
s="  "*m
k.times{$><<s+"  "+b.map{|c|(" "+((c.size==k-i)?(c.shift):(" ")))[-2..-1]}*"";i+=1;puts}
puts s+" "+?++?-*n*2
a.each{|c|puts"  "*(m-c.size)+" "+c.map{|d|(" "+d)[-2..-1]}*""+?|}

Bunu nasıl çalıştırıyorsun? Denedim ruby $yourprogram <<< $inputama anladım ruby_nanograms:7:in '<main>': undefined method '+' for nil:NilClass (NoMethodError).
undergroundmonorail

ruby nonogram.rb 2 1 0 0 12x2 için @undergroundmonorail
15

Bu iyi bir cevap, ancak 0ikinci örnekteki dördüncü sütun için yazmıyorsunuz.
undergroundmonorail

Az önce fark ettim ki +------... çizgi de çok fazla boşluk tarafından girintili.
undergroundmonorail

1
@ undergroundmonorail Her ikisi de düzeltildi.
öğleden sonra

4

GolfScript 149 147

Kod

~](:s/.zip{{[0]%{,`}%['0']or}%.{,}%$)\;:¶;{.,¶\-[' ']*\+}%}:f~¶:v;\[f~]\zip{{{.,2\-' '*\+}%''*}:d2*)' '*:z\+{puts}:o~}%z(;'+'s'-'2**++o~{d'|'+o}/

Düzenlemeler:

  • gereksiz alan kaldırıldı
  • bir karakter putsdaha kaydetmek için tekrar kullanılabilir bir karakter işlevi tanımladı

Çevrimiçi demolar

Kodun açıklamalı bir sürümü

# split lines
~](:s/

# make transposed copy
.zip

#prepare numbers to show in the header
{{[0]%{,`}%['0']or}%.{,}%$)\;:¶;{.,¶\-[' ']*\+}%}:f~¶:v;

# prepare numbers to show in the left column
\[f~]\zip

#print header (vertical hints)
{  {{.,2\-' '*\+}%''*}:d~  2*)' '*:z\+puts}%

#print first line
z(;'+'s'-'2**++puts

#print horizontal hints
~{d'|'+ puts}/

4

Javascript (E6) 314 334 357 410

N=(d,l)=>{J=a=>a.join(''),M=s=>(s.match(/1+/g)||['']).map(x=>x.length),f=' '.repeat(d+1),c=[n='\n'],o=n+f+'+'+'--'.repeat(d);for(i=-1;++i<d;)c[i]=M(J(l.map((e,p)=>p%d-i?'':e))),o+=n+(f+J(M(J(l).substr(i*d,d)).map(P=n=>n>9?n:n<10?' '+n:'  '))+'|').slice(-d-2);for(;--i;)o=n+f+' '+J(c.map(e=>P(e.pop())))+o;return o}

Ungolfed

N=(d,l)=> {
  J = a => a.join(''),
  M = s => (s.match(/1+/g)||['']).map(x=>x.length),
  f=' '.repeat(d+1), c=[n='\n'], o=n+f+'+'+'--'.repeat(d);
  for(i = -1; ++i < d;)
    c[i] = M(J(l.map((e,p)=>p%d-i?'':e))),
    o += n+(f+J(M(J(l).substr(i*d,d)).map(P=n=>n>9?n:n<10?' '+n:'  '))+'|').slice(-d-2);
  for(;--i;)
    o=n+f+' '+J(c.map(e=>P(e.pop())))+o;
  return o
}

kullanım

N(5,[0,1,1,1,0,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,0,1,1,1,0])

N(15,[0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,1,1,1,0,1,0,1,1,1,1,0,0,0,1,1,1,1,1,0,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,1,0,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1])

Geçmişi düzenle

1 Sütunları bulmak için kullanılan kaldırılan regexp.Overkill
2 Simpler daha iyi. Diziye değil dizgeye çıktı. Kaldırılan yardımcı işlev DOLDUR (F)
3 Daha da basit. Bundan daha iyisini yapamam. Golfscript ile hala karşılaştırılamıyor :(


Güzel. Ben de bir Javascript sürümünü denedim ama yaklaşık 500 baytlık bir şeyle sona erdi ve buraya koymak için çok büyük olduğuma karar verdim. Ungolfed sürümünü (eğer hala varsa) orijinal değişken adlarıyla göndermek iyi olurdu. Ayrıca, bunu nasıl çalıştırıyorsunuz? Krom konsol penceresine yapıştırarak kopyalarsam "ReferenceError: Atamada geçersiz sol taraf" ifadesini alıyorum. Çalıştırmadan önce değiştirilecek veya eklenecek bir şey var mı?
tigrou

@tigrou üzgünüm "=>" sintax sadece firefox'ta çalışıyor. Değişkenler: c ipuçları, d boyutu, l girdi listesi, o çıktı, i döngü değişkeni, q ve z temp
edc65


@nderscore kod ile uğraşıyor, 326 var. Kodunuzda R başlatılmadı (tekrar tekrar denediğinizde kolay hata
oluştu

1

R, 384 karakter

a=scan();p=function(x)paste(x,collapse="");P=paste0;s=sapply;l=length;f=function(i)lapply(apply(matrix(a[-1],nr=a,b=T),i,rle),function(x)if(any(x$v)){x$l[!!x$v]}else{0});g=function(j,i)apply(s(j,function(x)sprintf("%2s",c(rep("",max(s(j,l))-l(x)),x))),i,p);c=P(g(f(1),2),"|");d=g(f(2),1);h=p(rep(" ",nchar(c[1])-1));e=P(h,"+",p(rep("-",nchar(d[1]))));d=P(h," ",d);cat(d,e,c,sep="\n")

Girinti ve bazı açıklamalarla:

a=scan() #Takes input

p=function(x)paste(x,collapse="") #Creates shortcuts
P=paste0
s=sapply
l=length

#This function finds the number of subsequent ones in a line (using rle = run length encoding).
#It takes 1 or 2 as argument (1 being row-wise, 2 column-wise
f=function(i)lapply(apply(matrix(a[-1],nr=a,b=T),i,rle),function(x)if(any(x$v)){x$l[!!x$v]}else{0})

#This function takes the result of the previous and format the strings correctly (depending if they are rows or columns)
g=function(j,i)apply(s(j,function(x)sprintf("%2s",c(rep("",max(s(j,l))-l(x)),x))),i,p)

c=paste0(g(f(1),2),"|") #Computes the rows
d=g(f(2),1) #Computes the columns
h=p(rep(" ",nchar(c[1])-1)) 
e=paste0(h,"+",p(rep("-",nchar(d[1])))) #Prepare vertical border
d=paste0(h," ",d) #Pad column indices with spaces
cat(d,e,c,sep="\n") #Prints

Kullanımı:

> a=scan();p=function(x)paste(x,collapse="");P=paste0;s=sapply;l=length;f=function(i)lapply(apply(matrix(a[-1],nr=a,b=T),i,rle),function(x)if(any(x$v)){x$l[!!x$v]}else{0});g=function(j,i)apply(s(j,function(x)sprintf("%2s",c(rep("",max(s(j,l))-l(x)),x))),i,p);c=P(g(f(1),2),"|");d=g(f(2),1);h=p(rep(" ",nchar(c[1])-1));e=P(h,"+",p(rep("-",nchar(d[1]))));d=P(h," ",d);cat(d,e,c,sep="\n")
1: 15 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 0 0 1 0 1 0 0 1 0 0 0 1 1 1 1 1 0 1 0 1 1 1 1 0 0 0 1 1 1 1 1 0 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1
227: 
Read 226 items
                    1                       1  
                  1 1 3       3 5   5 3   3 1  
                  7 2 3 2 4 2 3 210 2 3 0 4 215
                +------------------------------
               2|
               1|
               1|
               1|
               1|
             1 1|
         3 3 1 1|
         1 5 1 1|
           3 5 3|
           1 5 1|
           1 3 1|
       1 1 1 1 1|
 1 1 1 1 1 1 1 1|
            11 3|
            11 3|

1

C - 511

Çıktıyı güzel biçimlendirmek için C kesinlikle yapılamadı. Karakter sayısı sadece gerekli boşlukları / yeni satırları içerir.

Giriş, STDIN'den, sayılar boşluklarla ayrılmış.

#define P printf
#define L(x) for(x=0;x<s/2+1;x++)
#define l(x) for(x=0;x<s;x++)
#define B(x,y) x[i][j]||y==s/2?P("%2d",x[i][j]):P("  ");
a[50][50],i,j,s,h[25][50],v[50][25],H[50],V[50],x[25],y[25];
main(){
    scanf("%d",&s);
    L(j)x[j]=y[j]=s/2+1;
    l(i)l(j)scanf("%d",&a[i][j]);
    for(i=s-1;i>=0;i--)
        for(j=s-1;j>=0;j--)
            a[i][j]?
                !H[j]&&(x[j]--,H[j]=1),
                h[x[j]][j]++,
                !V[i]&&(y[i]--,V[i]=1),
                v[i][y[i]]++:
            (H[j]=V[i]=0);
    L(i){
        L(j)P("  ");
        P(" ");
        l(j)B(h,i);
        P("\n");
    }
    L(i)P("  ");
    P("+");
    l(i)P("--");
    P("\n");
    l(i){
        L(j)B(v,j);
        P("|\n");
    }
}

1

Birkaç gün oldu ve kimse python ile cevaplanmadı, işte benim (muhtemelen oldukça fakir) denemem:

Python 2.7 - 404 397 380 bayt

def p(n,m):
 k=str.join;l=[];g=lambda y:[['  ']*(max(map(len,y))-len(t))+t for t in[[' '*(a<10)+`a`for a in map(len,k("",c).split('0'))if a]or[' 0']for c in y]]
 while m:l+=[map(str,m[:n])];m=m[n:]
 x=g(l);j=k('\n',['  '*max(map(len,x))+'+'+k("",a)for a in zip(*[list(a)+['--']for a in g(zip(*l))])]);return j.replace('+',' ',j.count('+')-1)+'\n'+k('\n',[k("",a+['|'])for a in x])

Yakında unungolfed versiyonunu göndereceğim, ama şu anda oldukça okunaklı olduğunu düşünüyorum. :)

DÜZENLE: Ungolded versiyonunu yazarken, oldukça önemli olması için ekleyebileceğim bazı gelişmeler olduğunu fark ettim! Açıklayamamamın bir nedeni, şimdi üstte ek yeni çizgiler ve solda boşluklar (işlevsel bir şeyi değiştirdiğimi sanmasam bile), ancak yine de belirtime uygun.Ungolfed versiyonu geliyor!

Ungolfed:

def nonogram(board_size, pixels):
    def hints(board):
        output = []
        for row in board:
            # Convert the row to a string of 1s and 0s, then get a list of strings
            # that came between two 0s.
            s = "".join(row).split('0')

            # A list of the length of each string in that list.
            l = map(len, s)

            # We now have our horizontal hints for the board, except that anywhere
            # there were two 0s consecutively we have a useless 0.
            # We can get rid of the 0s easily, but if there were no 1s in the row at
            # all we want exactly one 0.
            # Solution:
            output.append([h for h in l if h != 0] or [0])
            # In this context, `foo or bar` means `foo if foo is a truthy value, bar
            # otherwise`.
            # An empty list is falsey, so if we strip out all the strings we hardcode
            # the 0.
        return output

    def num_format(hints):
        # For both horizontal and vertical hints, we want a space before single-
        # digit numbers and no space otherwise. Convert hints to strings and add
        # spaces as necessary.
        output = []

        for row in hints:
            output.append([' '*(a < 10) + str(a) for a in row])
            # Multiplying a string by n repeats it n times, e.g. 'abc'*3=='abcabcabc'
            # The only numbers that need a space are the ones less than 10.
            # ' '*(a < 10) first evaluates a < 10 to get a True or False value.
            # Python automatically converts True to 1 and False to 0.
            # So, if a is a one digit number, we do `' '*(1) + str(a)`.
            # If it's a two digit number, we do `' '*(0) + str(a)`.
        return output

    def padding(hints):
        output = []
        longest = max(map(len, hints)) # how long is the longest row?
        for row in hints:
            output.append(['  ']*(longest - len(row)) + row)
            # Add '  ' to the beginning of every row until it's the same length
            # as the longest one. Because all hints are two characters wide, this
            # ensures all rows of hints are the same length.
        return output

    board = []

    while pixels: # non-empty list == True
        # Make a list of the first (board_size) pixels converted to strings, then
        # add that list to board. Remove those pixels from the list of pixels.
        # When pixels is empty, board has a seperate list for each row.
        board.append([str(n) for n in pixels[:board_size]])
        pixels = pixels[board_size:]

    horizontal_hints = padding(num_format(hints(board)))

    vertical_hints = padding(num_format(hints(zip(*board))))
    # zip(*l) is a common way to transpose l.
    # zip([1,2,3], [4,5,6], [7,8,9]) == [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
    # the star operator unpacks an iterable so the contents can be used as
    # multiple arguments, so
    # zip(*[[1,2,3],[4,5,6],[7,8,9]]) is the same as what we just did.
    # Transposing the board and getting the horizontal hints gives us the
    # vertical hints of the original, but transposed. We'll transpose it back,
    # but we'll also add '--' to the end of all of them to make up the line
    vertical_hints = zip(*[a + ['--'] for a in vertical_hints])

    # add n spaces, where n is the length of the longest horizontal hint, plus
    # one space to the beginning of each line in the vertical hints, then join
    # with newlines to make it all one string.
    vertical_hints = '\n'.join(['  '*max(map(len, horizontal_hints)) + '+' +
                               ''.join(a) for a in vertical_hints])

    # find the number of plus signs in the string
    # replace the first (that many - 1) plus signs with spaces
    vertical_hints = vertical_hints.replace('+', ' ', vertical_hints.count('+')-1)

    # add a pipe to each row of horizontal hints, then join it with newlines
    horizontal_hints = '\n'.join([''.join(a + ['|']) for a in horizontal_hints])

    # add and return
    return vertical_hints + '\n' + horizontal_hints

Okunabilirlik adına birkaç değişiklik yapıldı ( gadlandırılmış üç işleve ayrıldı, fordöngüler halinde karmaşık liste kavramaları yapıldı ) ancak mantıksal olarak aynı şekilde çalışıyor.

Bu yüzden, golf sahası bir tane daha yazıyorsa, bunun fazladan boşluk ve yeni satır basmaması kafa karıştırıcıdır. ¯ \ _ (ツ) _ / ¯


1
Senin çözümünü bulamıyorum. (üzgünüm, karakter sayısıyla ilgili korkunç bir şaka, beni boşver :))
Doorknob

@ Aha! Şimdi HTTP hata kodu şakalarını yapmayı deneyin! : P
undergroundmonorail
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.