Сделайте Америку (n Maps) снова великолепной


16

Новый бонус! (См. ниже)

У команды картографов кандидата в президенты США от республиканцев Бена Карсона есть проблемы с их картами (изображение через Washington Post ):

Карта с группой штатов, перемещенных в неправильные места (командой кампании Бена Карсона), и реальная карта США рядом с ней

Проблема в том, что у них нет подходящего инструмента для работы ™. Им нужна самая компактная и надежная из возможных программ, поэтому им больше не придется беспокоиться о создании карт. Вот почему они наняли тебя. Вам нужно взять эту карту и снова вывести ее с желаемой раскраской:

Пустая карта Соединенных Штатов с указанными государственными границами

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, вы выводите: Карта США с государственными границами.  Огайо, Индиана и Иллинойс окрашены в красный цвет;  Нью-Йорк, Нью-Джерси Флорида окрашены в синий цвет.

Пустое изображение карты доступно в форматах SVG и PNG . Для вашего удобства вот список всех 50 штатов в алфавитном порядке

Это и проблема с . Вывод должен быть в виде SVG или файла изображения. Простого отображения результатов на экране недостаточно. Ввод должен быть взят из STDIN или путем чтения текстового файла. Я гибко отношусь к тому, как вы форматируете ввод, хотя он должен содержать полные имена каждого штата, с красными (республиканскими) штатами, перечисленными первым, и синими (демократическими) штатами после. Любые два различных оттенка красного и синего цвета приемлемы для окраски. Конечно, вы можете иметь пустое изображение карты в той же папке, что и ваша программа, с любым именем файла.

Критерии точности

Если ваш выходной файл представляет собой растровый файл, он должен иметь размер не менее 800 на 495 пикселей, а строки не должны отклоняться от результата увеличения SVG до того же размера более чем на 1,5 пикселя. Если ваши выходные данные являются векторным файлом, строки не должны отклоняться от SVG более чем на 1,5 пикселя, когда оба масштабируются до 800px на 495px.

Бонус!

Бен пытается уменьшить зависимость от иностранных библиотек, и теперь предлагает -50% бонус всем, кто использует только версию карты с растровой графикой в ​​качестве входных данных и создает свой собственный алгоритм для обнаружения региона. В конечном счете, именно мое суждение определяет, считается ли ваш подход «написанием собственного» алгоритма.

Удачи!


В примере показан псевдоним вокруг строк, которые не были заполнены. Это приемлемо?
Спарр

@Sparr Я сделал пример с графическим редактором, поэтому считаю его «идеальным», поэтому, если вы пропустите что-то, что пропустит, все в порядке.
геокавель

Просто чтобы быть уверенным: мы можем изменить пустой файл SVG? Учитывается ли его размер в нашем счете? Что вы подразумеваете под "недостаточно просто отобразить вывод на экране"?
Blackhole

@ Blackhole Нет, вы не можете изменить пустой SVG-файл, но он не считается частью вашего счета, если вы загружаете его извне.
геокавель

@ Blackhole Что я имею в виду, вы должны вывести файл.
геокавель

Ответы:


7

Python 626

В подходе ниже я добавил .rstate и .bstate на основе .state в описании CSS. По моему я переименовал предоставленный файл .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'

Пример вывода: выходной показатель

Или вдохновленный флагом Франции: выходной рисунок франция


Хорошо, демократия живет!
геокавель

Поздравляю, вы победитель! Спасибо всем, кто принимал участие!
геокавель

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 (все остальные файлы находятся в той же папке, что и программа.)

Входной файл (« а »):

Mississippi
California
Connecticut

Delaware
Florida
Wyoming
Hawaii

Ключевой файл (" b "): http://pastebin.com/0pNufAH9

Выход (" m.tif "):

введите описание изображения здесь

Хорошо, вот моя попытка в моем собственном испытании. Некоторые заметки:

  • Выходная карта отличается от входной карты следующими способами
    1. Входная карта имела серую заливку на прозрачном фоне. Вывод имеет белую заливку на сером фоне. Я думаю, что это должно быть разрешено, потому что белый, серый и прозрачность нейтральны.
    2. На выходной карте отсутствуют линии вокруг Гавайев и Аляски, которые были у входных данных. Еще раз, я думаю, что это нормально, потому что линии не являются важной частью карты.
  • Программа использует внешний файл для удержания клавиш. Согласно этому мета-посту , мне просто нужно добавить 1 байт для одного дополнительного файла.

Если у кого-то есть какие-либо расхождения с моим самооценкой моего кода, не стесняйтесь оставлять комментарии.

Также, если кому-то интересно попробовать эту задачу в Processing , он поддерживает как чтение файлов SVG в файлы PShape, так и анализ файлов SVG в формате XML.


Для вашего цикла, for(int i=0;i++<51;)вместо for(int i=0;i<51;i++). Это экономит 1 байт, и у него есть смайлик;)
Kritixi Lithos

@ ΚριτικσιΛίθος Я должен был сделать так, ++iчтобы это работало. Это звучит правильно?
геокавель

@ ΚριτικσιΛίθος Это может сохранить байт, но полностью меняет поведение внутри цикла.
Том Карпентер

@ ΚριτικσιΛίθος Да, наверное, я не смогу этим воспользоваться, потому что потерял Гавайи. Возможно, в Java это работает иначе, чем в других языках.
геокавель

У вас есть лишнее бесполезное место на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 каждый путь имеет идентификатор, соответствующий сокращению штата, который он представляет (например, <path d="…" id="HI" />для Гавайев).

Все, что нам нужно сделать, это добавить немного 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}.

Хорошо, отличная работа. Хотя технически он не пишет файл так, как мне хотелось бы, пользователь может легко сохранить изображение, нажав «Сохранить страницу как» в браузере. Я позволю этот тип ответа.
геокавель

3
Интересно, что аббревиатуры для Пенсильвании, Род-Айленда и Южной Каролины обозначают ПАРИЖ.
геокавель

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

карта

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.