Làm cho nước Mỹ (n Maps) trở lại tuyệt vời


16

Tiền thưởng mới! (Xem bên dưới)

Nhóm bản đồ của hy vọng tổng thống của đảng Cộng hòa Hoa Kỳ Ben Carson đang gặp một số rắc rối với bản đồ của họ (hình ảnh qua Washington Post ):

Bản đồ với một loạt các quốc gia di chuyển đến những địa điểm sai (bởi nhóm chiến dịch của Ben Carson) và một bản đồ thực sự của Hoa Kỳ bên cạnh nó

Vấn đề là họ không có Công cụ phù hợp cho công việc ™. Họ cần chương trình nhỏ gọn và đáng tin cậy nhất có thể, vì vậy họ không bao giờ phải lo lắng về việc tạo bản đồ nữa. Đó là lý do tại sao họ thuê bạn. Bạn cần lấy bản đồ này và xuất lại lần nữa với màu mong muốn:

Bản đồ trống của Hoa Kỳ với biên giới nhà nước được hiển thị

Bởi Theshibboleth [GFDL ( http://www.gnu.org/copyleft/fdl.html ) hoặc CC-BY-SA-3.0 ( http://creativecommons.org/licenses/by-sa/3.0/)] , thông qua Wikimedia Commons

Nếu bạn không biết tất cả các bang ở đâu (vì bạn không phải là người Mỹ ... hoặc bạn là người Mỹ), thì đây là bản đồ có tất cả các tên (Washington DC không bắt buộc cho thử thách này): Bản đồ của Hoa Kỳ với biên giới tiểu bang và tên trên đó

"Bản đồ Hoa Kỳ với tên tiểu bang 2". Được cấp phép theo CC BY-SA 3.0 qua Wikimedia Commons - https: //commons.wik mega.org/wiki/File:Map_of_USA_with_state_names_2.svg#/media/File:Map_of_USA_with_state_names_2.sv

Ví dụ: nếu đầu vào là Ohio, Indiana, Illinois;New York, New Jersey, Florida, bạn xuất ra: Bản đồ của các tiểu bang Hoa Kỳ với biên giới nhà nước.  Ohio, Indiana và Illinois có màu đỏ;  New York, New Jersey Florida có màu xanh lam.

Hình ảnh bản đồ trống có sẵn ở định dạng SVGPNG . Để thuận tiện cho bạn, đây là danh sách tất cả 50 tiểu bang theo thứ tự bảng chữ cái

Đây là một thử thách . Đầu ra phải là một tệp SVG hoặc hình ảnh. Chỉ đơn giản là hiển thị đầu ra trên màn hình là không đủ. Đầu vào phải được lấy từ STDIN hoặc bằng cách đọc tệp văn bản. Tôi linh hoạt với cách bạn định dạng đầu vào, mặc dù nó phải chứa tên đầy đủ của từng tiểu bang, với các trạng thái màu đỏ (Cộng hòa) được liệt kê đầu tiên và màu xanh lam (Dân chủ) thứ hai. Bất kỳ hai sắc thái riêng biệt của màu đỏ và màu xanh đều được chấp nhận cho màu. Tất nhiên, bạn có thể có hình ảnh bản đồ trống trong cùng thư mục với chương trình của bạn với bất kỳ tên tệp nào bạn muốn.

Tiêu chí chính xác

Nếu đầu ra của bạn là một tệp raster, thì nó phải có kích thước tối thiểu 800px x 495px và các dòng không được sai lệch so với kết quả của việc tăng tỷ lệ SVG lên cùng kích thước hơn 1,5 pixel. Nếu đầu ra của bạn là một tệp vectơ, các dòng không được lệch khỏi SVG hơn 1,5 pixel khi cả hai được chia tỷ lệ thành 800px x 495px.

Tặng kem!

Ben đang cố gắng cắt giảm sự phụ thuộc vào các thư viện nước ngoài và hiện đang cung cấp phần thưởng -50% cho bất kỳ ai chỉ sử dụng phiên bản đồ họa raster của bản đồ làm đầu vào và tạo thuật toán riêng để phát hiện khu vực. Cuối cùng, phán đoán của tôi là quyết định xem cách tiếp cận của bạn có được tính là thuật toán "viết của riêng bạn" hay không.

Chúc may mắn!


ví dụ cho thấy một số răng cưa xung quanh các dòng chưa được điền vào. Điều đó có được chấp nhận không?
Sparr

@Sparr Tôi đã làm ví dụ với trình chỉnh sửa hình ảnh, vì vậy tôi coi nó là "hoàn hảo", vì vậy nếu bạn bỏ lỡ bất cứ điều gì mà nó bỏ lỡ thì không sao.
geokavel

Chỉ cần chắc chắn: chúng ta có được phép sửa đổi tệp SVG trống không? Có kích thước của nó tính trong điểm số của chúng tôi? Ý bạn là gì khi "chỉ hiển thị đầu ra trên màn hình là không đủ"?
Hố đen

@Blackhole Không, bạn không thể sửa đổi tệp SVG trống, nhưng nó không được tính là một phần của điểm số của bạn miễn là bạn tải nó ra bên ngoài.
geokavel

@Blackhole Ý tôi là, bạn phải xuất một tệp.
geokavel

Câu trả lời:


7

Con trăn 626

Trong cách tiếp cận bên dưới, tôi đã thêm .rstate và .bstate dựa trên .state trong mô tả CSS. Trong tôi đã đổi tên tệp .svg được cung cấp thành v.svg. Nó nhận một đầu vào như được mô tả dưới đây và ghi vào một tập tin w.png. Để chuyển từ tên trạng thái đầy đủ sang phiên bản rút gọn, tôi tìm chúng dựa trên hai chữ cái đầu tiên và cuối cùng của các trạng thái.

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()

Ví dụ đầu vào:

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

Ví dụ đầu ra: con số đầu ra

Hoặc lấy cảm hứng từ lá cờ của Pháp: pháp đầu ra


Đẹp một, dân chủ sống!
geokavel

Xin chúc mừng, bạn là người chiến thắng! Cảm ơn tất cả những người tham gia!
geokavel

6

Đang xử lý, 425 byte (tệp 259 byte + 1 +165 byte)

Mã số:

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");

Bản đồ trống phải được đặt tên là " M.svg " và được lưu trữ trong một thư mục có tên / data (tất cả các tệp khác nằm trong cùng thư mục với chương trình.)

Tệp đầu vào (" a "):

Mississippi
California
Connecticut

Delaware
Florida
Wyoming
Hawaii

Tệp chính (" b "): http://pastebin.com/0pNufAH9

Đầu ra (" m.tif "):

nhập mô tả hình ảnh ở đây

Ok, đây là thử thách của tôi ở thử thách của riêng tôi. Một số lưu ý:

  • Bản đồ đầu ra trông khác với bản đồ đầu vào theo các cách sau
    1. Bản đồ đầu vào có màu xám trên nền trong suốt. Đầu ra có màu trắng trên nền xám. Tôi nghĩ điều này nên được cho phép, bởi vì màu trắng, xám và trong suốt đều trung tính.
    2. Bản đồ đầu ra thiếu các dòng xung quanh Hawaii và Alaska mà đầu vào có. Một lần nữa, tôi nghĩ điều này là ổn vì các dòng không phải là một phần quan trọng của bản đồ.
  • Chương trình sử dụng một tập tin bên ngoài để giữ các phím. Theo bài đăng meta này , tôi chỉ cần thêm 1 byte cho một tệp bổ sung.

Nếu bất cứ ai có bất kỳ sự khác biệt nào với việc tôi tự xét xử mã của mình, vui lòng để lại nhận xét.

Ngoài ra, nếu bất kỳ ai tò mò về việc thử thách này trong Xử lý , thì nó hỗ trợ cả việc đọc các tệp SVG thành PShape, cũng như phân tích các tệp SVG dưới dạng XML.


Đối với vòng lặp for của bạn, có for(int i=0;i++<51;)thay vì for(int i=0;i<51;i++). Nó tiết kiệm 1 byte và nó có khuôn mặt cười trong đó;)
Kritixi Lithos

@ Κρτκσ Tôi phải làm ++icho nó hoạt động. Nghe có đúng không?
geokavel

@ Κρτκσ Nó có thể lưu một byte, nhưng nó thay đổi hoàn toàn hành vi bên trong vòng lặp.
Tom Carpenter

@ Κρτκσ Có lẽ nó hoạt động khác nhau trong Java và các ngôn ngữ khác.
geokavel

Bạn đã có thêm một không gian vô dụng tạiString[] a
Kritixi Lithos

5

PHP, 714 byte

Đầu ra là tệp SVG trống, sẽ được lưu trữ trong một tệp có tên a, với CSS bổ sung để tô màu các trạng thái, sẽ được lưu trữ trong một tệp có tên btheo định dạng sau:

Ohio0Indiana0Illinois1New York0New Jersey0Florida

Tôi đã thêm một số dòng mới để dễ đọc.

<?
$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)));

