ICS Maritime Flag ตัวอักษร


14

เรือธง ใช้รหัสสากลของตัวอักษรสำหรับการสื่อสารโดยเฉพาะอย่างยิ่งสำหรับสัญญาณคงที่

ความท้าทายของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นที่จะใช้สตริงจาก STDIN หรือเป็นอาร์กิวเมนต์และแสดงข้อความที่เกี่ยวข้องในตัวอักษรธง ICS หากภาษาของคุณไม่ปรากฏขึ้นที่หน้าจอการบันทึกลงไฟล์นั้นเป็นที่ยอมรับ

โปรแกรมหรือการทำงานของคุณจะสนับสนุนตัวอักษรAZในด้านบนและกรณีที่ต่ำกว่าบวกอวกาศและนิวไลน์ พฤติกรรมกับตัวละครอื่น ๆ ไม่ได้กำหนด

จอแสดงผลต้องมีขนาดใหญ่พอที่จะ สามารถแสดงผลได้อย่างน้อย 8 ธงในแนวนอนและ 6 ธงในแนวตั้ง พฤติกรรมจะไม่ได้กำหนดหากถึงขอบด้านขวาก่อนที่จะได้รับการขึ้นบรรทัดใหม่หรือหากข้อความยาวเกินกว่าที่จะพอดีกับจอแสดงผลในแนวตั้ง

ตัวอักษรธงแสดงอยู่ด้านล่าง (ตัวอักษรโรมันใช้สำหรับการอ้างอิงเท่านั้นไม่จำเป็นต้องใช้ในผลลัพธ์)

ป้อนคำอธิบายรูปภาพที่นี่

ขนาด

ไม่มีมาตรฐานที่ตกลงกันโดยทั่วไปสำหรับขนาดของธงเหล่านี้ดังนั้นเพื่อความท้าทายนี้จะมีผลใช้บังคับ:

ธงจะต้องเป็น 60x60 พิกเซลโดยมีช่องว่าง 30 พิกเซลระหว่างพวกเขาทั้งแนวนอนและแนวตั้ง

หางแฉกที่ตัด A และ B ต้องมีความลึก 15 พิกเซล

เส้นอื่นทั้งหมดต้องเป็นแนวนอนแนวตั้งหรือที่ 45 องศา

สถานที่นั้นจะต้องอยู่ในตำแหน่งโดยแบ่งธงออกเป็นตาราง NxN ในจินตนาการของด้าน 3,4,5 หรือ 6 สี่เหลี่ยม อ้างถึงภาพด้านบน แต่สำหรับการชี้แจงเพิ่มเติม:

A, E, H, K, L และ U ขึ้นอยู่กับตาราง 2x2: ความกว้างของแต่ละโซนสีจะเป็น 30 พิกเซล คะแนนของเพชรใน F จะอยู่กึ่งกลางของแต่ละด้านของธง

J และ T ขึ้นอยู่กับกริด 3x3: แต่ละวงจะต้องมี 20 พิกเซล

P, N และ S ขึ้นอยู่กับตาราง 4x4 เส้นทแยงมุมของ Y ก็จะแบ่งขอบของธงออกเป็น 4

C, D, R และ X จะขึ้นอยู่กับตาราง 5x5 แถบและแขนกางเขนกว้าง 12 พิกเซล

G, W, M, V ขึ้นอยู่กับตาราง 6x6 แถบ G และเส้นขอบ W จะกว้าง 10 พิกเซล แขนกางเขนบน M และ V จะครอบคลุม 10 พิกเซลแรกและสุดท้ายของแต่ละขอบของธงโดยเว้นเขตสามเหลี่ยมไว้ที่ 40 พิกเซลตามขอบยาว

วงกลมของฉันจะอยู่ตรงกลางธงและมีขนาดเส้นผ่าศูนย์กลาง 30 พิกเซล

อนุญาตให้มีข้อผิดพลาด +/- 1 พิกเซลจากข้อความด้านบน หากภาษาของคุณรองรับกราฟิกที่ปรับขนาดได้เท่านั้นคุณอาจตีความ "พิกเซล" เป็นค่าเฉลี่ย "หน่วย"

สี

