วาดการไล่ระดับสีในศิลปะ ASCII


41

คำอธิบายงาน:

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

การไล่ระดับสีจะเป็นเซลล์ขนาด 70 × 25 อักขระโดยมีข้อกำหนดดังต่อไปนี้

  • มุมซ้ายบนของตารางมีพิกัด (0, 0)
  • การไล่ระดับสีประกอบด้วยตัวอักษรให้เป็นแมปออกเป็น 35 หน่วยความยาว หน่วยความยาวคือหนึ่งอักขระสูงและกว้างสองอักขระ (เนื่องจากmonospaced fontsมักจะมีอักขระสูงเป็นสองเท่าตามที่กว้าง)
  • ภายใน 35 LU เหล่านั้นระยะทางปัจจุบันจากจุดกึ่งกลางจะถูกคูณด้วยจำนวนตัวไล่ระดับสี / 35เพื่อให้ดัชนีของตัวละครวาดที่จุดนั้น ตัวเลขเศษส่วนสำหรับดัชนีจะถูกปัดเศษเป็นศูนย์ที่นี่ หน่วยความยาวจะถูกทิ้งให้เป็นจำนวนจริง (แน่นอนถ้าผลลัพธ์เหมือนกันการใช้งานไม่สำคัญ)
  • นอกเหนือจาก 35 LU เหล่านั้นจะมีเพียงตัวไล่ระดับสีตัวสุดท้ายที่ปรากฏขึ้น อย่างไรก็ตามเนื่องจากแถบ«ไล่ระดับสีล่าสุด»เริ่มขึ้นแล้วภายใน 35 LU อักขระตัวสุดท้ายจึงเริ่มปรากฏขึ้นเมื่อไม่ถึง 35 LU แล้ว

การป้อนข้อมูล:

อินพุตถูกกำหนดให้กับอินพุตมาตรฐานและประกอบด้วยสามบรรทัดแต่ละบรรทัดถูกยกเลิกโดยตัวแบ่งบรรทัด:

  • xพิกัดของจุดศูนย์การไล่ระดับสี
  • Yพิกัดของจุดศูนย์การไล่ระดับสี
  • อักขระที่ใช้สำหรับการวาดการไล่ระดับสี สิ่งเหล่านั้นอาจรวมถึงช่องว่าง

เอาท์พุท:

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

ตัวอย่างอินพุต 1:

58
14
 .:;+=xX$&

ตัวอย่างผลลัพธ์ 1:

&&$$$$$$$$XXXXXXXXxxxxxxxxx===========++++++++++++++++++++++++++++++++
&$$$$$$$$XXXXXXXXxxxxxxxxx=========+++++++++++++;;;;;;;;;;;;;;;;;;;;;+
$$$$$$$$XXXXXXXXxxxxxxxx=========+++++++++++;;;;;;;;;;;;;;;;;;;;;;;;;;
$$$$$$$XXXXXXXXxxxxxxxx========++++++++++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$$$$$$XXXXXXXXxxxxxxxx========+++++++++;;;;;;;;;;;;;:::::::::::::;;;;;
$$$$$XXXXXXXXxxxxxxxx=======+++++++++;;;;;;;;;;;:::::::::::::::::::::;
$$$$$XXXXXXXxxxxxxxx=======+++++++++;;;;;;;;;:::::::::::::::::::::::::
$$$$XXXXXXXXxxxxxxx=======++++++++;;;;;;;;;:::::::::::::::::::::::::::
$$$$XXXXXXXxxxxxxx========+++++++;;;;;;;;::::::::::...............::::
$$$XXXXXXXXxxxxxxx=======+++++++;;;;;;;;:::::::::...................::
$$$XXXXXXXxxxxxxx=======++++++++;;;;;;;::::::::.......................
$$$XXXXXXXxxxxxxx=======+++++++;;;;;;;::::::::.........       ........
$$$XXXXXXXxxxxxxx=======+++++++;;;;;;;:::::::........           ......
$$$XXXXXXXxxxxxxx=======+++++++;;;;;;;:::::::.......             .....
$$$XXXXXXXxxxxxxx=======+++++++;;;;;;;:::::::.......             .....
$$$XXXXXXXxxxxxxx=======+++++++;;;;;;;:::::::.......             .....
$$$XXXXXXXxxxxxxx=======+++++++;;;;;;;:::::::........           ......
$$$XXXXXXXxxxxxxx=======+++++++;;;;;;;::::::::.........       ........
$$$XXXXXXXxxxxxxx=======++++++++;;;;;;;::::::::.......................
$$$XXXXXXXXxxxxxxx=======+++++++;;;;;;;;:::::::::...................::
$$$$XXXXXXXxxxxxxx========+++++++;;;;;;;;::::::::::...............::::
$$$$XXXXXXXXxxxxxxx=======++++++++;;;;;;;;;:::::::::::::::::::::::::::
$$$$$XXXXXXXxxxxxxxx=======+++++++++;;;;;;;;;:::::::::::::::::::::::::
$$$$$XXXXXXXXxxxxxxxx=======+++++++++;;;;;;;;;;;:::::::::::::::::::::;
$$$$$$XXXXXXXXxxxxxxxx========+++++++++;;;;;;;;;;;;;:::::::::::::;;;;;

