アメリカ(nマップ)を再び偉大にする


16

新しいボーナス!(下記参照)

米国共和党の大統領候補であるベンカーソンの地図作成チームは、地図に問題を抱えています(ワシントンポスト経由の画像)。

多数の州を含む地図が間違った場所に移動した(ベンカーソンのキャンペーンチームによる)およびその隣の米国の実際の地図

問題は、彼らがJob™に適したツールを持っていないことです。彼らは可能な限り最もコンパクトで信頼性の高いプログラムを必要としているので、再びマップを作成することを心配する必要はありません。それが彼らがあなたを雇った理由です。このマップを取得して、目的の色で再度出力する必要があります。

州境が示された米国の白地図

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でライセンス供与-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、次を出力します。 州境のあるアメリカ合衆国の地図。 オハイオ、インディアナ、イリノイは赤で色付けされています。 ニューヨーク、ニュージャージー、フロリダは青で色付けされています。

空白のマップ画像は、SVGおよびPNG形式で利用できます。便宜上、アルファベット順に50の州すべてのリストを示します

これは、課題です。出力はSVGまたは画像ファイルである必要があります。画面に出力を表示するだけでは不十分です。入力は、STDINから取得するか、テキストファイルを読み取る必要があります。入力をフォーマットする方法には柔軟性がありますが、各状態の完全な名前を含む必要があり、赤(共和党)状態が最初にリストされ、青(民主党)状態が次にリストされます。着色には、赤と青の2つの異なる色合いを使用できます。もちろん、空のマップイメージを、プログラムと同じフォルダーに任意のファイル名で配置できます。

精度基準

出力がラスターファイルの場合、少なくとも800x495ピクセルである必要があります。また、SVGを同じサイズに1.5ピクセル以上拡大した結果から行が逸脱してはなりません。出力がベクターファイルの場合、両方が800px x 495pxにスケーリングされたときに、線がSVGから1.5ピクセル以上ずれてはなりません。

ボーナス!

ベンは外国の図書館への依存を削減しようとしています。現在、地図のラスターグラフィックバージョンのみを入力として使用し、地域検出用の独自のアルゴリズムを作成するすべてのユーザーに-50%のボーナスを提供しています。最終的に、あなたのアプローチが「独自の書き込み」アルゴリズムとしてカウントされるかどうかを判断するのは私の判断です。

幸運を!


この例は、記入されていない行の周りのエイリアスを示しています。それは受け入れられますか?
スパー

@Sparr画像エディターでサンプルを作成したので、「完璧」であると思いますので、何か見逃した場合は大丈夫です。
-geokavel

念のため、空のSVGファイルを変更することはできますか?そのサイズはスコアにカウントされますか?「単に画面に出力を表示するだけでは不十分です」とはどういう意味ですか?
ブラックホール

@Blackholeいいえ、空のSVGファイルを変更することはできませんが、外部からロードする限り、スコアの一部としてはカウントされません。
-geokavel

@Blackholeつまり、ファイルを出力する必要があります。
-geokavel

回答:


7

Python 626

以下のアプローチでは、CSS記述の.stateに基づいて.rstateと.bstateを追加しました。私では、提供された.svgファイルの名前をに変更しましたv.svg。以下に説明するように入力を受け取り、ファイルに書き込みますw.png。完全な州名から短縮版に移行するには、州の最初と最後の2文字に基づいて検索します。

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つの追加ファイルに1バイトを追加するだけです。

誰かが私のコードの私の自己裁定に矛盾がある場合は、気軽にコメントを残してください。

また、Processingでこのチャレンジを試すことに興味がある人は、SVGファイルをに読み込みPShape、SVGファイルをXMLとして解析することをサポートしています。


forループには、のfor(int i=0;i++<51;)代わりにを使用しfor(int i=0;i<51;i++)ます。1バイトを保存し、スマイリーの顔が含まれています;)
クリチクシリトス

@ΚριτικσιΛίθοςそれが機能するために++iはそれを作らなければなりませんでした。それは正しいですか?
-geokavel

@ΚριτικσιΛίθος1バイトは節約できますが、ループ内の動作を完全に変更します。
トムカーペンター

@ΚριτικσιΛίθοςええ、ハワイを失ったので、それを使用できないと思います。たぶん、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必要に応じて、簡単にファイルを作成できます。回答を変更する必要がありますか?うん、パリで長生き!ちなみに、この厳しい時代、大西洋を越えた兄弟たちのサポートに感謝します!
ブラックホール

@DavidCarraher説明を追加しました。私の答えを理解するのに役立つことを願っています。
ブラックホール

+1 implodeとあなたのユーザー名!
コイアリンガーアーイング

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

地図

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.