Đây là phiên bản chưa được chỉnh sử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
);

Nguyên tắc rất đơn giản: trong SVG trống, mỗi đường dẫn có ID tương ứng với tên viết tắt của trạng thái mà nó đại diện (ví dụ, <path d="…" id="HI" />đối với Hawaii).

Tất cả chúng ta phải làm là thêm một số CSS để tô màu đường dẫn này trong bóng râm thích hợp. Nhưng đã có một số CSS trong tệp trống (cụ thể là <style type="text/css">…</style>thẻ đã tồn tại), vì vậy việc thực hiện nó rất dễ dàng và ngắn gọn. Chúng ta có thể nhận thấy hơn chuỗi .bchỉ được tìm thấy trong CSS cho .border. Tin tốt! Chúng tôi sẽ chỉ thay thế .bbằng OUR_WONDERFUL_CSS.b.

Tạo "CSS tuyệt vời của chúng tôi" không thực sự khó khăn hơn:

  1. Đọc đầu vào từ tệp :
    Ohio0Indiana0Illinois1New York0New Jersey0Florida.
  2. Thay thế tên của các tiểu bang bằng chữ viết tắt :
    OH0IN0IL1NY0NJ0FL.
  3. Thay thế các 0ký tự bằng ,#:
    OH,#IN,#IL1NY,#NJ,#FL.
  4. Thay thế 1ký tự bằng {fill:red}#:
    OH,#IN,#IL{fill:red}#NY,#NJ,#FL.
  5. Thêm #vào đầu và {fill:blue}cuối :
    #OH,#IN,#IL{fill:red}#NY,#NJ,#FL{fill:blue}.