ตัวอย่างอินพุต 2:

0
0
X.X.X.X

ตัวอย่างผลลัพธ์ 2:

XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX
XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX
XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX
XXXXXXXX............XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX
XXXXXX.............XXXXXXXXXX...........XXXXXXXXXX..........XXXXXXXXXX
..................XXXXXXXXXXX..........XXXXXXXXXX...........XXXXXXXXXX
................XXXXXXXXXXXX...........XXXXXXXXXX..........XXXXXXXXXXX
...............XXXXXXXXXXXX...........XXXXXXXXXX...........XXXXXXXXXXX
............XXXXXXXXXXXXXX...........XXXXXXXXXXX..........XXXXXXXXXXXX
.........XXXXXXXXXXXXXXX............XXXXXXXXXXX...........XXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXX............XXXXXXXXXXX...........XXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXX.............XXXXXXXXXXX...........XXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXX..............XXXXXXXXXXXX...........XXXXXXXXXXXXXXX
XXXXXXXXXXXXXXX................XXXXXXXXXXXX............XXXXXXXXXXXXXXX
XXXXXXXXXXX..................XXXXXXXXXXXXX............XXXXXXXXXXXXXXXX
...........................XXXXXXXXXXXXX............XXXXXXXXXXXXXXXXXX
........................XXXXXXXXXXXXXXX............XXXXXXXXXXXXXXXXXXX
......................XXXXXXXXXXXXXXX.............XXXXXXXXXXXXXXXXXXXX
..................XXXXXXXXXXXXXXXXX.............XXXXXXXXXXXXXXXXXXXXXX
.............XXXXXXXXXXXXXXXXXXXX..............XXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...............XXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXX...............XXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX.................XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX...................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXX......................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

ตัวอย่างอินพุต 3:

70
25
.:+#

ตัวอย่างผลลัพธ์ 3:

######################################################++++++++++++++++
#################################################+++++++++++++++++++++
#############################################+++++++++++++++++++++++++
##########################################++++++++++++++++++++++++++++
#######################################+++++++++++++++++++++++++++++++
####################################++++++++++++++++++++++++++++++++++
##################################++++++++++++++++++++++++++++++++++++
################################++++++++++++++++++++++++++++++++++++++
##############################++++++++++++++++++++++++++++++++::::::::
#############################+++++++++++++++++++++++++++::::::::::::::
###########################+++++++++++++++++++++++++::::::::::::::::::
##########################++++++++++++++++++++++++::::::::::::::::::::
#########################++++++++++++++++++++++:::::::::::::::::::::::
########################+++++++++++++++++++++:::::::::::::::::::::::::
#######################++++++++++++++++++++:::::::::::::::::::::::::::
######################++++++++++++++++++++::::::::::::::::::::::::::::
#####################+++++++++++++++++++::::::::::::::::::::::::::::::
####################+++++++++++++++++++::::::::::::::::::::::::.......
####################++++++++++++++++++::::::::::::::::::::::..........
###################+++++++++++++++++++::::::::::::::::::::............
###################++++++++++++++++++:::::::::::::::::::..............
###################+++++++++++++++++:::::::::::::::::::...............
##################++++++++++++++++++::::::::::::::::::................
##################++++++++++++++++++:::::::::::::::::.................
##################++++++++++++++++++:::::::::::::::::.................

ตัวอย่างอินพุต 4

59
1
 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789<>|,.-#+!$%&/()=?*'_:;

ตัวอย่างผลลัพธ์ 4