สีจะเป็นสีแดงขาวน้ำเงินเหลืองและดำตามที่กำหนดโดยภาษาหรือเอกสารของคุณ หากภาษาของคุณไม่ได้กำหนดสีคุณอาจใช้สิ่งต่อไปนี้: สีแดง FF0000, สีขาว FFFFFF, สีฟ้า 0000FF, สีเหลือง FFFF00, สีดำ 0000000

พื้นหลังจะต้องเป็นสีเทา (ช่อง r, g และ b เท่ากับระหว่าง 25% ถึง 75% ของความเข้ม)

การให้คะแนน / ช่องโหว่

นี่คือ codegolf รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

ช่องโหว่มาตรฐานไม่ได้รับอนุญาต

ห้ามใช้ฟังก์ชัน builtin หรือ library สำหรับการแสดงแฟล็ก ผลลัพธ์จะต้องไม่ใช่ข้อความ (และโดยเฉพาะอย่างยิ่งอักขระ Unicode จะไม่ถูกนำมาใช้เพื่อสร้างรูปร่างธง)

ตัวอย่าง

JFK got
my VHS
PC
and XLR
web quiz

ควรผลิตดังต่อไปนี้

ป้อนคำอธิบายรูปภาพที่นี่


ฉันไม่แน่ใจว่าสิ่งที่คุณหมายถึงโดย " การแสดงจะมีขนาดใหญ่พอที่จะแสดงอย่างน้อย 8 ธงในแนวนอนและ 6 ธงในแนวตั้ง " โดยเฉพาะอย่างยิ่งกรณีทดสอบของคุณแสดงผลลัพธ์ที่สูง 5 ธงเท่านั้น เป็นเพียงคำตอบที่ต้องจัดการกับข้อความในมิติเหล่านั้นและไม่จำเป็นต้องจัดการกับข้อความที่มีขนาดใหญ่กว่าหรือคุณต้องการให้ทุกบรรทัดควรมีขนาดอย่างน้อย 8 ตัวอักษรและข้อความทั้งหมดอย่างน้อย 6 บรรทัด?
Peter Taylor

1
@PeterTaylor หากโปรแกรมหรือภาษาของคุณฉลาดพอที่จะปรับขนาดจอแสดงผลตามเอาต์พุตคุณไม่จำเป็นต้องบีบจอแสดงผลเป็น 8x6 หากเอาต์พุตมีขนาดเล็กลง ผลลัพธ์จะต้องมีพื้นหลังสีเทาและเป็นรูปสี่เหลี่ยมผืนผ้า (ทุกเส้นมีความยาวอย่างน้อยความยาวของบรรทัดที่ยาวที่สุด)
เลเวลริเวอร์เซนต์

คำตอบ:


15

CJam, 464 ไบต์

คุณคิดว่า CJam ไม่มีฟังก์ชั่นการปรับแต่งภาพหรือไม่? คุณคิดถูก! แต่ฉันจะไม่ปล่อยให้หยุดฉัน

"P3
690 690 4
"3a3*a690_@*a*qeuN/{0:U;{_'C<.5*:N;i[{XY+Z<[E8][9C]?XY<=}WWWW{XH<9F?}C{YC/[9FCF]=}{YC/3&9E?}{YH<9F?}{X29.5:R-zYR-z+H>FC?}{XA/1&9E?}{XH<FC?}{XR-_*YR-_*+F_*>E8?}{YK/(9F?}{XH<E9?}{XH<YH<^8E?}{XY+Z-A/XY-A/e&9F?}{XF/YF/^1&F9?}{XY<EC?}{XH-F/YH-F/|9F?}E{XHm6/YHm6/e&CE?}{XH-F/YH-F/|F9?}{XK/[CF9]=}{XH<YH<^FC?}{XY+Z-A/XY-A/e&FC?}{XR-zYR-ze>iA/[CF9]=}{XHm6/YHm6/e&F9?}{XY+F/1&CE?}]=:P~!!{60:Z{Z30:HYH-z-N*-{YV+_2$=XU+P2b1>4f*tt}fX}fY}*U90+:U;}/V90+:V;}/`"[]"-