Ok, công việc tuyệt vời. Mặc dù về mặt kỹ thuật, nó không ghi một tập tin như tôi muốn, người dùng có thể dễ dàng lưu hình ảnh bằng cách nhấn "Lưu trang dưới dạng" trong trình duyệt. Tôi sẽ cho phép loại câu trả lời này.
geokavel

3
Điều thú vị là các chữ viết tắt của Pennsylvania, Rhode Island và South Carolina đánh vần PARIS.
geokavel

@geokavel Tôi có thể dễ dàng tạo một tập tin, nếu cần thiết. Tôi có nên sửa đổi câu trả lời của mình? Đúng, Paris sống lâu! Nhân tiện, cảm ơn sự hỗ trợ của bạn trong thời điểm khó khăn này, anh em ngoài Đại Tây Dương!
Hố đen

@DavidCarraher Tôi đã thêm một số giải thích. Tôi hy vọng nó sẽ giúp bạn hiểu câu trả lời của tôi.
Hố đen

+1 cho implodevà tên người dùng của bạn!
caird coinheringaahing

3

Toán học 1025

Không thanh lịch nhưng nó hoạt động.

Tôi không biết rằng các tệp SVG có đường dẫn cho từng trạng thái, vì vậy tôi đã tìm thấy các trạng thái sử dụng MorphologicalComponentsvà sau đó liên kết từng thành phần với trạng thái tương ứng. Các tiểu bang như Michigan (với bán đảo trên và dưới) và Hawaii (nhiều đảo) có nhiều hơn một thành phần.

Mã này giả định rằng tệp bản đồ được chứa trong biến, m .

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}}]])]

Dưới đây là hình ảnh sẽ được xuất bởi đầu vào sau:

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

bản đồ

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.