ทำให้อเมริกา (n Maps) ยอดเยี่ยมอีกครั้ง


16

โบนัสใหม่! (ดูด้านล่าง)

ทีมทำแผนที่ของ Ben Carson ที่หวังว่าจะได้รับปัญหาจากแผนที่ (ภาพทางWashington Post ):

แผนที่ที่มีกลุ่มของรัฐย้ายไปอยู่ผิดที่ (โดยทีมหาเสียงของ Ben Carson) และแผนที่จริงของสหรัฐอเมริกาข้างๆ

ปัญหาคือพวกเขาไม่มีเครื่องมือที่เหมาะสมสำหรับงาน™ พวกเขาต้องการโปรแกรมที่กะทัดรัดและน่าเชื่อถือที่สุดเท่าที่จะเป็นไปได้ดังนั้นพวกเขาจึงไม่ต้องกังวลกับการทำแผนที่อีกครั้ง นั่นเป็นเหตุผลที่พวกเขาจ้างคุณ คุณต้องใช้แผนที่นี้และส่งออกอีกครั้งด้วยสีที่ต้องการ:

แผนที่เปล่าของประเทศสหรัฐอเมริกาที่แสดงเส้นขอบรัฐ

โดย Theshibboleth [GFDL ( http://www.gnu.org/copyleft/fdl.html ) หรือ CC-BY-SA-3.0 ( http://creativecommons.org/licenses/by-sa/3.0/)ผ่านทาง Wikimedia Commons

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

"แผนที่อเมริกาพร้อมชื่อรัฐ 2" ได้รับอนุญาตภายใต้ CC BY-SA 3.0 ผ่าน Wikimedia Commons - https://commons.wikimedia.org/wiki/File:Map_of_USA_with_state_names_2.svg#/media/File:Map_of_USA_with_state_names_2.svg

ตัวอย่างเช่นถ้าอินพุตOhio, Indiana, Illinois;New York, New Jersey, Floridaคุณเอาต์พุต: แผนที่ของประเทศสหรัฐอเมริกาที่มีเส้นขอบของรัฐ  โอไฮโออินดีแอนาและอิลลินอยส์มีสีแดง;  New York, New Jersey Florida มีสีฟ้า

ภาพแผนที่เปล่ามีให้ในรูปแบบSVGและPNG เพื่อความสะดวกของคุณนี่คือรายการของทั้ง 50 รัฐตามลำดับตัวอักษร

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

เกณฑ์ความแม่นยำ

หากเอาต์พุตของคุณเป็นไฟล์แรสเตอร์จะต้องมีอย่างน้อย 800px โดย 495px และบรรทัดไม่ควรเบี่ยงเบนจากผลลัพธ์ของการปรับขนาด SVG ให้มีขนาดเดียวกันมากกว่า 1.5 พิกเซล หากผลลัพธ์ของคุณเป็นไฟล์เวกเตอร์บรรทัดไม่ควรเบี่ยงเบนจาก SVG มากกว่า 1.5 พิกเซลเมื่อทั้งคู่ถูกปรับเป็น 800px คูณ 495px

โบนัส!

เบ็นพยายามลดการพึ่งพาห้องสมุดต่างประเทศและตอนนี้ได้เสนอโบนัส-50%ให้กับทุกคนที่ใช้แผนที่กราฟิกแรสเตอร์ในรูปแบบอินพุตและสร้างอัลกอริทึมของตนเองสำหรับการตรวจจับภูมิภาค ในที่สุดมันเป็นการตัดสินใจของฉันที่กำหนดว่าวิธีการของคุณนับเป็นอัลกอริทึม "เขียนของคุณเอง"

โชคดี!


ตัวอย่างแสดงนามแฝงรอบ ๆ บรรทัดที่ยังไม่ได้กรอกเป็นที่ยอมรับได้หรือไม่
Sparr

@Sparr ฉันทำตัวอย่างด้วยโปรแกรมแก้ไขภาพดังนั้นฉันคิดว่ามันเป็น "สมบูรณ์แบบ" ดังนั้นถ้าคุณคิดถึงอะไรก็ตามที่คิดถึงมันก็ไม่เป็นไร
geokavel

เพื่อให้แน่ใจว่า: เราได้รับอนุญาตให้แก้ไขไฟล์ SVG เปล่าหรือไม่ ขนาดของมันจะถูกนับในคะแนนของเราหรือไม่? คุณหมายถึงอะไรโดย "เพียงแค่แสดงผลบนหน้าจอไม่เพียงพอ"?
Blackhole

@Blackhole ไม่คุณไม่สามารถแก้ไขไฟล์ SVG เปล่าได้ แต่จะไม่นับเป็นส่วนหนึ่งของคะแนนของคุณตราบใดที่คุณโหลดจากภายนอก
geokavel

@Blackhole สิ่งที่ฉันหมายถึงคือคุณต้องส่งออกไฟล์
geokavel

คำตอบ:


7

Python 626

ในวิธีการด้านล่างฉันเพิ่ม. รัฐและ. รัฐตาม. รัฐในคำอธิบาย CSS ในฉันฉันเปลี่ยนชื่อไฟล์v.svg. svg ที่ระบุเป็น w.pngมันต้องใช้เวลาการป้อนข้อมูลตามที่อธิบายไว้ด้านล่างและเขียนไปยังแฟ้ม ในการถ่ายโอนจากชื่อเต็มของรัฐไปยังเวอร์ชันย่อฉันค้นหาโดยใช้ตัวอักษรสองตัวแรกและตัวสุดท้ายของรัฐ

r='Ama,Aka,Ana,Aas,Cia,Cdo,Cut,Dre,Fda,Gia,Hii,Iho,Iis,Ina,Iwa,Kas,Kky,Lna,Mne,Mnd,Mts,Man,Mta,Mpi,Mri,Mna,Nka,Nda,Nre,Ney,Nco,Nrk,Nna,Nta,Oio,Oma,Oon,Pia,Rnd,Sna,Sta,Tee,Tas,Uah,Vnt,Via,Won,Wia,Win,Wng'.split(',')
y='lkzraotelaidlnasyaedainsotevhjmycdhkraicdnxttaaviy'
v=open('v.svg','r')
s=v.read()
v.close()
k=s.find('.state')
j=s.find('.',k+1)
t=input().split(';')
w=open('w.svg','w')
k+=1
c='#E0E0E0'
s=s[:j]+'.r'+s[k:j].replace(c,'red')+'.b'+s[k:j].replace(c,'blue')+s[j:]
c='rb'
for j in range(2):
 for d in t[j].split(','):k=s.find('state '+d[0].lower()+y[r.index(d[0]+d[-2:])]);s=s[:k]+c[j]+s[k:]
w.write(s)
w.close()

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

'California,Illinois,Iowa,Mississippi;New Mexico,Pennsylvania,South Dakota,Vermont'

ตัวอย่างผลลัพธ์: รูปที่การส่งออก

หรือได้รับแรงบันดาลใจจากธงชาติฝรั่งเศส: ฝรั่งเศสร่างเอาท์พุท


เป็นคนดีประชาธิปไตยใช้ชีวิตอยู่!
geokavel

ขอแสดงความยินดีคุณเป็นผู้ชนะ! ขอบคุณทุกคนที่เข้าร่วม!
geokavel

6

กำลังดำเนินการ 425 ไบต์ (259 ไบต์ + ไฟล์ 1165 ไบต์)

รหัส:

size(959,593);String[]a=loadStrings("a"),b=loadStrings("b");PShape m=loadShape("M.svg");m.disableStyle();for(int i=0;i<51;i++){fill(255);int r=0;for(String j:a){if(j.isEmpty())r++;if(j.contains(b[i]))fill(r>0?#0000FF:#FF0000);}shape(m.getChild(i));}save("m");

แผนที่เปล่าควรมีชื่อว่า " M.svg " และเก็บไว้ในโฟลเดอร์ชื่อ/ data (ไฟล์อื่น ๆ ทั้งหมดอยู่ในโฟลเดอร์เดียวกับโปรแกรม)

อินพุตไฟล์ (" a "):

Mississippi
California
Connecticut

Delaware
Florida
Wyoming
Hawaii

ไฟล์กุญแจ (" b "): http://pastebin.com/0pNufAH9

เอาต์พุต (" m.tif "):

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

ตกลงนี่คือความพยายามของฉันในการท้าทายของฉันเอง หมายเหตุบางส่วน:

  • แผนที่แสดงผลแตกต่างจากแผนที่ป้อนเข้าด้วยวิธีดังต่อไปนี้
    1. แผนที่อินพุตมีการเติมสีเทาบนพื้นหลังโปร่งใส เอาต์พุตมีการเติมสีขาวบนพื้นหลังสีเทา ฉันคิดว่านี่ควรได้รับอนุญาตเพราะสีขาวสีเทาและความโปร่งใสล้วนเป็นกลาง
    2. แผนที่เอาท์พุทไม่มีเส้นรอบ ๆ ฮาวายและอลาสก้าที่อินพุตมี อีกครั้งฉันคิดว่ามันโอเคเพราะเส้นไม่ได้เป็นส่วนสำคัญของแผนที่
  • โปรแกรมใช้ไฟล์ภายนอกเพื่อเก็บกุญแจ ตามโพสต์เมตานี้ฉันต้องเพิ่ม 1 ไบต์สำหรับไฟล์เพิ่มเติมหนึ่งไฟล์

หากใครมีความแตกต่างกับการตัดสินใจด้วยตนเองของรหัสของฉันอย่าลังเลที่จะแสดงความคิดเห็น

นอกจากนี้หากใครอยากรู้อยากเห็นเกี่ยวกับการลองใช้ความท้าทายนี้ในการประมวลผลก็รองรับทั้งการอ่านไฟล์ SVG ลงในPShapeของเช่นเดียวกับการแยกไฟล์ SVG เป็น XML


สำหรับสำหรับวงของคุณมีแทนfor(int i=0;i++<51;) for(int i=0;i<51;i++)มันจะช่วยประหยัด 1 ไบต์และมีใบหน้าที่ยิ้มในนั้น;)
Kritixi Lithos

@ ΚριτικσιΛίθοςฉันต้องทำให้มัน++iใช้งานได้ เสียงนั้นใช่ไหม
geokavel

@ ΚριτικσιΛίθοςมันอาจบันทึกไบต์ แต่เปลี่ยนพฤติกรรมภายในลูปได้อย่างสมบูรณ์
Tom Carpenter

@ ΚριτικσιΛίθοςใช่ฉันเดาว่าฉันไม่สามารถใช้มันเพราะฉันเสียฮาวาย อาจจะใช้งานได้แตกต่างใน Java แล้วภาษาอื่น ๆ
geokavel

คุณมีพื้นที่ว่างเปล่าพิเศษที่String[] a
Kritixi Lithos

5

PHP, 714 ไบต์

เอาต์พุตเป็นไฟล์ SVG เปล่าซึ่งควรเก็บไว้ในไฟล์ที่มีชื่อaโดยมี CSS เพิ่มเติมเพื่อกำหนดสีซึ่งควรเก็บไว้ในไฟล์ที่มีชื่อbในรูปแบบต่อไปนี้:

Ohio0Indiana0Illinois1New York0New Jersey0Florida

ฉันได้เพิ่มบรรทัดใหม่เพื่อให้สามารถอ่านได้

<?
$x=str_replace;echo$x('.b','#'.$x([0,1],[',#','{fill:red}#'],$x(split(0,'Alabama0Alaska0
Arizona0Arkansas0California0Colorado0Connecticut0Delaware0Florida0Georgia0Hawaii0Idaho0Illin
ois0Indiana0Iowa0Kansas0Kentucky0Louisiana0Maine0Maryland0Massachusetts0Michigan0Minnesota0M
ississippi0Missouri0Montana0Nebraska0Nevada0New Hampshire0New Jersey0New Mexico0New York0Nor
th Carolina0North Dakota0Ohio0Oklahoma0Oregon0Pennsylvania0Rhode Island0South Carolina0South
 Dakota0Tennessee0Texas0Utah0Vermont0Virginia0Washington0West Virginia0Wisconsin0Wyoming'),s
tr_split(ALAKAZARCACOCTDEFLGAHIIDILINIAKSKYLAMEMDMAMIMNMSMOMTNENVNHNJNMNYNCNDOHOKORPARISCSDT
NTXUTVTVAWAWVWIWY,2),file(b)[0])).'{fill:blue}.b',implode('',file(a)));

นี่คือรุ่นที่ไม่ได้แต่งแต้ม:

<?php
$stateNames = 'Alabama0Alaska0Arizona0Arkansas0California0Colorado0Connecticut0Delaware0Florida0Georgia0Hawaii0Idaho0Illinois0Indiana0Iowa0Kansas0Kentucky0Louisiana0Maine0Maryland0Massachusetts0Michigan0Minnesota0Mississippi0Missouri0Montana0Nebraska0Nevada0New Hampshire0New Jersey0New Mexico0New York0North Carolina0North Dakota0Ohio0Oklahoma0Oregon0Pennsylvania0Rhode Island0South Carolina0South Dakota0Tennessee0Texas0Utah0Vermont0Virginia0Washington0West Virginia0Wisconsin0Wyoming';
$statesAbbreviations = 'ALAKAZARCACOCTDEFLGAHIIDILINIAKSKYLAMEMDMAMIMNMSMOMTNENVNHNJNMNYNCNDOHOKORPARISCSDTNTXUTVTVAWAWVWIWY';

$blankSVG = implode('', file('a'));

$inputWithStateNames = file('b')[0];
$inputWithStateAbbreviations = str_replace(
    explode('0', $stateNames),
    str_split($statesAbbreviations, 2),
    $inputWithStateNames
);

echo str_replace(
    '.border',
    '#'. str_replace(
        [
            '0',
            '1'
        ],
        [
            ',#',
            '{fill:red}#'
        ],
        $inputWithStateAbbreviations
    ) .'{fill:blue}.border',
    $blankSVG
);

หลักการง่าย ๆ : ใน SVG ที่ว่างเปล่าแต่ละพา ธ มี ID ที่สอดคล้องกับตัวย่อของสถานะที่แสดง (เช่น<path d="…" id="HI" />สำหรับฮาวาย)

สิ่งที่เราต้องทำคือการเพิ่ม CSS เพื่อกำหนดเส้นทางนี้ในเฉดสีที่เหมาะสม แต่มี CSS บางอย่างในไฟล์เปล่า (โดยเฉพาะ<style type="text/css">…</style>แท็กที่มีอยู่แล้ว) ดังนั้นจึงเป็นเรื่องง่ายและสั้นที่จะทำ เราสามารถสังเกตได้ว่าสตริง.bพบได้ใน CSS สำหรับ.borderเท่านั้น ข่าวดี! เราก็จะเปลี่ยนด้วย.bOUR_WONDERFUL_CSS.b

การสร้าง "CSS ที่ยอดเยี่ยมของเรา" ไม่ใช่เรื่องยาก:

  1. อ่านอินพุตจากไฟล์:
    Ohio0Indiana0Illinois1New York0New Jersey0Florida.

  2. OH0IN0IL1NY0NJ0FLเปลี่ยนชื่อของรัฐที่มีตัวย่อของพวกเขา
  3. แทนที่0อักขระด้วย,#:
    OH,#IN,#IL1NY,#NJ,#FL.
  4. แทนที่1อักขระด้วย{fill:red}#:
    OH,#IN,#IL{fill:red}#NY,#NJ,#FL.
  5. เพิ่ม#ที่จุดเริ่มต้นและที่สิ้นสุด:{fill:blue}
    #OH,#IN,#IL{fill:red}#NY,#NJ,#FL{fill:blue}

โอเคเยี่ยมมาก ในขณะที่ในทางเทคนิคแล้วมันไม่ได้เขียนไฟล์อย่างที่ฉันต้องการผู้ใช้สามารถบันทึกภาพได้อย่างง่ายดายโดยการกด "บันทึกหน้าเป็น" ในเบราว์เซอร์ ฉันจะอนุญาตคำตอบประเภทนี้
geokavel

3
น่าสนใจว่าตัวย่อสำหรับเพนซิลเวเนียโรดไอส์แลนด์และเซาท์แคโรไลนาสะกดคำว่า PARIS
geokavel

@geokavel ฉันสามารถสร้างไฟล์ได้อย่างง่ายดายหากจำเป็น ฉันควรแก้ไขคำตอบของฉันหรือไม่ อ๋อปารีสอยู่นาน! ขอขอบคุณสำหรับการสนับสนุนในช่วงเวลาที่ยากลำบากนี้พี่น้องทั้งหลายที่อยู่เหนือมหาสมุทรแอตแลนติก!
Blackhole

@DavidCarraher ฉันได้เพิ่มคำอธิบายบางอย่างแล้ว ฉันหวังว่ามันจะช่วยให้คุณเข้าใจคำตอบของฉัน
Blackhole

+1 สำหรับimplodeและชื่อผู้ใช้ของคุณ!
caird coinheringaahing

3

Mathematica 1025

ไม่หรูหรา แต่ใช้งานได้

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

รหัสสันนิษฐานว่าแฟ้มแผนที่ที่มีอยู่ในตัวแปร เมตร

r=Thread[{"Washington","Montana","Maine","Minnesota","North Dakota","Oregon","Michigan","New Hampshire","Vermont","Wisconsin","New York","Idaho","South Dakota","Wyoming","Massachusetts","California","Connecticut","Nevada","Pennsylvania","Iowa","New Mexico","New Jersey","Ohio","Nebraska","Illinois","Indiana","Colorado","Delaware","Maryland","West Virginia","Virginia","Missouri","Washington, D.C.","Kansas","Kentucky","North Carolina","New Mexico","Tennessee","Arizona","Oklahoma","Arkansas","South Carolina","Georgia","Alabama","Mississippi","Texas","Louisiana","Alaska","Florida","Hawaii"}->{6,7,8,9,10,11,{13,23},14,16,18,{19,39},20,24,25,26,27,31,32,36,37,38,40,41,42,43,44,45,46,{47,55},49,50,51,52,53,56,57,58,59,60,61,62,65,66,67,69,{71,80,87},72,{73,75,82,93,101,104},74,{79,81,83,84,85,89,92}}]; 
v=Flatten;c=MorphologicalComponents@Binarize@m;
h@s_:=v[((Reverse/@Position[c,#])/.{x_,y_}:>{x,1241-y})&/@s,1]
k@{s_,c_}:=Thread[(h@s)->c]
f@{a_,b_}:=Export["f.jpg",(ReplacePixelValue[map,v[k[{v[#/.r],#2}]&@@@{{a,Red},{b,Blue}}]])]

ด้านล่างเป็นภาพที่จะส่งออกโดยอินพุตต่อไปนี้:

f[{{"Ohio", "Indiana", "Illinois", "Alaska"}, {"New York", "Michigan","Oregon", "New Jersey", "Florida"}}]

แผนที่

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