โปรแกรมนี้เอาท์พุทภาพในวิธีที่ดีที่สุดที่ CJam สามารถ: เป็นข้อความที่แสดงถึงภาพเมื่อบันทึกเป็นไฟล์ PPM อย่าพยายามเรียกใช้มันด้วยล่ามออนไลน์ด้วย คุณจะระเบิดกอง เรียกใช้มันกับล่าม Javajava -jar cjam-0.6.4.jar flags.cjam > flags.ppmและท่อส่งออกไปยังไฟล์ที่มีคำสั่งเช่น เมื่อคุณป้อนข้อมูลแล้วให้ส่ง EOF (อาจจำเป็นต้องอยู่หลังบรรทัดใหม่) ด้วย ctrl + D ใน Unix หรือ ctrl + Z บน Windows

ตัวอย่าง

ถ้าเป็นที่ต้องการจริง ๆ ฉันสามารถลองวางต้นฉบับรูปภาพ ~ 3MB ที่ใดที่หนึ่งได้ แต่นี่คือผลลัพธ์ที่เปิดใน GIMP และแสดงเป็น PNG:

ABCDEFG
hijklmn
OPQRSTU
vwxyz z

flags_alphabet.png

คำอธิบาย

ส่วนหัวของภาพที่สามารถระบุได้อย่างง่ายดายในแหล่งที่มาประกอบด้วยหมายเลขมายากลความกว้างความสูงและค่าช่องสูงสุด ดังนั้นเอาต์พุตจึงเป็นภาพ 690 * 690 (เพียงพอสำหรับธง 8 * 8 60px ที่มีระยะห่าง 30px ระหว่างแต่ละภาพ) ด้วยค่า R, G และ B แต่ละค่าตั้งแต่ 0 ถึง 4

ข้อมูลภาพเริ่มต้นได้เป็นอาร์เรย์แบบเต็มขนาด 690 * 690 * 3 ซึ่งทำให้สีเทาอ่อนทั้งภาพ จากนั้นอินพุตจะถูกอ่านแปลงเป็นตัวพิมพ์ใหญ่และแยกเป็นบรรทัด บรรทัดจะถูกประมวลผลในการวนเพิ่มพิกัดที่ Y โดย 90 แต่ละการทำซ้ำและในแต่ละบรรทัดแต่ละตัวละครจะถูกประมวลผลในวงการเพิ่มพิกัด X ที่ 90 โดยแต่ละการทำซ้ำ ตอนนี้เวทมนต์ก็เริ่มขึ้น

อักขระแต่ละตัวถูกแมปกับฟังก์ชันพิกเซลของแฟล็กซึ่งเมื่อเรียกใช้จะส่งคืนสีของพิกเซลที่ตำแหน่ง (X, Y) บนแฟล็ก นี่คือส่วนที่ทำงานหนักส่วนใหญ่ไปแล้ว: อธิบายภาพ 26 ฟังก์ชั่นทางคณิตศาสตร์อย่างรัดกุม แต่ละฟังก์ชั่นเหล่านี้ส่งคืนค่าสีตั้งแต่ 8-15 ช่วงนี้ใช้ประโยชน์จากความจริงที่ว่าเมื่อแปลงเป็นฐาน 2 อาร์เรย์บิตผลลัพธ์สามารถตีความได้ว่า [1, R, G, B] องค์ประกอบแรกสามารถลบออกได้และส่วนที่เหลือคูณด้วย 4 เพื่อให้ค่าพิกเซลในรูปแบบที่ต้องการซึ่งครอบคลุมสีธงที่เป็นไปได้ทั้งหมด (เช่นสีเขียวสีฟ้าและสีม่วงแดง) ได้อย่างง่ายดาย นอกจากนี้ยังทำงานได้อย่างดีว่ามีตัวแปรหนึ่งตัวที่กำหนดค่าเริ่มต้นที่ 10-15 และเนื่องจาก varaibles ไม่ต้องการช่องว่างเพื่อแยก syntactically

เมื่อดึงฟังก์ชั่นแล้วมันเป็นเรื่องของการวนซ้ำของทั้ง X และ Y จาก 0-60 การเรียกใช้ฟังก์ชั่นในแต่ละขั้นตอนและเขียนผลลัพธ์กลับไปยังอาเรย์ข้อมูลภาพ ผู้สังเกตการณ์ที่ชาญฉลาดอาจสังเกตเห็นว่าค่าสีที่ส่งคืนโดยฟังก์ชันแฟล็กแต่ละตัวไม่อนุญาตให้มีสีเทา ดังนั้นจึงมีเหตุผลเพิ่มเติมเล็กน้อยที่จะข้ามช่องว่าง แต่ก็ยังมีการตัดหางแฉกที่ 'A' และ 'B' มีเหตุผลพิเศษอีกเล็กน้อยที่นั่นเช่นกัน หากค่าอักขระน้อยกว่า 'C' ค่าจะถูกตั้งค่าเพื่อให้ขอบเขตบนของลูป X แปรผันอย่างถูกต้องเมื่อเทียบกับ Y และจะไม่มีการวาดส่วนที่ตัดออก