!+#-,|><87654210ZYWVUTRQPONLKJIHFEDCBzyxwutsrqonmlkjhgfedcbbbcdefghjkl
!+#-,|><87654210ZYWVUTRQPONLKJIHFEDCAzyxwutsrqonmljihgfdcba abcdfghijl
!+#-,|><87654210ZYWVUTRQPONLKJIHFEDCBzyxwutsrqonmlkjhgfedcbbbcdefghjkl
!+#-,|><97654310ZYXVUTSQPONMKJIHGEDCBAyxwvutrqponmkjihgffeedeeffghijkm
$+#-.|><98654320ZYXWUTSRQONMLKIHGFEDBAzyxwutsrqponmlkjihhggggghhijklmn
$!#-.,|<987643210YXWVUSRQPONLKJIHGEDCBAzywvutsrqponmllkjjjiiijjjkllmno
$!+#.,|><87654210ZYXVUTSRQONMLKJHGFEDCBAzywvutsrrqponnmmlllllllmmnnopq
%!+#-.|><987543210YXWVUTRQPONMLJIHGFEDCBAzyxwvutsrrqppooonnnnnoooppqrr
%$!+-.,|><87654310ZYXWVTSRQPONMLJIHGFEDCBAzyxxwvuttssrrqqqqqqqqqrrsstt
&%!+#-.,><987643210ZYXVUTSRQPONMLKJIHGFEDCBAzyyxwvvuutttssssssstttuuvv
&%$!+#.,|><986543210ZYWVUTSRQPONMLKJIHGFEDDCBAzzyyxwwwvvvuuuuuvvvwwwxy
/&%$!#-.,|><976543210ZYXVUTSRQPONMLKKJIHGFEEDCBBAAzzyyyxxxxxxxxxyyyzzA
(/&%!+#-.,|><876543210ZYXWVUTSRQPONMLKJJIHGGFEEDCCBBBAAAzzzzzzzAAABBBC
)(/%$!+#-.,|><876543210ZYXWVUTSRQPPONMLKKJIIHGGFFEEDDDCCCCCCCCCCCDDDEE
=)(&%$!+#-.,|><986543210ZYYXWVUTSRQPPONMMLKKJIIHHGGGFFFEEEEEEEEEFFFGGG
?=)(&%$!+#-.,|><9876543210ZYXWVVUTSRRQPOONMMLLKJJJIIIHHHHHHHHHHHHHIIIJ
*?=)(/%$!+#-.,|><98765432210ZYXWWVUTSSRQQPOONNMMLLLKKKJJJJJJJJJJJKKKLL
'*?=)(/&%$!+#-.,|><98765432110ZYXXWVUUTSSRRQPPOOONNNMMMMMLLLLLMMMMMNNN
_'*?=)(/&%$!+#-.,|><988765432210ZYYXWWVUUTTSSRRQQQPPPOOOOOOOOOOOOOPPPQ
:_'*?=)(/&%$!+##-.,|><9877654332100ZYYXXWVVUUTTTSSSRRRRQQQQQQQQQRRRRSS
;;:_'*?=)(/&%$!+#-.,,|><98876554322100ZZYYXXWWVVVUUUTTTTTTTTTTTTTTTUUU
;;;:_'*?=)(/&&%$!+#-.,,|><9987665443321100ZZYYYXXXWWWWVVVVVVVVVVVWWWWX
;;;;;:_'*?=)(/&%$$!+#-..,|>><9887665544322211000ZZZYYYYYYYYYYYYYYYYYZZ
;;;;;;:_'*??=)(/&%%$!+##-.,,|><<99877665544333222111100000000000001111
;;;;;;;;:_'*?==)(/&&%$!++#--.,,|>><<9887766655544433333322222223333334

หนึ่งสัปดาห์ผ่านไป ถึงเวลาที่จะเปิดเผยความยาวของการแก้ปัญหาจากการแข่งขันในมหาวิทยาลัยของเรา:

167 - Python
189 - Haskell
203 - C
210 - VB.NET
219 - C

และโซลูชั่นของเราเอง:

  91 - GolfScript
125 - Ruby
157 - PowerShell


9
ฉันคิดว่ามันจะเย็นจะมีแท็กสำหรับคำถาม ascii-ศิลปะเกินไป
gnibbler

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

@Juan: คุณหมายถึงอะไรกันแน่? ฉันดูดดื่มอธิบายและทำเช่นนั้นเมื่อปีที่แล้วเพื่อความซื่อสัตย์ แถบสุดท้ายขยายไปถึงส่วนที่เหลือของภาพ มิฉะนั้นตัวอย่างที่สองทำให้ชัดเจนที่สุดฉันคิดว่า เนื่องจาก 35 LU มีความกว้าง 70 ตัวอักษรแต่ละแถบ (ซึ่งมี 7) คือ 10 ตัวกว้างในบรรทัดบนสุด ที่ขอบด้านซ้ายแต่ละแบนด์จะมีความสูง 5 ตัวอักษร (แต่มีเพียง 5 แบนด์แรกเท่านั้นที่พอดีกับความสูงของกริด)
Joey

@ โจอี้สิ่งที่ฉันหมายถึงคือความกว้างของวงควรจะเท่ากันเนื่องจากในวงจะประกอบด้วย n LU (กว้าง 2 ตัวอักษรแต่ละตัว) ดังนั้นเราจึงมี 2 * n ตัวอักษรต่อแบนด์ต่อบรรทัด ถูกต้องหรือไม่
Juan

@ หยวน: หืมการปัดเศษควรใช้กับดัชนีอักขระไม่ใช่หน่วยความยาว ฉันจะลองใช้ถ้อยคำใหม่ในลักษณะที่คลุมเครือน้อยกว่า จุดอื่น: ตารางทั้งหมดจะถูกนำมาเป็นตารางตัวละครไม่ได้เป็นตาราง SLU (หน่วยความยาวตาราง :-)) สิ่ง LU เพียงเพื่อช่วยสร้างความแตกต่างระหว่างระยะทางแนวนอนและแนวตั้งที่ชัดเจนยิ่งขึ้น ดูเหมือนจะทำงานได้ไม่ดีนัก แต่เดิมฉันมีสูตรที่ชัดเจนในนั้นมันถูกลบออกเพราะถือว่าง่ายเกินไป
Joey

คำตอบ:


11

ทับทิม 1.9 116 114 108 101 ตัวอักษร

x,y,z=*$<;25.times{|r|70.times{|c|$><<z[[(c-x.to_i+2.i*(r-y.to_i)).abs/70.0*k=z=~/$/,k-1].min]};puts}

27

Brainfuck - 1286

