ซอฟต์แวร์รวบรวมข้อมูล Dungeon


40

อินพุต

  • เมทริกซ์ไบนารีMแสดงถึงผนังของดันเจี้ยน
  • ตำแหน่ง(x,Y)ของผู้เล่นในดันเจี้ยน
  • ทิศทางdที่ผู้เล่นกำลังเผชิญ (0 = ทิศเหนือ, 1 = ทิศตะวันออก, 2 = ทิศใต้, 3 = ทิศตะวันตก)

เอาท์พุต

การนำเสนอหลอกแบบ 3 มิติของกำแพงที่อยู่ในมุมมองของผู้เล่นในฐานะศิลปะ ASCII ที่มีอักขระ30×10ตัว

ด้านล่างนี้เป็นเฟรมเอาต์พุตจำนวนมากที่เป็นไปได้พร้อมกับแผนที่และเข็มทิศที่สอดคล้องกันเพื่อช่วยให้แขวนได้ (แต่การวาดแผนที่และเข็มทิศไม่ใช่ส่วนหนึ่งของความท้าทาย)

ภาพเคลื่อนไหว

สเปค

สาขาดู

ผู้เล่นที่มี13ผนังในด้านของเขาในมุมมองที่มีป้ายกำกับจากเพื่อM ด้านล่างคือตำแหน่งของกำแพงที่สัมพันธ์กับผู้เล่น (เป็นสีเหลือง) ในทุกทิศทางที่เป็นไปได้AM

สาขาดู

การวาดกำแพง

ผนังควรถูกดึงจากAถึงMตามลำดับที่แน่นอนนี้เนื่องจากส่วนใดส่วนหนึ่งที่วาดไว้ก่อนหน้านี้อาจถูกเขียนทับโดยกำแพงที่อยู่ใกล้กว่า แน่นอนว่าคุณสามารถนำไปใช้งานต่างกันได้ตราบใดที่ผลลัพธ์สุดท้ายยังเหมือนเดิม

การส่งออกทั้งหมดจะถูกวาดด้วย 7 ตัวอักษรที่แตกต่าง: " ", "'", ".", "|", "-", และ"_"":"

เนื่องจากรายละเอียดรูปร่างของผนังในเนื้อความของความท้าทายนี้จะทำให้มันยาวเกินไปพวกมันจึงถูกจัดเตรียมไว้ในลิงค์ TIO ต่อไปนี้:

ลองออนไลน์!

อักขระที่ไม่ได้เป็นส่วนหนึ่งของกำแพงที่ระบุจะถูกทำเครื่องหมายด้วย"?"ในแผนภาพเหล่านี้ พวกเขาจะต้องถือว่าเป็นตัวอักษร 'โปร่งใส' ที่ไม่ได้วาดเลย ในทางกลับกันช่องว่างทั้งหมดภายในกำแพงเป็น 'ทึบ' และต้องเขียนทับตัวละครอื่น ๆ ที่อาจถูกวาดไว้ก่อนหน้านี้

กฎระเบียบ

เกี่ยวกับอินพุต

  • คุณอาจใช้M , x , Yและdในรูปแบบที่เหมาะสม
  • คุณสามารถใช้พิกัด 0 ดัชนีหรือดัชนี 1 ดัชนีก็ได้
  • คุณสามารถใช้ค่าที่แตกต่างกัน 4 ค่าสำหรับเส้นทาง
  • เมทริกซ์รับประกันได้ว่าจะมีอย่างน้อย3×3 3
  • คุณอาจคิดว่าจะมีกำแพงล้อมรอบอยู่เสมอบนขอบ
  • ผู้เล่นรับประกันว่าจะอยู่ในตารางที่ว่างเปล่า
  • อินพุตรับประกันว่าถูกต้อง

เกี่ยวกับผลลัพธ์

  • ผนังจะต้องวาดตรงตามที่อธิบายไว้
  • อย่างไรก็ตามรูปแบบผลลัพธ์มีความยืดหยุ่นเช่นสตริงเดี่ยวอาร์เรย์ของสตริงเมทริกซ์ของอักขระ ฯลฯ
  • ช่องว่างนำหน้าและต่อท้ายเป็นที่ยอมรับตราบใดที่ยังสอดคล้องกัน

นี่คือรหัสกอล์ฟ