โดยรวมแล้วฉันค่อนข้างมีความสุขกับสิ่งที่เกิดขึ้น ใช้เวลาทำงานเยอะ แต่ก็สนุกดี ธงบางรายการไม่ตรงกับภาพอ้างอิงอย่างสมบูรณ์แบบ แต่ฉันคิดว่าฉันมีรูปร่างทั้งหมดให้อยู่ในระยะ 1px ของเป้าหมาย (หากมีมากกว่านั้นโปรดแจ้งให้เราทราบและฉันจะแก้ไข) และยังคงมีศักยภาพที่จะเพิ่มประสิทธิภาพได้อย่างแน่นอนเนื่องจากมีฟังก์ชั่นการซ้ำซ้อนจำนวนมากระหว่างฟังก์ชันแฟล็ก 26 ตัว


การพยายามครั้งแรกในการทดสอบ 559 ไบต์

ค่อนข้างมากฉันไม่เคยทำสิ่งนี้เสร็จฉันจะโพสต์ด้วยเพราะมันน่าสนใจทีเดียว แทนที่จะสร้างแบบจำลองแต่ละธงด้วยฟังก์ชั่นของ (X, Y) →สีธงจะถูกวาดเป็นองค์ประกอบของรูปร่างที่เรียบง่าย แต่ฉันกังวลเกี่ยวกับการเขียนโค้ดการแสดงผลจำนวนมากสำหรับแต่ละรูปร่างที่แตกต่างกัน หลังจากไตร่ตรองอย่างถี่ถ้วนฉันรู้ว่าฉันสามารถทำให้พวกเขาทั้งหมดได้ด้วยการซ้อนทับและถอนเงินที่ชาญฉลาดด้วยรูปร่างหลอกเดียว: ทุกจุดในระยะที่กำหนดของจุดที่กำหนดซึ่งคำจำกัดความของ "ระยะทาง" เป็นตัวแปร ระยะกระดานหมากรุกให้สี่เหลี่ยมจัตุรัสระยะแมนฮัตตันให้เพชรและระยะยูคลิดให้วงกลม นี่หมายความว่าทุกรูปร่างมีพารามิเตอร์ห้าตัว (สี, โหมดระยะทาง, x, y,

"P3
690 690 4
"3a3*a690_@*a*qeuN/{0:U;{_'C<.5*:N;i[[8EX30:Q0Q9X60:ZQQCXQZQ]LLLL[F9TTQQ]Ca[9FTQ42QCTQ54QFTQ66Q9TQ78Q][E9TIQI9T42QI][9FTQZQ][FCXQQQ][E9T40QQET50QQ9TZQQET70QQ9T80QQ][FCTZQQ][E8YQQF][9FTQAQ9TQ9~Q][E9TZQQ][8ETTTQETZZQ][F9XQTK9XZQK9XQZK9XTQK][F4{4{JW^1&6*9+TJ)F*W)F*F}fJ}fW][CEX0ZZ][9FTQQF]Ea[E[TZ]_m*{CT@~24}/][F9TQQF][9FTAQQCT9~QQ][FCTTTQCTZZQ]C9$1>9a/Fa*+[9FTQQKCTQQA]9 6$1>Ca/Fa*+[C7{7\-_1&2*C+X@TT@F*}/]]=_!!{([TQQQ]+\+}*5/{~:R;.5-:H;.5-:G;:M;2b1>4f*:O;Z{ZQWQ-z-N*-{JG-{zM_!+#}:P~WH-PM{+}{e>}?RP<{WV+_2$=JU+Ott}*}fJ}fW}/U90+:U;}/V90+:V;}/`"[]"-

1
ยอดเยี่ยมนี่คือคำตอบที่สร้างสรรค์ที่ฉันกำลังมองหา จะพยายามเรียกใช้ในภายหลัง
เลเวลริเวอร์เซนต์

1
นี่อาจเป็นรหัส CJam ที่ยาวที่สุดที่ฉันเคยเห็น ทำได้ดีแม้ว่า +1
Alex A.

อีกครั้ง CJam ดูเหมือนจะบันทึกวัน
ASCIIThenANSI

9
น่าเสียดายที่การโพสต์รหัส CJam ยาวกว่า 200 ไบต์เป็นความผิดของรัฐบาลกลาง ฉันจะต้องนำคุณเข้าห้องขัง
Deusovi

2

PHP, 811 ไบต์

function f($s){echo"<body bgcolor=#ccc>";$z=split("\n",gzinflate(base64_decode("vVfNasMwDL7vKQK7xlT+iaHQ9LDTLnuIQus6ENhgxS19+kmO0yRrkhbqGIxtyV8sWbIkZ/Prjtm52p9suYbMHqqjPdHMVYfzx/elhBzyNbXtZoXQ7dvm+Q9+dieb7csvZFkJToNlEq6Zqeq6fAcw2arDqCKXUPMCEYQicIc1xmNfUkBDzXgQkpMQ3W0PEGF7fz49dT7IuSCQ1APJ5h9IKAIhdGn1jIHH6oUzvCpZzhtGjoDiePzuzAPJEkG1JPk1uw29G5rC7pxAvAFxuHqd+nQxpCP65S4gR6wzAkphE4rPHfbYaAueky59BrmrZ4wU0Ss8SES/pCNugMduiBSYs25oJTeBSYNMbHO6+bUg22PPhA8E5LCWhT3SFBjEwxaWiOMYD1+FtZSZxateEAZ7pvsEL7w1aQxD3HxLcmayfNA9ZeXzcdteJLm0H5ZITzAwolDkXeGwVAvlSzUOSDDkMRqRxDkuLquVecbKMRKFaESLSYOMg4b6qVHQMnkMns5jyZLBAnksRehirQWrwClEqakDNrqKpjqKpZ8K5rVYTFE56ZmCyT68KinJX+n/puFpyHXg4RRLwg1oW6YipqfimfJTt6/c6XIv6Tnc/HxNXIj+a9nORdwN5Qa3qzvGHw==")));while($c=ord(ucfirst($s))){$s=substr($s,1);echo$c<32?'<br>':($c^32?$z[$c-64]:$z[0]);}}

Blob ที่ถูกบีบอัดมีรหัส SVG สำหรับแต่ละแฟล็ก 26 จากนั้นวนรอบอย่างง่ายจะแยกและส่งภาพ SVG ที่สอดคล้องกับอักขระแต่ละตัวของอินพุต

ตัวอย่างผลลัพธ์สำหรับ "นี่คือ\nการทดสอบ":

<body bgcolor=#ccc><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h20v60h-20z fill=#f00 /><path d=M20,0h20v60h-20z fill=#fff /><path d=M40,0h20v60h-20z fill=#00f /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h30v60h-30z fill=#fff /><path d=M30,0h30v60h-30z fill=#f00 /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#ff0 /><path d=M15,30a15,15,0,0,1,30,0a15,15,0,0,1-30,0z fill=#000 /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#fff /><path d=M15,15h30v30h-30z fill=#00f /></svg><svg width=90 height=90 viewBox=0,0,90,90></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#ff0 /><path d=M15,30a15,15,0,0,1,30,0a15,15,0,0,1-30,0z fill=#000 /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#fff /><path d=M15,15h30v30h-30z fill=#00f /></svg><br><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h30v60h-30z fill=#00f /><path d=M45,30l15-30h-30v60h30z fill=#fff /></svg><svg width=90 height=90 viewBox=0,0,90,90></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h20v60h-20z fill=#f00 /><path d=M20,0h20v60h-20z fill=#fff /><path d=M40,0h20v60h-20z fill=#00f /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v30h-60z fill=#00f /><path d=M0,30h60v30h-60z fill=#fff /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#fff /><path d=M15,15h30v30h-30z fill=#00f /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h20v60h-20z fill=#f00 /><path d=M20,0h20v60h-20z fill=#fff /><path d=M40,0h20v60h-20z fill=#00f /></svg>

( คุณสามารถลองใช้งานได้ที่ ideoneแม้ว่าจะไม่แสดงหน้าเว็บให้คุณ)

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