นี่เป็นหนึ่งในงานสร้างสรรค์ที่ฉันโปรดปราน รวมถึงการทำงาน (สำหรับคำจำกัดความของการทำงาน) ฟังก์ชั่นสแควร์รูท

>,>,<<<<<<<+>,[<+[<+>-],]<-[>>[>]>>>+<<<<[<]<-]>>[<+<+<+>>>-]<<<[>>>+<
<<-]>[>]>>>>>>>+++++[<+++++>-]<[>>+++++++[<++++++++++>-]<[>>+++++++[<+
+++++++++>-]<<[>->+<<-]>>[<<+>>-]<<<<<[>>>>->+<<<<<-]>>>>>[<<<<<+>>>>>
-]<[>+>+<<-]>[<+>-]>>+++++++[<<++++++++++>>-]>[-]>[-]+>[-]<<<<[>+>+<<-
]>[<+>-]<<[>>+<<-]+>>>[>-]>[<<<<->>[-]>>->]<+<<[>-[>-]>[<<<<->>[-]+>>-
>]<+<<-]>[-]>[-]<<<[-]<[-<+[+>+<]>+[<+>-]]++<[->-[>+>>]>[+[-<+>]>+>>]<
<<<<]>[-]>[-]>[<<<+>>>-]<+++++[<+++++>-]<<<<[>>>->+<<<<-]>>>>[<<<<+>>>
>-]<<<<<[>>>>->+<<<<<-]>>>>>[<<<<<+>>>>>-]<[>+>+<<-]>[<+>-]>>+++++[<<+
++++>>-]>[-]>[-]+>[-]<<<<[>+>+<<-]>[<+>-]<<[>>+<<-]+>>>[>-]>[<<<<->>[-
]>>->]<+<<[>-[>-]>[<<<<->>[-]+>>->]<+<<-]>[-]>[-]<<<[-]<[-<+[+>+<]>+[<
+>-]]<<[>>+>+<<<-]>>[>>>+<<<-]>>>[<<[<+>>+<-]>[<+>-]>-]<<[-]<[<<+>>-]<
[>+>+<<-]>[>>>+<<<-]>>>[<<[<+>>+<-]>[<+>-]>-]<<[-]<[<<+>>-]<<>+>>+<<<[
[>>+>>+<<<<-]>>>>[<<<<+>>>>-]>[-]>[-]+>[-]<<<<[>+>+<<-]>>[<<+>>-]<<<[>
>>+<<<-]>>>[>-]>[<<<<+>>[-]>>->]<+<<[>-[>-]>[<<<<+>>[-]+>>->]<+<<-]>[-
]>[-]<<+<<[>>-<[-]<-<<[-]>>]>>[-<<<[>+>+<<-]+>[<+>>+<-]>+>]<<<<]>[<+>-
]<-<<<<<[<+>->>>>>>+<<<<<<]<[>+<-]>>>>>>[>>>+<<<-]>>>[<<[<+>>+<-]>[<+>
-]>-]<+++++++<[-]>[<+++++>-]<<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>[-]>[-]>[
<<<<<<<<<<<+>>>>>>>>>>>-]<<<<<<<<<<<[-<[>>+<<-]>[<+>-]<]<.>>>[[<<+>>-]
>]>>>>>-]++++++++++.[-]<-]

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

เอาท์พุท 1:

&$$$$$$$$XXXXXXXXxxxxxxxxxx========++++++++++++++++++++++;;;++++++++++
$$$$$$$$$XXXXXXxxxxxxxxxx========++++++++++++++;;;;;;;;;;;;;;;;;;;;;;;
$$$$$$$XXXXXXXXxxxxxxxx========++++++++++++;;;;;;;;;;;;;;;;;;;;;;;;;;;
$$$$$$$XXXXXXxxxxxxxxxx======++++++++++++;;;;;;;;;;;;;;;;:::;;;;;;;;;;
$$$$$XXXXXXXXxxxxxxxx========++++++++++;;;;;;;;;;:::::::::::::::::::;;
$$$$$XXXXXXxxxxxxxxxx======++++++++++;;;;;;;;:::::::::::::::::::::::::
$$$$$XXXXXXxxxxxxxx======++++++++++;;;;;;;;:::::::::::::::::::::::::::
$$$XXXXXXxxxxxxxxxx======++++++++;;;;;;;;::::::::::::::::...::::::::::
$$$XXXXXXxxxxxxxx========++++++++;;;;;;::::::::::::...............::::
$$$XXXXXXxxxxxxxx======++++++++;;;;;;;;::::::::::...................::
$$$XXXXXXxxxxxxxx======++++++++;;;;;;::::::::::..........   ..........
$$$XXXXXXxxxxxxxx======++++++++;;;;;;::::::::........           ......
$$$XXXXXXxxxxxxxx======++++++++;;;;;;::::::::......               ....
$$$XXXXXXxxxxxxxx======++++++++;;;;;;::::::::......               ....
$XXXXXXxxxxxxxx======++++++++;;;;;;::::::::......                   ..
$$$XXXXXXxxxxxxxx======++++++++;;;;;;::::::::......               ....
$$$XXXXXXxxxxxxxx======++++++++;;;;;;::::::::......               ....
$$$XXXXXXxxxxxxxx======++++++++;;;;;;::::::::........           ......
$$$XXXXXXxxxxxxxx======++++++++;;;;;;::::::::::..........   ..........
$$$XXXXXXxxxxxxxx======++++++++;;;;;;;;::::::::::...................::
$$$XXXXXXxxxxxxxx========++++++++;;;;;;::::::::::::...............::::
$$$XXXXXXxxxxxxxxxx======++++++++;;;;;;;;::::::::::::::::...::::::::::
$$$$$XXXXXXxxxxxxxx======++++++++++;;;;;;;;:::::::::::::::::::::::::::
$$$$$XXXXXXxxxxxxxxxx======++++++++++;;;;;;;;:::::::::::::::::::::::::
$$$$$XXXXXXXXxxxxxxxx========++++++++++;;;;;;;;;;:::::::::::::::::::;;