กรณีทดสอบ

กรณีทดสอบทั้งหมดใช้เมทริกซ์ต่อไปนี้:

[ [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ],
  [ 1, 0, 1, 1, 1, 0, 0, 0, 0, 1 ],
  [ 1, 0, 1, 0, 1, 0, 0, 1, 0, 1 ],
  [ 1, 0, 0, 0, 0, 0, 1, 1, 0, 1 ],
  [ 1, 0, 0, 1, 0, 0, 0, 1, 0, 1 ],
  [ 1, 0, 0, 1, 1, 0, 1, 1, 0, 1 ],
  [ 1, 1, 1, 1, 0, 0, 0, 0, 0, 1 ],
  [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ],
  [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ] ]

(0,0)

x=3, y=3, d=0
x=6, y=4, d=3
x=4, y=4, d=1
x=1, y=5, d=2
x=7, y=7, d=3
x=6, y=6, d=1
x=8, y=1, d=2
x=7, y=6, d=1

ผลลัพธ์ที่คาดหวัง:

------------------------------    ------------------------------
 x=3, y=3, d=0:                    x=6, y=4, d=3:
------------------------------    ------------------------------
__                          __    '.                          .'
  |'.                    .'|        |                        |  
  |   '.--------------.'   |        |----.                   |  
  |    |              |    |        |    | '.--------.       |  
  |    |              |    |        |    |  |        |       |  
  |    |              |    |        |    |  |        |       |  
  |    |              |    |        |    | .'--------'       |  
  |   .'--------------'.   |        |----'                   |  
__|.'                    '.|__      |                        |  
                                  .'                          '.
------------------------------    ------------------------------
 x=4, y=4, d=1:                    x=1, y=5, d=2:
------------------------------    ------------------------------
                            .'    __ ________________________ .'
                           |        |                        |  
-------.              .----|        |                        |  
       | '.--------.' |    |        |                        |  
       |  |        |  |    |        |                        |  
       |  |        |  |    |        |                        |  
       | .'--------'. |    |        |                        |  
-------'              '----|        |                        |  
                           |      __|________________________|  
                            '.                                '.
------------------------------    ------------------------------
 x=7, y=7, d=3:                    x=6, y=6, d=1:
------------------------------    ------------------------------
'.                                '.                            
  |'.                               |'.                         
  |   '.                            |   '.                      
  |    | '.                 .-      |    |--.--------.--------.-
  |    |  |:               :|       |    |  |        |        | 
  |    |  |:               :|       |    |  |        |        | 
  |    | .'                 '-      |    |--'--------'--------'-
  |   .'                            |   .'                      
  |.'                               |.'                         
.'                                .'                            
------------------------------    ------------------------------
 x=8, y=1, d=2:                    x=7, y=6, d=1:
------------------------------    ------------------------------
'.                          __    '.                            
  |'.                    .'|        |                           
  |   '.              .'   |        |----.--------------.-------
  |    | '.        .' |    |        |    |              |       
  |    |  |:      :|  |    |        |    |              |       
  |    |  |:      :|  |    |        |    |              |       
  |    | .'        '. |    |        |    |              |       
  |   .'              '.   |        |----'--------------'-------
  |.'                    '.|__      |                           
.'                                .'                            

ความท้าทายที่เกี่ยวข้อง:

ความท้าทายในปี 2556นี้มีความเกี่ยวข้องอย่างใกล้ชิด แต่มันมีเกณฑ์การชนะที่แตกต่างกัน (การท้าทายรหัส) ซึ่งเป็นข้อมูลจำเพาะที่หลวมมากของเอาต์พุตและต้องใช้ I / O แบบโต้ตอบ


สิ่งนี้ทำให้ฉันนึกถึง 3D Monster Maze ทันทีแม้ว่ามันจะใช้กราฟิกบล็อกแน่นอน
Neil

9
ความท้าทายของคุณนั้นสนุกและเขียนได้ดีมาก!
Oliver

กำลังรอทางออกใน Minecraft ...

ใครบ้างที่จำโปรแกรมรักษาหน้าจอของ windows? มันช่างเป็นเกมที่สนุกเมื่อตอนที่ฉันอายุ 5 หรือ 6 ปี ...
Magic Octopus Urn

คำตอบ:


