使美国(n个地图)再次伟大


16

新奖金!(见下文)

美国共和党总统候选人本·卡森(Ben Carson)的制图小组的地图遇到了一些麻烦(图片来自《华盛顿邮报》):

由一堆州移动到错误位置的地图(由本·卡森的竞选团队提供),旁边是美国的真实地图

问题在于他们没有适用于Job™的正确工具。他们需要最紧凑,最可靠的程序,因此不必担心再次制作地图。这就是他们雇用您的原因。您需要拍摄此地图,然后以所需的颜色再次输出它:

显示国家边界的美国空白地图

通过Theshibboleth [GFDL(http://www.gnu.org/copyleft/fdl.html)或CC-BY-SA-3.0(http://creativecommons.org/licenses/by-sa/3.0/)],通过维基共享资源

如果您不知道所有州的位置(因为您不是美国人...或者您是美国人),那么下面是一张包含所有名称的地图(此挑战不需要华盛顿特区): 美国地图,上面有州界和名称

“带有州名2的美国地图”。通过Wikimedia Commons在CC BY-SA 3.0下获得许可-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,则输出: 具有州界的美国地图。 俄亥俄州,印第安纳州和伊利诺伊州为红色。 纽约州新泽西州佛罗里达州以蓝色上色。

空白地图图像有SVGPNG格式。为方便起见,以下是按字母顺序排列所有50个州的列表

这是挑战。输出必须为SVG或图像文件。仅在屏幕上显示输出是不够的。输入必须来自STDIN或读取文本文件。我对如何设置输入的格式很灵活,尽管它应该包含每个州的全名,但红色(共和党)州名列第一,蓝色(民主)州名列第二。可以接受红色和蓝色的任意两种不同的阴影。当然,您可以使用所需的任何文件名将空白地图图像与程序放在同一文件夹中。

准确性标准

如果您的输出是栅格文件,则其大小必须至少为800px x 495px,并且这些行不应偏离将SVG缩放到相同大小超过1.5像素的结果。如果您的输出是矢量文件,则当两行都缩放到800px x 495px时,行与SVG的偏差不应超过1.5个像素。

奖金!

Ben试图减少对外国图书馆的依赖,现在向只使用地图的光栅图形版本作为输入并创建自己的区域检测算法的人提供-50%的奖励。最终,由我的判断决定您的方法是否算作“编写自己的”算法。

祝好运!


该示例显示了尚未填充的行周围的一些别名。这可以接受吗?
Sparr

@Sparr我使用图像编辑器制作了该示例,因此我认为它是“完美的”,因此,如果您错过任何错过的事情,那都很好。
geokavel 2015年

只是要确保:我们允许修改空白的SVG文件吗?它的大小会计入我们的分数吗?“仅在屏幕上显示输出还不够”是什么意思?
Blackhole,2015年

@Blackhole不能,您不能修改空白的SVG文件,但是只要您从外部加载它,它就不会计入分数。
geokavel 2015年

@Blackhole我的意思是,您必须输出一个文件。
geokavel 2015年

Answers:


7

Python 626

在下面的方法中,我在CSS描述中基于.state添加了.rstate和.bstate。在我中,我将提供的.svg文件重命名为v.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个字节+ 1个+165字节文件)

码:

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. 输出地图缺少输入所包含的夏威夷和阿拉斯加周围的线。再一次,我认为这是可以的,因为线条不是地图的重要部分。
  • 该程序使用一个外部文件来保存密钥。根据此meta post,我只需要为一个其他文件添加1个字节。

如果有人对我对代码的自我判断有任何差异,请随时发表评论。

另外,如果有人对在Processing中尝试解决此挑战感到好奇,它既支持将SVG文件读取到中,也支持将SVG文件PShape解析为XML。


对于for循环,请使用for(int i=0;i++<51;)代替for(int i=0;i<51;i++)。它节省了1个字节,并且里面有一个笑脸;)
Kritixi Lithos 2015年

@ΚριτικσιΛίθος我必须使它++i工作。听起来对吗?
geokavel

@ΚριτικσιΛίθος它可能会保存一个字节,但是会完全改变循环内的行为。
汤姆·卡彭特

@ΚριτικσιΛίθος是的,我想我不能用那个了,因为我输了夏威夷。也许它在Java和其他语言中的工作方式有所不同。
geokavel

您在String[] a
Kritixi Lithos 2015年

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,然后将每个组件与其各自的状态相关联。密歇根州(有上下半岛)和夏威夷州(有多个岛屿)等州有多个组成部分。

该代码假定映射文件包含在变量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}}]])]

以下是将通过以下输入导出的图像:

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

地图

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.