เอาท์พุท 2:

XXXXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXX
XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX
XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX
XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX
XXXXXXXX............XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX
XX................XXXXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX
..................XXXXXXXXXX............XXXXXXXXXX..........XXXXXXXXXX
................XXXXXXXXXXXX..........XXXXXXXXXXXX..........XXXXXXXXXX
..............XXXXXXXXXXXX............XXXXXXXXXX..........XXXXXXXXXXXX
..........XXXXXXXXXXXXXXXX..........XXXXXXXXXXXX..........XXXXXXXXXXXX
..XXXXXXXXXXXXXXXXXXXXXX............XXXXXXXXXX............XXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXX............XXXXXXXXXXXX..........XXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX..............XXXXXXXXXX............XXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX................XXXXXXXXXXXX............XXXXXXXXXXXXXX
XXXXXXXXXXXX..................XXXXXXXXXXXX............XXXXXXXXXXXXXXXX
XX..........................XXXXXXXXXXXXXX..........XXXXXXXXXXXXXXXXXX
..........................XXXXXXXXXXXXXX............XXXXXXXXXXXXXXXXXX
......................XXXXXXXXXXXXXXXX............XXXXXXXXXXXXXXXXXXXX
..................XXXXXXXXXXXXXXXXXX..............XXXXXXXXXXXXXXXXXXXX
..............XXXXXXXXXXXXXXXXXXXX..............XXXXXXXXXXXXXXXXXXXXXX
..XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..............XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXX................XXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX..................XXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX....................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX......................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

3
ฉันขาดการพิจารณาเรื่องนี้น่ากลัวและน่ากลัว: D ฉันเดาว่าสแควร์รูทที่แม่นยำสามารถทำได้เฉพาะกับตารางการค้นหาหรือด้วยรหัสอื่น ๆ อีกมากมาย
Joey

การค้นหาจะไม่ช่วย ฉันสามารถคำนวณจำนวนเต็มใต้สแควร์รูทได้ คุณต้องการการแสดงข้อมูลใหม่เพื่อจัดการกับจุดลอยตัวและฉันก็ไม่พร้อมที่จะกระโดด
captncraig

12

Python - 141 ตัวอักษร

x=input();y=input();z=raw_input();w=len(z)
for i in range(-y,25-y):print"".join(z[min(w-1,int((i*i*4+j*j)**.5*w/70))]for j in range(-x,70-x))

8

Delphi, 200 (และ 185)

เนื่องจากฉันชอบ ascii-art ที่นี่เป็นรุ่น Delphi ของกอล์ฟรหัสนี้:

uses Math;var G:string;X,Y,l,i,j:Int16;begin ReadLn(X,Y);ReadLn(G);l:=Length(G);for j:=-y to 24-y do for i:=-x to 70-x do if i=70-x then WriteLn else Write(g[Min(l,1+Trunc(l*sqrt(i*i/4+j*j)/35))])end.

ไม่ค่อยฉลาดเท่าไรเพราะฉันต้องใช้หน่วย Math เพื่อเชื่อมโยงในฟังก์ชั่น Min () นอกจากนี้ ReadLn () ไม่อ่านจำนวนเต็มและสตริงในการโทรหนึ่งครั้งดังนั้นจึงค่อนข้างแพงเช่นกัน ขึ้นบรรทัดใหม่ต้องการอักขระจำนวนมากเช่นกัน นอกจากนี้ Delphi ต้องการช่องว่างค่อนข้างมากรอบคำหลักของมัน ไม่ค่อยภูมิใจในตัวนี้มากนัก

อย่างไรก็ตามผลลัพธ์ของตัวอย่าง 4 ให้ฉัน:

