Menghasilkan grid teka-teki silang yang dapat diputar


8

Tulis sebuah program untuk menghasilkan file yang berisi kisi silang yang dapat dicetak pengguna dan kerjakan puzzle.

Memasukkan

Nama file yang mewakili file kotak silang dan secara opsional nama file kedua yang mewakili file penomoran silang. Input harus diterima dengan cara konvensional untuk lingkungan pemrograman Anda: argumen baris perintah, input standar, formulir web, dll.

Anda dapat mengasumsikan bahwa teka - teki silang telah divalidasi , dan jika menggunakan file penomoran yang sesuai dengan kisi yang disediakan .

Format file kisi: Baris pertama terdiri dari dua konstanta integer yang dipisahkan spasi-putih M dan N. Berikut adalah garis M yang masing-masing terdiri dari N karakter (ditambah baris baru) dipilih [#A-Z ]. Karakter-karakter ini diinterpretasikan sedemikian rupa sehingga '#' mengindikasikan kotak yang diblokir, ' 'kotak terbuka dalam teka-teki tanpa isi yang diketahui dan huruf apa pun berupa kotak terbuka yang berisi huruf itu.

Format file penomoran Baris yang dimulai dengan '#' diabaikan dan dapat digunakan untuk komentar. Semua jalur lain mengandung tab terpisah triplet i, m, ndi mana imerupakan nomor yang akan dicetak di grid, dan mdan nmewakili baris dan kolom dari alun-alun di mana ia harus dicetak. Jumlah baris dan kolom dimulai dari 1.

Keluaran

Outputnya akan berupa file yang dapat dicetak pengguna dan menggunakan teka-teki silang. ASCII, postscript, pdf, png, dan format wajar lainnya akan diterima, tetapi semua harus mematuhi aturan-aturan ini:

  1. Harus ada aturan di seluruh teka-teki dan di antara setiap pasang kotak.
  2. Kotak yang diblokir harus diisi dengan gelap.
  3. Dalam kotak permainan yang mewakili awal dari petunjuk bernomor (melintasi atau bawah) harus disediakan dengan nomor di sudut kiri atas kotak, sambil membiarkan sebagian besar kotak kosong untuk permainan untuk menulis. Perhatikan bahwa kotak khas diterbitkan di surat kabar akan memiliki puluhan petunjuk dan mungkin memiliki lebih dari 100.

Outputnya akan dari grid sendiri, tanpa daftar petunjuk.

Output harus dikirim ke tujuan konvensional (file yang namanya berasal dari nama file input, diproduksi sebagai halaman web, dll.)

Kasus cobaan

Diberikan input dari

5   5
#  ##
#    
  #  
    #
##  #

sudut awal dari output ASCII yang dapat diterima mungkin terlihat seperti ini

+-----+-----+-----+---
|#####|1    |2    |###
|#####|     |     |###
|#####|     |     |###
+-----+-----+-----+---
|#####|3    |     |4  
|#####|     |     |   
|#####|     |     |   
+-----+-----+-----+---
|6    |     |#####|   
|     |     |#####|   

Mereka yang menggunakan format grafis harus mengambil inspirasi dari sumber cetak yang biasa.

Skema penomoran

Kisi bernomor yang benar memiliki properti berikut:

  1. Penomoran dimulai pada 1.
  2. Tidak ada kolom atau rentang kotak terbuka yang tidak dinomori.
  3. Angka akan ditemui dalam penghitungan urutan dengan memindai dari baris atas ke bawah mengambil setiap baris dari kiri ke kanan.

Ke samping

Ini adalah yang ketiga dari beberapa tantangan terkait silang. Saya berencana untuk menggunakan serangkaian file-format yang konsisten di seluruh dan untuk membangun seperangkat utilitas terkait silang yang terhormat dalam prosesnya.

Tantangan sebelumnya dalam seri ini:


Saya tidak bisa berkomentar, tetapi contoh output melanggar skema penomoran Anda sendiri.
Megan Walker

@Amuel: Begitu. Itulah yang saya dapatkan untuk menulisnya dengan tangan daripada melihat kembali pada karya saya sendiri. Terima kasih. Dikoreksi.
dmckee --- ex-moderator kitten

Jawaban:


4

Python, 379 karakter

import sys
A=sys.argv
f=open(A[1])
V,H=map(int,f.readline().split())
M={}
if A[2:]:
 for r in open(A[2]).readlines():n,y,x=map(int,r.split());M[y*H+y+x]=n
R='+-----'*H+'+'
n,v,s='\n| '
x=y=z=''
p=V+1
for c in n+''.join(f):
 if c==n:print x+n+y+n+z+n+R;x=y=z=''
 elif'@'>c:x+=5*c;y+=5*c;z+=5*c
 else:x+=5*s;y+=s+s+c+s+s;z+=5*s
 if p in M:x=x[:-5]+"%-5d"%M[p]
 x+=v;y+=v;z+=v;p+=1

Bekerja dengan baik selama tidak ada komentar di file penomoran.
dmckee --- ex-moderator kitten

Anda bisa menggunakan next(f)bukan f.readline(). Anda tidak perlu di .readlines()sana sama sekali.
gnibbler

10

Nota bene 905 797 677 675 629 608 330 320 308

{G N}/Times-Roman .3 2 22 1 30/.{<920>dup 1 4 3 roll put cvx 
exec}def/${//. 73 .}def[/R{99<a51f3e7d75>$}/G{<1fab75>$ 
R(uN)${0 R{1(X)$ 0 1 -1 5 4 roll 35 eq{4<1980>$}if<81>$ 
1 add}(I)$(u)$ 0 -1<ad>$}<834d>$}/X{{exit}if}/N{-.9
.7<ad>${<1fab70>$ X}loop{{(>nk)$(  )<31a0>$}<a3>$
X}loop}>><0d38388b369bad8e3f>$

Program ini ditulis sebagai "protokol prolog" sehingga Anda hanya membuatnya bersama-sama dengan file grid dan nomor (dalam urutan itu, dipisahkan oleh garis kosong) dan pipa seluruh kekacauan ke ghostscript atau Distiller atau printer PS. Tambahkan ke versi referensi di bawah ini adalah teka-teki NYT (Dari 5 November 2011) dengan angka dan satu jawaban saya cukup yakin (Sabtu sulit!).

Revisi baru menggunakan dua prosedur ini untuk menjalankan nama sistem yang dikodekan biner dari string.

/.{
    <920>  % two-byte binary-encoded name template with 0x92 prefix
    dup 1 4 3 roll put  % insert number into string
    cvx exec  % and execute it
}def
/${
    //.   %the /. procedure body defined above
    73 .  %"forall" (by code number)
}def

Lekukan dan (agak) berkomentar.

/Times-Roman .3 2 22 1 30
/.{<920>dup 1 4 3 roll put cvx exec}def/${//. 73 .}def
[
/R{99<a51f3e7d75>$}    %currentfile 99 string readline pop 
/G{<1fab75>$ %currentfile token pop 
    R (uN)$ %<754e>$ %pop gsave
    {   
        0 R { 
            1 (X)$ %index
            0 1 -1 5 4 roll
            35 eq{ 
                4<1980>$ %copy rectfill
            }if 
            <81>$ %rectstroke
            1 add 
        }(I)$
        (u)$ % 73 . %forall pop 
        0 -1<ad>$ %translate
    }<834d>$ %repeat grestore
}
/X{{exit}if}
/N{
    -.9 .7<ad>$ %translate
    %{ currentfile token not {exit} if } loop
    {<1fab70>$
        X %{exit}if
    }loop
    {   
        %dup type/integertype ne{exit}if
        {
            (>nk)$ %<3e6e6b>$ %exch neg moveto
            (  )<31a0>$ %cvs show
        }<a3>$ %stopped
        X %{exit}if
    }loop
}
>>
<0d38388b369bad8e>$
%begin dup dup scale div setlinewidth translate selectfont
{G N}exec

File data.

15 15
     #   #     


       #     ##
##   #   #     
    #     #    
   #    #      
       #       
      #    #   
    #     #    
    K#   #   ##
##  I  #       
    L          
    N          
    S#   #     

#i m n   figure(number), row, col
1 1 1
2 1 2
3 1 3
4 1 4
5 1 5
6 1 7
7 1 8
8 1 9
9 1 11
10 1 12
11 1 13
12 1 14
13 1 15
14 2 1
15 2 6
16 2 10
17 3 1
18 4 1
19 4 9
20 5 3
21 5 7
22 5 8
23 5 11
24 5 14
25 5 15
26 6 1
27 6 2
28 6 6
29 6 10
30 6 12
31 7 1
32 7 5
33 7 10
34 7 11
35 8 1
36 8 4
37 8 9
38 9 1
39 9 8
40 9 13
41 10 1
42 10 6
43 10 7
44 10 12
45 11 1
46 11 5
47 11 7
48 11 11
49 12 3
50 12 6
51 12 9
52 12 10
53 12 14
54 12 15
55 13 1
56 13 2
57 13 8
58 14 1
59 15 1
60 15 7
60 15 11

Seharusnya terlihat oke dari printer, tetapi di layar itu butuh sedikit bantuan. Prosedur 19-karakter dan 9 karakter untuk menjalankannya pada semua titik ruang pengguna, membantu membuat garis-garis dengan jarak yang sama terlihat lebih rata. Jadi 308 + 19 + 9 = 337, digunakan untuk menghasilkan gambar ini.

/F{<ac893e893e5f>$} % transform round exch round exch itransform

output teka-teki silang

Catatan tambahan 608

Versi sebelumnya ini (dari revisi 8 ) menggunakan pendekatan yang sama sekali berbeda, menggunakan kembali kode jalur utama sebagai "leksikon" dari mana token yang lebih panjang dapat diindeks menggunakan string.

<<-1{{30 700 translate 0 0 moveto
currentfile 2{(@A1*)*}repeat exch string
3 2 roll{('BO1)*{( )(@#)*
4(,.N:;<%)*<<( ){p}/#{(1:;>%)*}0{(;,'.)*
6 -26(CE%)*}>>(IJ'B)* known not{p
0}if(LG #C)*}forall(#;*1 D%)*}repeat
p/Times-Roman 8 selectfont 99
string{('BO)*{(@)* length(#=)*{p}{(@#L)*
35(=)*{p}{cvx(GID ?'H*ID ?KHF%)*(   )cvs(E)*}e}e}{showpage
exit}e}loop exit{( @#M# FMF#M)*
closepath}currentpoint stroke eq fill
mul dup token copy rmoveto sub show
neg exec add 1 index 9 get rlineto
put readline}loop}0 1 index 0 get{1
index 1 add}forall pop/*{{32 sub load
exec}forall}/e{ifelse}/p{pop}>>begin(23,?4)*<1f>*

Itu ditulis menggunakan versi komentar ini yang menggambarkan pengkodean leksikon. Token pertama 30adalah komentar spacekarena itu ( )*adalah sinonim untuk 30. Tidak terlalu bermanfaat untuk 30, tetapi untuk token yang lebih lama ini adalah kemenangan besar (sampai kemungkinan pengkodean yang lebih dalam ditemukan).

<<-1{{
%space  !    "         # $ %      &           '(        )     %*    +      , - .   %/
 30     700  translate 0 0 moveto currentfile 2{(@A1*)*}repeat exch string 3 2 roll
{('BO1)*{( )(@#)* 4(,.N:;<%)*<<( ){p}/#{(1:;>%)*}0{(;,'.)* 6 -26(CE%)*}>>(IJ'B)*
known not{p 0}if(LG #C)*}forall(#;*1 D%)*}
%0      1   2          3 4          5  6     7
 repeat p /Times-Roman 8 selectfont 99 string{('BO)*{(@)* length(#=)*{p}{
(@#L)* 35(=)*{p}{cvx(GID ?'H*ID ?KHF%)*(   )cvs(E)*}e}e}{showpage clear exit}e}
%8    9   :                         %;            <      =    >    ?
 loop exit{( @#M# FMF#M)* closepath} currentpoint stroke eq fill mul
%@   A     B    C       D   E    F   G    H   I J     K L   M       N   O
 dup token copy rmoveto sub show neg exec add 1 index 9 get rlineto put readline
}loop}0 1 index 0 get{1 index 1 add}forall
pop/*{{32 sub load exec}forall}/e{ifelse}/p{pop}>>begin(23,?4)*<1f>*

1
Anda tidak perlu menyimpan semua versi lama, karena orang-orang dapat mengakses riwayat kiriman jika mereka benar-benar tertarik.
Peter Taylor

Dimengerti Saya akan memangkas sedikit lemak ketika saya memperbarui.
luser droog

Saya telah memposting beberapa versi alternatif di utas ini .
luser droog

Doa bekerja bagaimana?
pengguna tidak dikenal

1
Tampaknya overhead untuk PostScript bergaya golf masih lebih besar dari solusi "tradisional" saya ;-).
Thomas W.

4

C (output ke SVG), 553 karakter

Saya tahu, kodenya sangat besar, tetapi masalah ini hanya menyerukan jawaban SVG.

char*f,b[99];h,w;main(i){fscanf(f=fopen(gets(b),"r"),"%d%d%*[\n]",&h,&w);for(
printf("<svg xmlns='http://www.w3.org/2000/svg' viewBox='.9 .9 %d.2 %d.2'><path d='M1 1",
i=w,h);i--;)printf("v%dv-%dh1",h,h);for(;h--;)printf("v1h-%dh%d",w,w);for(
puts("' style='fill:none;stroke:#000;stroke-width:.04'/><path d='");
fgets(b,99,f);++h)for(i=0;i<w;)b[i++]-35||printf("M%d %dh1v1h-1Z",i,h+2);puts("'/>");
for(f=fopen(gets(b),"r");fgets(b,99,f);)sscanf(b,"%d%d%d",&i,&h,&w)>2&&
printf("<text x='%d.1' y='%d.3' style='font-size:.3px'>%d</text>",w,h,i);puts("</svg>");}

Ketika menjalankannya mendapat dua nama file pada dua baris input standar yang terpisah; pertama file grid, lalu file angka.

Logika yang satu ini sebenarnya cukup sederhana. Format SVG memungkinkannya untuk membuat semua elemen dalam urutan apa pun (alih-alih dari atas ke bawah seperti dengan solusi keluaran ASCII). Ukurannya hampir seluruhnya disebabkan oleh boilerplate SVG.

Namun gambar yang dihasilkan tampak hebat!

Diedit untuk menambahkan: Ini versi yang lebih pendek (517 karakter) yang menghasilkan resolusi tertentu. Ini memungkinkan kode untuk menggunakan lebih banyak pengaturan default, tetapi dengan biaya (menurut saya) yang mahal, SVG tidak lagi secara otomatis mengubah ukuran di browser web Anda.

char*f,b[99];h,w;main(i){fscanf(f=fopen(gets(b),"r"),"%d%d%*[\n]",&h,&w);for(
printf("<svg xmlns='http://www.w3.org/2000/svg'><path d='M1 1",i=w,h);i--;)
printf("v%d0v-%d0h50",h*5,h*5);for(;h--;)printf("v50h-%d0h%d0",w*5,w*5);for(
puts("' style='fill:none;stroke:#000'/><path d='");fgets(b,99,f);++h)
for(i=-1;++i<w;)b[i]-35||printf("M%d1 %d1h50v50h-50Z",i*5,h*5+5);puts("'/>");
for(f=fopen(gets(b),"r");fgets(b,99,f);)sscanf(b,"%d%d%d",&i,&h,&w)>2&&
printf("<text x='%d3' y='%d5'>%d</text>",w*5-5,h*5-4,i);puts("</svg>");}

SVG tampak hebat!
pengguna tidak diketahui

3

Haskell, 328 karakter

import System
main=do(g:d)<-mapM(fmap lines.readFile)=<<getArgs;mapM_ putStrLn$g% \i k->[t|x<-d,y@(c:_)<-x,c/='#',(t,q)<-lex y,w q==i,k<1]
(s:g)%n=[q|(i,x)<-e g,q<-b s:[c['|':f#n[i,j]k|(j,f)<-e x]++"|"|k<-[0..2]]]++[b s]
'#'#_="#####";_#n=take 5$c n++"     ";b n='+':([1..w n!!1]>>"-----+")
e=zip[1..];c=concat;w=map read.words

2

C, 375 karakter

char b[99];g[999],*r=g,*f,i,j,w;main(n){
for(fscanf(f=fopen(gets(b),"r"),"%*d%d%*[\n]",&w);fgets(b,99,f);)
for(i=0;i<w;)*r++=-(b[i++]==35);
for(f=fopen(gets(b),"r");fgets(b,99,f);)
sscanf(b,"%d%d%d",&n,&j,&i)?g[j*w-w+i-1]=n:0;
for(f=g;f<=r;f+=w){for(i=w;i--;)printf(" ----");puts("");
if(f<r)for(j=3;j--;puts("|"))
for(i=0;i<w;printf(~n?n&&j>1?"|%-4d":"|    ":"|////",n))n=f[i++];}}

Dua nama file input dimasukkan pada input standar, masing-masing pada baris terpisah. Grid diberikan dalam ASCII pada output standar. Ya, ini UI yang buruk, tetapi karakter biaya apa pun yang lebih baik. Saya mengambil untuk memohon seperti:

printf "%s\n%s" grid.txt numbering.txt | ./crosswd-render > render.txt

Program harus menangani dengan benar hal-hal seperti baris komentar dalam file penomoran.


*r++-=b[i++]==35( gdiinisialisasi ke nol).
ugoren

for(j=3*(f<r);j--;puts("|"))menghemat if.
ugoren

n&&j>1->j/2*n
ugoren

2

Scala 463, format output: html

object H extends App{val z=readLine.split("[ ]+")map(_.toInt-1)
val d="\t\t<td width='50' height='50'"
println("<html><table border='1'><tr>")
val b=(0 to z(0)).map{r=>readLine}
var c=0
(0 to z(0)).map{
y=>(0 to z(1)).map{
x=>if(b(y)(x)==' '&&((x==0||b(y)(x-1)==35)||(y==0||b(y-1)(x)==35))){
c+=1
println(d+"valign='top'>"+c+"</td>")}
else println(d+{if(b(y)(x)!=' ')"bgcolor='#0'>"else">&nbsp;"}+"</td>")}
println("\t</tr>\n\t<tr>")}
println("</table></html>")
}

Output sampel


Sangat cantik. Outputnya terlihat bagus .
dmckee --- ex-moderator kitten

2

Nota bene (435) (434)

[/r{currentfile 999 string readline pop}/p{pop}/x{exch}/T{translate}/S{scale}/G{gsave}/R{grestore}/_( )>>begin/Courier 1 selectfont 
20 20 S
.05 setlinewidth{r token
p x p
dup 3 x 3 add
T
G G{R
0 -1 T
G
_ 0
r{0 0 1 1
4 index 35 eq{rectfill p}{rectstroke
put
.3 .1 moveto
_ show}ifelse
1 0 T _ 0}forall}repeat
R R
1 -1 S -.9 -.7 T{{r
dup 0 get 35 ne{( )search
p 3 2 roll
cvx exec
G
x
T
.4 -.4 S
0 0 moveto show
p
R}if}loop}stopped}exec

Batalkan golf dengan data:

%!
<<
  /r{currentfile 999 string readline pop}
  /p{pop}
  /x{exch}
  /T{translate}
  /S{scale}
  /G{gsave}
  /R{grestore}
  /_( )
>>begin
/Courier 1 selectfont
% In theory, 20 20 scale isn't needed, 
% but it would make the whole thing very tiny when printed
% (on screen it doesn't matter too much, it can be zoomed)
20 20 S
.05 setlinewidth
{ % exec
% Read number of lines
r token                          % restString numberOfLines true
% Discard rest of line (Contains number of columns.
% It becomes clear implicitly from number of letters in a line of grid definition)
p x p                            % numberOfLines
% Move to where the top line starts
dup 3 x 3 add                    % numberOfLines x y
T                                % numberOfLines
G G
{ %repeat
  R
  % Move to next line
  0 -1 T
  G
  _ 0
  r                              % ( ) 0 line
  { %forall                      % ( ) 0 char
    0 0 1 1                      % ( ) 0 char 0 0 x y
    % Check whether char is a hash
    4 index 35 eq{ %ifelse
      4 copy rectfill
    }if
    rectstroke                   % ( ) 0 char
    put                          % -/-
    .3 .1 moveto
    _ show
    1 0 T
    _ 0                          % ( ) 0
  }forall                        % 
}repeat
R R
% Now, render the numbers according to the numbering definitions
1 -1 S -.9 -.7 T
{{
  r
  %Check whether this is a comment
  dup 0 get 35 ne{               % line
    % Split at the first tab
    %TODO: Ust tab instead of space
    ( )search                    % (y x) tab number true
    p 3 2 roll                   % tab number (y x)
    cvx exec                     % tab number y x
    G
    x                            % tab number x y
    T                            % tab number
    .4 -.4 S
    0 0 moveto show              % tab
    % This pop can be eliminated in theory to save two characters,
    % but the operand stack will continue to grow
    p
    R
  }if
}loop}stopped
}exec
15 15
     #   #     


       #     ##
##   #   #     
    #     #    
   #    #      
       #       
      #    #   
    #     #    
    K#   #   ##
##  I  #       
    L          
    N          
    S#   #     
#i m n   figure(number), row, col
1 1 1
2 1 2
3 1 3
4 1 4
5 1 5
6 1 7
7 1 8
8 1 9
9 1 11
10 1 12
11 1 13
12 1 14
13 1 15
14 2 1
15 2 6
16 2 10
17 3 1
18 4 1
19 4 9
20 5 3
21 5 7
22 5 8
23 5 11
24 5 14
25 5 15
26 6 1
27 6 2
28 6 6
29 6 10
30 6 12
31 7 1
32 7 5
33 7 10
34 7 11
35 8 1
36 8 4
37 8 9
38 9 1
39 9 8
40 9 13
41 10 1
42 10 6
43 10 7
44 10 12
45 11 1
46 11 5
47 11 7
48 11 11
49 12 3
50 12 6
51 12 9
52 12 10
53 12 14
54 12 15
55 13 1
56 13 2
57 13 8
58 14 1
59 15 1
60 15 7
60 15 11

Luar biasa. Saya benar-benar perlu memanfaatkannya dengan lebih baik stopped. ... Aku akan membiarkan karunia terbuka selama sehari atau lebih untuk menarik perhatian.
luser droog

1

Catatan tambahan, bukan kombatan.

Terinspirasi (lagi-lagi) oleh pertanyaan terkait Anda pada SO , saya telah membuat versi referensi di Postscript menggunakan file-IO. Ini juga menciptakan font lebar tetap yang diturunkan sehingga data kisi dilewatkan begitu saja show. adalah kotak kosong dan #kotak diisi. Karakter ascii lainnya digambar sebagai mesin terbang Times-Roman kecil yang dikelilingi oleh sebuah kotak.

Program ini memanfaatkan fitur ghostscript yang mungkin tidak ada di semua penerjemah Postscript. Jika ghostscript dipanggil dengan --opsi, itu meneruskan argumen baris perintah ke program postscript dalam array string bernama / ARGUMENTS. Jadi, Anda perlu menjalankan program seperti ini gs -- xw-io.ps grid-file number-file.

%!

ARGUMENTS{}forall
/numfile exch (r) file def
/gridfile exch (r) file def

/q{0 0 moveto 1 0 lineto 1 1 lineto 0 1 lineto closepath}def
/X<</FontType 3/FontBBox[0 0 1 1]/FontMatrix[1 0 0 1 0 0]
    /Encoding StandardEncoding
    /BuildChar{
        1 0 0 0 1 1 setcachedevice
        .001 setlinewidth
        q stroke
        dup 35 eq { pop
            q fill
        }{
            .3 .1 moveto
            .1 .1 scale
            /Times-Roman 8 selectfont
            (?)dup 0 4 3 roll put show
        }ifelse pop}
>>definefont pop /X 30 selectfont
40 700 moveto {
    gridfile 2{dup token pop exch}repeat pop pop
    {
        gridfile =string readline{
            dup length 0 ne{
                show currentpoint exch pop 30 sub 40 exch moveto
            }{clear exit}ifelse
        }{clear exit}ifelse
    }loop
    /Times-Roman 8 selectfont
    {
        40 700 moveto
        numfile =string readline{
            dup length 0 ne{
                dup 0 get 35 ne{
                    cvx exec
                    1 sub 30 mul 2 add exch
                    1 sub -30 mul 22 add rmoveto
                    (   )cvs show
                }{clear}ifelse
            }{clear}ifelse
        }{clear exit}ifelse
    }loop showpage
}exec

Tampak hebat. Seberapa besar itu? Saya menghitung 1247 karakter. Tapi itu bisa golf - bukan? Terjemahan sederhana 4 blanks => 1 tab mengarah ke 980 karakter, menghilangkan semua tab menjadi 891.
pengguna tidak diketahui

Karena semua kata khusus yang diperlukan untuk membuat font, yang ini tidak dapat dibuat lebih kecil dari jawaban postscript saya yang lain.
luser droog
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.