10

ทำความสะอาด (พร้อมSnappy ), 800 785 670 644 ไบต์

รหัส 460 402 ไบต์ + 360สตริงตัวอักษร 242- ไบต์
(หนีออกจากที่นี่และบน TIO เพราะไม่ถูกต้อง UTF-8)

คุณสามารถตรวจสอบความยาวของตัวอักษรที่นี่

import StdEnv,Data.List,Data.Maybe,Codec.Compression.Snappy,Text
@a b|b<'~'=b=a
$m x y d=map(@' ')(foldl(\a b=[@u v\\u<-a&v<-b])['~~'..][join['
']k\\Just(Just 1)<-[mapMaybe(\e=e!?(x+[u,v,~u,~v]!!d))(m!?(y+[~v,u,v,~u]!!d))\\u<-[-2,2,-1,1,0,-1,1,0,-1,1,0,-1,1]&v<-[3,3,3,3,3,2,2,2,1,1,1,0,0]]&k<-nub[q\\w<-split"#"(snappy_uncompress"\211\6\44\41\41\41\55\56\40\41\40\174\72\5\4\60\55\47\40\41\41\41\43\41\41\41\176\56\55\r\1\24\56\40\41\176\174\40\r\1\4\174\72\72\r\0\0\47\r\46\35\72\25\1\31\103\0\41\25\24\35\113\176\25\0\31\133\11\224\r\152\20\56\40\40\40\41\21\217\10\40\47\56\31\14\4\40\174\126\14\0\4\56\47\21\74\0\47\1\74\1\340\r\220\25\242\11\1\25\250\25\360\11\1\25\253\376\30\0\21\30\25\333\11\1\24\47\41\41\43\137\137\11\154\20\41\40\40\174\47\r\344\1\157\5\341\1\11\5\336\172\11\0\34\56\47\41\137\137\174\56\47\1\347\20\43\176\176\40\137\132\1\0\4\40\41\75\211\76\1\0\1\356\5\150\116\1\0\376\35\0\376\35\0\126\35\0\132\347\0\20\137\174\41\43\47\101\337\51\74\41\133\122\4\0\10\56\47\40"),q<-let l=[[c\\c<-:rpad s 30'~']\\s<-split"!"w]in[l,map reverse l]]])

ลองออนไลน์!

การบีบอัดเร็วเร็ว ๆ นี้ทำได้ค่อนข้างดีในกรณีนี้แม้จะมีการโฟกัสด้วยความเร็ว

สตริงที่ไม่บีบอัด ( #แทนที่ด้วย\nเพื่อความชัดเจน) คือ:

!!!-. ! |:! |:!-' !!!
!!!~.--------. !~|        |:!~|        |:!~'--------' !!!
!!!~~~~~~~~~~.--------.!~~~~~~~~~~|        |!~~~~~~~~~~|        |!~~~~~~~~~~'--------'!!!
!!-------.   !       | '.!       |  |!       |  |!       | .'!-------'   !!
!!~~~~~~~.--------------.!~~~~~~~|              |!~~~~~~~|              |!~~~~~~~|              |!~~~~~~~|              |!~~~~~~~'--------------'!!
__      !  |'.   !  |   '.!  |    |!  |    |!  |    |!  |    |!  |   .'!__|.'   !
~~ ________________________ !~~|                        |!~~|                        |!~~|                        |!~~|                        |!~~|                        |!~~|                        |!~~|                        |!~~|________________________|!
'. !  |!  |!  |!  |!  |!  |!  |!  |!.' 

สิ่งนี้เข้ารหัสเวอร์ชันหน้าจอด้านซ้ายของส่วนประกอบหน้าจอที่แตกต่างกันด้วย!แทนที่จะขึ้นบรรทัดใหม่และ~แทนที่?ซึ่งจะเสริมด้วย~อักขระ 30 ตัวให้เหมาะสมก่อนที่จะมีตัวเองและเพิ่มการย้อนกลับบรรทัดลงในรายการค้นหา

ส่วนที่เหลือของรหัสเพียงจัดการการค้นหาพิกัดโดยไม่สนใจเคสที่ไม่อยู่ในขอบเขต


5

Python 2 , 864 854 848 826 810 ไบต์

L=[zip(*[iter(w)]*30)for w in zip(*[iter("eJzdllESgyAMRL+5Rf7yRQ7AZbhIDl9BwTqzSVtHrbKffR0Mm13HEM5SFHIoadpNI3snDyaS6NCknhU+JfZOvq8kLoIBU1oEI+RTbiePGzBa3QM0rf78TGl17+CZr5ZrUXBN+ECfY1GvGKEqtDsSI4s6xTn5jgqyqNcTTnUjTQO2FAEqTC0ngCrtpywenX5le6or1SsGi9ZLBKt0HuXtVEeUNGdzG6EsRNmo2EzLxuBbqFH8njmfwnqGcl+VY+s5+5ezSYXVel4dxaRK/6F15SatK1frvm//y4aoT4Ckj6XWfY2cbvz2fLSCPiiVvR+3ZuerzDwPSqeSvgAP9woa".decode('base64').decode('zip'))]*300)]
E=enumerate
def f(m,x,y,d):
 D=eval(`[[' ']*30]*10`);w,h=len(m[0]),len(m);a=[m,zip(*m)[::-1]][d%2];x,y=[x,y,w+~x,h+~y,y,w+~x,h+~y,x][d::4];X=sum([[0]*(x<2)+list(l)[x-2+(x<2):x+3]for l in[l*2for l in[a,[l[::-1]for l in a[::-1]]][d/2]*2][y:y+4]],[])
 for d,w in zip(L,'sropqmklhfgca'):
  for j,l in E(d):
   for i,q in E(l):
    if q*X[ord(w)%32]>=' ':D[j][i]=q
 for l in D:print''.join(l)

ลองออนไลน์!


4

Charcoal , 500 332 ไบต์

F⁴≔⮌E§θ⁰⁺00⭆θ§μλθ≔E✂θ⊖ζ⁺⁶ζ¹✂ι⊖η⁺⁶η¹θFε≔⮌E§θ⁰⭆θ§μλθB³⁰χ F²«‖FΦ⪪⟦“ |0⟧P+N?⟧‹G”³¦⁰”{➙d⊟EX⍘k↧D({Vt⍘gRd◨ⅉ^δ#T;”³¦¹“ ¶↖+9G₂pF^c1e⌈¬;”³χω⁰χ”{➙∧⊟∧◨ηü∧↖z↨⁸\G'λI∧¡∕⪫θJoΣ³⊖I⊟ζ⊙”²¦⁰”{➙∧⊟∧◨ηü∨§·◧﹪d‹⟲ OzºκFⅉRï⎇”²¦⁷ω⁰χ”{➙∧⊟≔⊘⬤|↔3Zθ✂≔÷t⍘ε✂↨≔⧴×ld≕≡⌕m⟧6ψ=Z”⁰¦⁰”}∧80KυgCAêJm⟦↘/§‖Ck⮌C₂¡μ↗W”⁰¦²ω⁰χ”{⊟∨·◧¤∨¶⧴⬤2GL▷⁸ê5Gψ”⁰¦⁰⟧³I§⭆θ⭆³§μ⎇ι⊕ξ⁻⁵ξλ«J⁻⊟κײ⁹¬ι⊟κ⊟κ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด วิธีการที่น่าเบื่อฉันกลัว การพิมพ์ตัวอักษรสตริงที่บีบอัดจำนวนมาก คำอธิบาย:

F⁴≔⮌E§θ⁰⁺00⭆θ§μλθ

รองแถวด้วยสอง0s พิเศษในแต่ละด้าน

≔E✂θ⊖ζ⁺⁶ζ¹✂ι⊖η⁺⁶η¹θ

แบ่ง7x7ส่วนย่อยของอาร์เรย์ที่กึ่งกลางของพิกัดที่กำหนด

Fε≔⮌E§θ⁰⭆θ§μλθ

หมุนอาร์เรย์ตามความเหมาะสมสำหรับทิศทางที่กำหนด

B³⁰χ 

(ช่องว่างบันทึกย่อ) วาด30×10กล่องเปล่าเพื่อให้เอาต์พุตมีขนาดที่สอดคล้องกันเสมอ

F²«‖

วาดแต่ละครึ่งแยกจากกัน

FΦ⪪⟦...⟧³I§⭆θ⭆³§μ⎇ι⁻⁵ξ⊕ξλ«

ใช้อาร์เรย์ของตัวอธิบายผนังแบ่งเป็นชิ้นส่วนของ (สตริง, พิกัด y, พิกัด x), กรองชิ้นเหล่านั้นที่มีผนังที่ตำแหน่งที่เกี่ยวข้องในครึ่งที่เกี่ยวข้องของอาร์เรย์และวนข้ามผนัง ตำแหน่งจะคำนวณโดยการแยก 12 กำแพงออกจากอาร์เรย์และทำดัชนีโดยใช้ดัชนีอันเนื่องจากนักกอล์ฟจะดีกว่าการหาผนังโดยตรงโดยใช้ดัชนีอัน

J⁻⊟κײ⁹¬ι⊟κ⊟κ

ข้ามไปที่พิกัดของกำแพงและพิมพ์ โปรดทราบว่าการสะท้อนให้เห็นถึงการลบพิกัด X จาก[0, 30)เป็น(-30, 0]หนึ่งครั้งผ่านผืนผ้าใบจะเปลี่ยน 29 ตัวอักษรไปทางซ้ายอย่างมีประสิทธิภาพ


1
@Annauld แน่นอนฉันไม่ได้ใช้ประโยชน์จากความสมมาตรเลยฉันควรจะตัดออกเป็นสามส่วนด้วยการวาดแต่ละครึ่งแยกกัน
Neil

1
+1 สำหรับการตีกอล์ฟ 168 ไบต์ ฉันคิดว่ามันเป็นสนามกอล์ฟเดี่ยวที่ใหญ่ที่สุดที่ฉันเคยเห็นที่นี่
ElPedro

2

Ruby , 412 391 385 383 ไบต์

->a,x,y,d{b=Array.new(97){[" "]*10}
e=[-1,0,1,0]
14.times{|i|m=-i%3-1
w=[31,25,15,9][n=i>2?4-i/3:(m*=2;3)]
(a*3)[y+n*e[d]+m*c=e[d-3]][x+n*c-m*e[d]]&&[p=w*(m*2-1)/2,r=[12,7,4,3][n]*m*m.abs+m/3].min.upto([q=w*(m*2+1)/2,r].max){|j|t=" .'"*9
b[j+15]=(p<j&&j<q ?%w{-%2s- -%4s- _%7s_}[-n]%"":t[k=(j^j>>9)%(36/-~n)]+"   :|  |    |"[k%13]*(k/3*2)+t[-k]).center(10).chars}}
b[0,30].transpose}

ลองออนไลน์!

รับอินพุตเป็นอาร์เรย์ของค่าความจริง / ค่าเท็จ (หมายเหตุ0คือความจริงในทับทิม แต่nilเป็นเท็จ)

ส่งออกอาร์เรย์ของตัวละคร

คำอธิบาย

บล็อกจะถูกลากไปข้างหลังโดยมีระยะทางnลดลงและตำแหน่งจากด้านหนึ่งไปอีกด้านหนึ่งวนไปmทาง-1,1,0ซ้าย, ขวา, กลาง ตรงกลางบล็อก E ในแถวที่ไกลที่สุดนั้นจะถูกวาดสองครั้งเพราะเราต้องตรวจสอบทั้งบล็อก A / B และบล็อก C / D n,mและdถูกนำมาใช้ในการปรับเปลี่ยนxและการค้นหาค่าอาร์เรย์y aหากไม่xอยู่ในช่วงnilถูกส่งคืนสำหรับเซลล์นอกช่วงและไม่มีข้อผิดพลาดเกิดขึ้น แต่หากyอยู่นอกช่วงnilจะถูกส่งคืนสำหรับแถวและ Ruby จะส่งข้อผิดพลาดประเภทเมื่อพยายามค้นหาเซลล์ เพื่อหลีกเลี่ยงปัญหานี้อาร์เรย์จะเพิ่มขึ้นสามเท่าในทิศทางแนวตั้งก่อนการค้นหา หากพบค่าความจริงบล็อกจะถูกวาดขึ้น

เอาต์พุตถูกสร้างในอาร์เรย์bของอาร์เรย์10 องค์ประกอบที่แทนคอลัมน์ของเอาต์พุตและถูกเปลี่ยนเป็น 10 แถวที่ส่วนท้ายของฟังก์ชัน ด้านหน้าเต็มของบล็อกทั้งหมดถูกดึง (ไม่ว่าจะปรากฏในวิวพอร์ตหรือไม่ก็ตาม) ดังนั้นจึงจำเป็นต้องใช้พื้นที่เพิ่มเติมในอาเรย์เพื่อหลีกเลี่ยงข้อผิดพลาดในช่วง ช่วงของjค่าในวิวพอร์ตจาก-15การ+14นี้จะชดเชยโดย 15 เมื่อมีการบันทึกไปยังอาร์เรย์ที่จะให้ช่วงของการ0 29สำหรับแต่ละค่าที่มีการคำนวณสามบล็อกจะถูกคำนวณ: pและqสำหรับมุมซ้ายและขวาของผนังด้านหน้าตามลำดับและrสำหรับด้านหลังของผนังด้านข้าง jถูกทำซ้ำจากค่าต่ำสุดไปจนถึงค่าสูงสุดทั้งสามค่าที่วาดคอลัมน์

เส้นมี 3 ประเภทคือแนวนอน-หรือ_แนวตั้ง|หรือ:และแนวทแยงที่มี" .'"ลวดลายซ้ำ ตำแหน่งที่p < j < qคอลัมน์ที่มีช่องว่างต่อท้ายด้วย-หรือ_วาดเพื่อสร้างรูปหน้า ที่อยู่jนอกช่วงนี้คอลัมน์ที่มีช่องว่าง|หรือ:ถูกขีดด้วยสัญลักษณ์จากt=" .'"เพื่อจัดรูปแบบขอบและ / หรือใบหน้าด้านข้าง นี่คือการจัดการโดยตัวแปรk=jที่jเป็นบวกหรือk=-j-1ที่jเป็นลบ k/3*2จำนวนตัวอักษรระหว่างด้านบนและด้านล่างหมวกคือ เพื่อจัดการกับขอบด้านนอกของบล็อกที่อยู่ไกลที่สุดn=3,kจะต้องดำเนินการแบบโมดูโล 9 แต่ต้องไม่ทำเพื่อค่าขนาดเล็กn. kจึงจะได้รับการโมดูโล36/-~nที่ประเมิน-~nn+1

รหัสไม่ได้รับการตอบ

->a,x,y,d{
  b=Array.new(97){[" "]*10}                                        #Set up array for output, allow space for plotting outside viewport
  e=[-1,0,1,0]                                                     #Direction offsets from player position
  14.times{|i|                                                     #Iterate through all blocks including block E twice 
    m=-i%3-1                                                       #Cycle -1,1,0 = left, right, centre
    n=i>2?4-i/3:(m*=2;3)                                           #Distance n=4-i/3. But if i/3==0 n=3 and double m for blocks A,B 
    w=[31,25,15,9][n]                                              #Width of front face of block
    r=[12,7,4,3][n]*m*m.abs+m/3                                    #Value of j for back edge of block. m/3 offsets by -1 when m negative 
    (a*3)[y+n*e[d]+m*c=e[d-3]][x+n*c-m*e[d]]&&(                    #If a block is present at the location then
      [p=w*(m*2-1)/2,r].min.upto([q=w*(m*2+1)/2,r].max){|j|        #Calculate left and right edges of front of block p,q and iterate
        t=" .'"*9                                                  #t=character constant for diagonal lines 
        k=(j^j>>9)%(36/-~n)                                        #k=j for positive j=distance from centre. For negative j, k=-1-j by XOR with j>>9=-1. If n=3 take modulo 9 for correct output of outer side of block. 
        b[j+15]=(p<j&&j<q ?%w{-%2s- -%4s- _%7s_}[-n]%"":           #If j between p&q, draw horizontal lines separated by 2,4 or 7 spaces depending on value of n
        t[k]+"   :|  |    |"[k%13]*(k/3*2)+t[-k]).center(10).chars #else draw space or vertical line capped by diagonal markers
      }
    )
  }
b[0,30].transpose}                                                 #Truncate values outside viewport, transpose, and return value.

คำตอบที่ดี! ฉันชอบวิธีที่ทุกบรรทัดถูกสร้างขึ้นโดยทางโปรแกรมรวมถึงเส้นทแยงมุม
Arnauld
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.