!+#-,|><87654210ZYWVUTRQPONLKJIHFEDCBzyxwutsrqonmlkjhgfedcbbbcdefghjkl
!+#-,|><87654210ZYWVUTRQPONLKJIHFEDCAzyxwutsrqonmljihgfdcba abcdfghijl
!+#-,|><87654210ZYWVUTRQPONLKJIHFEDCBzyxwutsrqonmlkjhgfedcbbbcdefghjkl
!+#-,|><97654310ZYXVUTSQPONMKJIHGEDCBAyxwvutrqponmkjihgffeedeeffghijkm
$+#-.|><98654320ZYXWUTSRQONMLKIHGFEDBAzyxwutsrqponmlkjihhggggghhijklmn
$!#-.,|<987643210YXWVUSRQPONLKJIHGEDCBAzywvutsrqponmllkjjjiiijjjkllmno
$!+#.,|><87654210ZYXVUTSRQONMLKJHGFEDCBAzywvutsrrqponnmmlllllllmmnnopq
%!+#-.|><987543210YXWVUTRQPONMLJIHGFEDCBAzyxwvutsrrqppooonnnnnoooppqrr
%$!+-.,|><87654310ZYXWVTSRQPONMLJIHGFEDCBAzyxxwvuttssrrqqqqqqqqqrrsstt
&%!+#-.,><987643210ZYXVUTSRQPONMLKJIHGFEDCBAzyyxwvvuutttssssssstttuuvv
&%$!+#.,|><986543210ZYWVUTSRQPONMLKJIHGFEDDCBAzzyyxwwwvvvuuuuuvvvwwwxy
/&%$!#-.,|><976543210ZYXVUTSRQPONMLKKJIHGFEEDCBBAAzzyyyxxxxxxxxxyyyzzA
(/&%!+#-.,|><876543210ZYXWVUTSRQPONMLKJJIHGGFEEDCCBBBAAAzzzzzzzAAABBBC
)(/%$!+#-.,|><876543210ZYXWVUTSRQPPONMLKKJIIHGGFFEEDDDCCCCCCCCCCCDDDEE
=)(&%$!+#-.,|><986543210ZYYXWVUTSRQPPONMMLKKJIIHHGGGFFFEEEEEEEEEFFFGGG
?=)(&%$!+#-.,|><9876543210ZYXWVVUTSRRQPOONMMLLKJJJIIIHHHHHHHHHHHHHIIIJ
*?=)(/%$!+#-.,|><98765432210ZYXWWVUTSSRQQPOONNMMLLLKKKJJJJJJJJJJJKKKLL
'*?=)(/&%$!+#-.,|><98765432110ZYXXWVUUTSSRRQPPOOONNNMMMMMLLLLLMMMMMNNN
_'*?=)(/&%$!+#-.,|><988765432210ZYYXWWVUUTTSSRRQQQPPPOOOOOOOOOOOOOPPPQ
:_'*?=)(/&%$!+##-.,|><9877654332100ZYYXXWVVUUTTTSSSRRRRQQQQQQQQQRRRRSS
;;:_'*?=)(/&%$!+#-.,,|><98876554322100ZZYYXXWWVVVUUUTTTTTTTTTTTTTTTUUU
;;;:_'*?=)(/&&%$!+#-.,,|><9987665443321100ZZYYYXXXWWWWVVVVVVVVVVVWWWWX
;;;;;:_'*?=)(/&%$$!+#-..,|>><9887665544322211000ZZZYYYYYYYYYYYYYYYYYZZ
;;;;;;:_'*??=)(/&%%$!+##-.,,|><<99877665544333222111100000000000001111
;;;;;;;;:_'*?==)(/&&%$!++#--.,,|>><<9887766655544433333322222223333334

หากคุณจะยอมรับเอาต์พุตที่เยื้องรุ่นนี้จะสั้นลงเล็กน้อยโดยเปลี่ยนบรรทัดใหม่เป็นเยื้องที่นำไปสู่การตัด 80 อักขระ (จำลองบรรทัดขึ้นใหม่บนคอนโซล 80x25 มาตรฐาน):

uses Math;var G:string;X,Y,l,i,j:Int16;begin ReadLn(X,Y);ReadLn(G);l:=Length(G);for j:=-y to 24-y do for i:=-x to 70-x do Write(g[Min(l,1+Trunc(l*sqrt(i*i/4+j*j)/35))]:11*Ord(i=-x))end.

(สิ่งนี้จะช่วยประหยัด 15 ตัวอักษรรวมเป็น 185 ตัว) เป็นผลลัพธ์สำหรับ "0 0 XXXX" คือ:

          XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX
          XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX
          XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX
          XXXXXXXX............XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX
          XXXXXX.............XXXXXXXXXX...........XXXXXXXXXX..........XXXXXXXXXX
          ..................XXXXXXXXXXX..........XXXXXXXXXX...........XXXXXXXXXX
          ................XXXXXXXXXXXX...........XXXXXXXXXX..........XXXXXXXXXXX
          ...............XXXXXXXXXXXX...........XXXXXXXXXX...........XXXXXXXXXXX
          ............XXXXXXXXXXXXXX...........XXXXXXXXXXX..........XXXXXXXXXXXX
          .........XXXXXXXXXXXXXXX............XXXXXXXXXXX...........XXXXXXXXXXXX
          XXXXXXXXXXXXXXXXXXXXXXX............XXXXXXXXXXX...........XXXXXXXXXXXXX
          XXXXXXXXXXXXXXXXXXXXX.............XXXXXXXXXXX...........XXXXXXXXXXXXXX
          XXXXXXXXXXXXXXXXXX..............XXXXXXXXXXXX...........XXXXXXXXXXXXXXX
          XXXXXXXXXXXXXXX................XXXXXXXXXXXX............XXXXXXXXXXXXXXX
          XXXXXXXXXXX..................XXXXXXXXXXXXX............XXXXXXXXXXXXXXXX
          ...........................XXXXXXXXXXXXX............XXXXXXXXXXXXXXXXXX
          ........................XXXXXXXXXXXXXXX............XXXXXXXXXXXXXXXXXXX
          ......................XXXXXXXXXXXXXXX.............XXXXXXXXXXXXXXXXXXXX
          ..................XXXXXXXXXXXXXXXXX.............XXXXXXXXXXXXXXXXXXXXXX
          .............XXXXXXXXXXXXXXXXXXXX..............XXXXXXXXXXXXXXXXXXXXXXX
          XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...............XXXXXXXXXXXXXXXXXXXXXXXXX
          XXXXXXXXXXXXXXXXXXXXXXXXXXXX...............XXXXXXXXXXXXXXXXXXXXXXXXXXX
          XXXXXXXXXXXXXXXXXXXXXXXX.................XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
          XXXXXXXXXXXXXXXXXXXX...................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
          XXXXXXXXXXXXXX......................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

(คุณเห็นการเยื้องหรือไม่! ;-))


