미국을 다시 위대하게 만드십시오


16

새로운 보너스! (아래 참조)

미국 공화당 대통령 희망 벤 벤슨의지도 제작 팀은지도에 문제가 있습니다 ( 워싱턴 포스트 를 통한 이미지 ).

여러 국가의지도가 잘못된 장소 (Ben Carson의 캠페인 팀에 의해)와 그 옆에있는 미국의 실제지도로 이동했습니다.

문제는 그들이 올바른 직업을위한 도구를 가지고 있지 않다는 것입니다. 가장 작고 안정적인 프로그램이 필요하므로지도를 다시 만들지 않아도됩니다. 그들이 당신을 고용 한 이유입니다. 이 맵을 가져 와서 원하는 색상으로 다시 출력해야합니다.

주 경계가 표시된 미국의 빈 맵

Theshibboleth [GFDL ( http://www.gnu.org/copyleft/fdl.html ) 또는 CC-BY-SA-3.0 ( http://creativecommons.org/licenses/by-sa/3.0/)] 으로 위키 미디어 공용

미국이 아니거나 미국인이기 때문에 모든 주가 어디에 있는지 모르는 경우 여기에 모든 이름의지도가 있습니다 (이 도전에는 워싱턴 DC가 필요하지 않음). 주 경계와 이름이있는 미국의지도

"주 이름이 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경우 다음을 출력합니다. 주 경계가있는 미국지도  오하이오, 인디애나 및 일리노이는 붉은 색입니다.  뉴욕, 뉴저지 플로리다는 파란색으로 표시됩니다.

빈 맵 이미지는 SVGPNG 형식으로 제공됩니다. 귀하의 편의를 위해 다음은 알파벳 순서모든 50 개 주 목록입니다.

이것은 문제입니다. 출력은 SVG 또는 이미지 파일이어야합니다. 단순히 화면에 출력을 표시하는 것만으로는 충분하지 않습니다. STDIN 또는 텍스트 파일을 읽어 입력해야합니다. 입력의 형식을 유연하게 지정할 수 있지만 각 상태의 전체 이름을 포함해야하지만 빨간색 (공화당) 상태가 먼저 나열되고 파란색 (민주적) 상태가 두 번째입니다. 채색에는 빨강과 파랑의 두 가지 음영이 허용됩니다. 물론 원하는 파일 이름으로 프로그램과 같은 폴더에 빈 맵 이미지를 만들 수 있습니다.

정확도 기준

출력이 래스터 파일 인 경우 파일 크기는 800x495 픽셀 이상이어야하며 SVG를 동일한 크기로 1.5 픽셀 이상 확장 한 결과에서 선이 벗어나지 않아야합니다. 출력이 벡터 파일 인 경우 둘 다 800px x 495px로 크기가 조정될 때 선이 SVG에서 1.5 픽셀 이상 벗어나지 않아야합니다.

보너스!

벤은 외국 도서관에 대한 의존도를 줄이려고 노력하고 있으며 현재 래스터 그래픽 버전의지도 만 입력으로 사용하고 지역 감지를위한 자체 알고리즘을 생성하는 모든 사람에게 -50 %의 보너스를 제공하고 있습니다. 궁극적으로, 여러분의 접근 방식이 "자신의 작성"알고리즘으로 계산되는지 여부를 결정하는 것은 저의 판단입니다.

행운을 빕니다!


이 예제는 채워지지 않은 라인 주위의 앨리어싱을 보여줍니다.
Sparr

@Sparr 저는 이미지 편집기로 예제를 만들었으므로 "완벽한"것으로 간주합니다. 그리워하는 부분을 놓치면 괜찮습니다.
geokavel

빈 SVG 파일을 수정할 수 있습니까? 그 점수는 우리의 점수에 포함됩니까? "화면에 출력을 간단히 표시하는 것만으로는 충분하지 않다"는 것은 무엇을 의미합니까?
블랙홀

@Blackhole 아니요, 빈 SVG 파일은 수정할 수 없지만 외부에로드하는 한 점수의 일부로 계산되지 않습니다.
geokavel

@Blackhole 내 말은 파일을 출력해야한다는 것입니다.
geokavel

답변:


7

파이썬 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. 출력 맵에 입력이 가지고있는 하와이와 알래스카 주변의 선이 누락되었습니다. 다시 한번, 선이지도의 중요한 부분이 아니기 때문에 이것이 정상이라고 생각합니다.
  • 프로그램은 외부 파일을 사용하여 키를 보유합니다. 이 메타 포스트 에 따르면 하나의 파일에 1 바이트를 추가하면됩니다.

내 코드에 대한 본인의 판결과 불일치가있는 사람은 언제든지 의견을 남겨주십시오.

또한 Processing 에서이 도전을 시도하는 사람이 궁금하다면 PShapeSVG 파일을 XML 로 읽는 것뿐만 아니라 SVG 파일을 XML로 파싱 하는 것을 모두 지원합니다 .


for 루프의 경우 for(int i=0;i++<51;)대신 사용하십시오 for(int i=0;i<51;i++). 그것은 1 바이트를 절약하고 그것에 웃는 얼굴을 가지고;)
user41805

@ ΚριτικσιΛίθος 나는 ++i그것이 작동하도록해야했다. 그 소리가 맞습니까?
geokavel

@ ΚριτικσιΛίθος 바이트를 절약 할 수 있지만 루프 내부의 동작을 완전히 변경합니다.
톰 카펜터

@ ΚριτικσιΛίθος 그래, 내가 하와이를 잃었 기 때문에 나는 그것을 사용할 수 없다고 생각한다. 아마도 Java와 다른 언어에서 다르게 작동 할 수 있습니다.
geokavel

당신은 여분의 쓸모없는 공간을 가지고있다String[] a
user41805

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

ungolfed 버전은 다음과 같습니다.

<?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에서 각 경로는 나타내는 상태의 약어 (예 : <path d="…" id="HI" />하와이의 경우)에 해당하는 ID를 갖습니다 .

이 경로를 적절한 음영으로 채색하기 위해 CSS를 추가하기 만하면됩니다. 그러나 빈 파일에는 이미 일부 CSS가 있으며 (특히 <style type="text/css">…</style>태그가 이미 존재 함) 실제로 쉽고 간단합니다. 문자열 .b은의 CSS에서만 찾을 수 있습니다 .border. 좋은 소식! 우리는 단지로 대체 할 것 .b입니다 OUR_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 필요한 경우 파일을 쉽게 만들 수 있습니다. 답변을 수정해야합니까? 그래, 파리를 오래 산다! 그건 그렇고, 대서양 너머 형제들이 어려운시기에 당신의 지원에 감사드립니다!
블랙홀

@DavidCarraher 몇 가지 설명을 추가했습니다. 내 답변을 이해하는 데 도움이되기를 바랍니다.
블랙홀

implode및 사용자 이름 +1 !
caird coinheringaahing

3

매스 매 티카 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"}}]

지도

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.