7

APL (74)

{L←⍴⊃C Y X⎕IO←⍞⎕⎕0⋄⎕←{C[⊃⌊L⌊35÷⍨L×.5*⍨+/2*⍨1 2÷⍨⍵-Y X]}¨⍳⍵}25 70

เหตุผลที่ห่อหุ้มฟังก์ชั่นคือการปรับเปลี่ยนที่⎕IOใช้ไม่ได้กับส่วนที่เหลือของระบบ

คำอธิบาย:

  • L←⍴⊃C Y X⎕IO←⍞⎕⎕0: ตั้งค่า⎕IOเป็น0( กำหนดให้เป็นอาร์เรย์ 0-based แทน 1-based) ตั้งค่า X เป็น(อ่านบรรทัดแรก) ตั้งค่า Y เป็น(อ่านบรรทัดที่สอง) ตั้งค่า C เป็น(อ่านบรรทัดที่สามโดยไม่มีการจัดรูปแบบ) และตั้ง L ความยาว ( ) Cของ
  • 25 70: ขนาดของเมทริกซ์
  • ¨⍳⍵: สำหรับแต่ละองค์ประกอบในเมทริกซ์ที่แต่ละองค์ประกอบเป็นพิกัดของตัวเอง ...
  • ⍵-Y X: ความแตกต่างระหว่างจุดปัจจุบันและจุดกึ่งกลาง
  • 1 2÷⍨: แบ่งพิกัด X ด้วย 2 (เพราะถ่านมีครึ่งกว้างเท่าที่สูง)
  • .5*⍨+/2*⍨: ใช้สแควร์รูทของผลรวมของช่องสี่เหลี่ยม
  • 35÷⍨: หารด้วย 35
  • ⌊L⌊: จดจำนวนอักขระขั้นต่ำและค่าปัจจุบันแล้วปัดลง
  • ,/: ค่ายังคงอยู่ในรายการ (ขององค์ประกอบเดียวเท่านั้น) และสิ่งนี้จะสร้างระยะห่างในผลลัพธ์ดังนั้น 'ฟรี' ค่าจากรายการของพวกเขา
  • C[... ]: ใช้ค่าที่เราพบว่าเป็นดัชนีในรายการตัวละคร
  • ⎕←: ตอนนี้เรามีเมทริกซ์ที่แต่ละองค์ประกอบ (x, y) เป็นตัวละครสำหรับ (x, y) ดังนั้นเอาท์พุทเมทริกซ์

6

Perl 5.10, 103 ตัวอักษร

$x=<>;$y=<>;@C=<>=~/./g;for$j(-$y..24-$y){print+(map$C[@C/35*sqrt$_**2/4+$j**2]//$C[-1],-$x..69-$x),$/}

ขอบคุณ @JB สำหรับเคล็ดลับที่ดีที่codegolf.stackexchange.com/questions/678/…
ninjalj

นอกจากนี้ยังต้องขอบคุณ @gnibbler สำหรับเคล็ดลับ "การแทนที่การคำนวณล่วงหน้าในช่วง" ของเขา
ninjalj

คุณมีบรรทัดว่างก่อนหน้าเอาต์พุต ดังนั้นในปัจจุบันนี้นับว่าไม่ถูกต้อง
Joey

@Joey: ได้รับการแก้ไข ...
ninjalj

ยังคงล้มเหลวกรณีทดสอบของฉันที่นี่ แต่ ฉันเพิ่มลงในคำถาม (ตัวอย่างที่ 4) ศูนย์ใดในเอาท์พุทจะถูกแทนที่ด้วยเครื่องหมายอัฒภาค
Joey

5

Perl, 120 ตัวอักษร

$x,$y=<>,<>;@C=split'',<>;for$j(0..24){print+(map$C[($c=$#C/35*sqrt(($x/2-$_/2)**2+($y-$j)**2))<$#C?$c:$#C-1],0..69),$/}

ล้มเหลวในตัวอย่างแรกและตัวที่สาม absมีเหตุผล
ninjalj

1
Squaring ลบเครื่องหมายต่อไปฉันไม่เห็นว่า abs จะเปลี่ยนแปลงอะไรได้บ้าง
คนขี้ขลาดนิรนาม

1
D'โอ้! คุณพูดถูก สิ่งที่ระบบของฉันล้มเหลวคือ $x,$y=<>,<>;อะไร
ninjalj

4

Windows PowerShell, 157

ไม่มีอะไรน่าสังเกต พ่ายแพ้ต่อความตายแล้ว:

$x,$y,$c=@($input)
$l=$c.Length
$c+=(""+$c[-1])*90
0..24|%{$r=$_
-join(0..69|%{$c[[math]::truncate([math]::sqrt(($x-$_)*($x-$_)+4*($y-$r)*($y-$r))*$l/70)]})}

2

C, 176

นี่คือคำแปลของโซลูชัน Delphi ของฉันเป็น C ประหยัด 24 ตัวอักษร:

X,Y,l,i,j,t;char G[99];main(){scanf("%d\n%d\n",&X,&Y);gets(G);l=strlen(G);for(j=-Y;j<25-Y;j++)for(i=-X-1;i<70-X;)t=floor(l*sqrt(i*i++/4+j*j)/35),putchar(!i+X?10:G[t<l?t:l-1]);}

คุณสามารถทดสอบรหัสนี้ได้ที่นี่: http://www.ideone.com/oTvHt


3
คุณสามารถใส่การประกาศของตัวแปร int ในรายการอาร์กิวเมนต์ของmain()ฉันเดาและบันทึกอัฒภาคด้วยวิธีนั้น
Joey

2

เสียงกระเพื่อมสามัญ 173 ตัว

(let*((c(read))(v(read))(g(read-line))(l(length g)))(dotimes(y 25)(dotimes(x 70)(princ(elt g(min(floor(*(sqrt(+(expt(/(- c x)2)2)(expt(- v y)2)))l)35)(1- l)))))(princ #\
)))

เคล็ดลับที่แท้จริงที่ฉันใช้ที่นี่คือการใช้

#\[actual newline]

เป็นตัวอักษรขึ้นบรรทัดใหม่


1

สกาล่า 223 (204 โดยไม่มี App-Wrapper)

object C extends App{
import math._
def r=readInt
val p=r
val q=r
val m=readLine
(1 to 70)map(x=>(0 to 25)map(y=>{
printf("%c[%d;%dH%s",27,y,x,m(({
val a=abs(p-x)
val b=abs(q-y)
sqrt(a*a+2*b*b)
}*(m.size-1)/74).toInt))}
))}

การมี cols และแถว (70, 25) ตั้งค่าแบบไดนามิกจะช่วยให้การไล่ระดับสี screenfilling


1

C # 311

คิดว่าฉันจะทำโปรแกรมยาว ๆ เพื่อทำให้คนอื่นรู้สึกดีขึ้น:

using System;class P{static void Main(){Func<string>r=Console.ReadLine;int x=int.Parse(r()),y=int.Parse(r());var c=r();for(int j=0;j<25;j++){for(int i=0;i<70;i++){var l=c.Length;Console.Write(c[(int)Math.Min(l*Math.Sqrt(Math.Pow(Math.Abs(x-i)/2.0,2)+Math.Pow(Math.Abs(y-j),2))/35,l-1)]);}Console.Write("\n");}}}

อินพุตถูกนำมาจากคอนโซลครั้งละหนึ่งบรรทัด (สองบรรทัดสำหรับพิกัดและอีกหนึ่งสำหรับการไล่ระดับสีตัวอักษร)

ขอบคุณJoeyสำหรับคำแนะนำ

ตัวอย่างที่ 1: http://ideone.com/X0jIZ

ตัวอย่างที่ 2: http://ideone.com/RvICt


@ โจอี้ถูกต้อง ฉันแก้ไขและรู้ว่าทำไมการลองใช้ C # เป็นความคิดที่ไม่ดี มันสนุกดี :-)
Cristian Lupascu

@Joey คุณขวาทั้งระดับมิได้วิธีจำเป็นที่จะต้องมีการทำเครื่องหมายเป็นสาธารณะ
Cristian Lupascu

@Joey ถ้าเราใช้intแทนfloat, การแสดงออกx-iและกลายเป็นประเภทy-j intเนื่องจากสิ่งนี้ `int Math.Abs ​​(ค่า int) จะถูกเรียกแทนค่าทศนิยมซึ่งนำไปสู่การสูญเสียความแม่นยำ ฉันลองแล้วมีขอบคร่าวๆ: ideone.com/wQcMT
Cristian Lupascu

@Joey Right Abs ไม่ส่งผลต่อความแม่นยำ แต่จะส่งกลับค่า int ซึ่งเมื่อหารด้วย 2 จะสูญเสียความแม่นยำเมื่อเทียบกับการลอย
Cristian Lupascu

ขออภัยฉันลืมการแก้ไขที่จะใช้งานได้ตามที่คุณต้องการ (เสียค่าใช้จ่ายสองตัวอักษร แต่ints จะประหยัดได้มากกว่า;)) โอ้และมี*.5ราคาเพียงถ่านตัวเดียว
Joey
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.