Зробіть Америку (російські карти) знову великою


16

Новий бонус! (Дивіться нижче)

Команда з картографії американського республіканського сподіваного Бена Карсона має деякі проблеми зі своїми картами (зображення через Washington Post ):

Карта з купою штатів переміщена в неправильні місця (командою кампанії Бена Карсона) і справжня карта США поруч.

Проблема полягає в тому, що вони не мають правильного інструменту для роботи Job ™. Їм потрібна максимально компактна і надійна програма, тому їм більше не доведеться турбуватися про створення карт. Тому вони вас найняли. Вам потрібно взяти цю карту і вивести її знову з потрібним забарвленням:

Порожня карта США із державними кордонами

За допомогою Theshibboleth [GFDL ( http://www.gnu.org/copyleft/fdl.html ) або CC-BY-SA-3.0 ( http://creativecommons.org/licenses/by-sa/3.0/)] , через Вікісховище

Якщо ви не знаєте, де всі штати (тому що ви не американець ... або ви американець), ось карта з усіма назвами (Вашингтон для цього виклику не потрібен): Карта США з державними кордонами та назвами на ній

"Карта США з іменами штатів 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 Я зробив приклад із редактором зображень, тому вважаю його "ідеальним", тож якщо ви пропустите що-небудь, що пропускає, це добре.
geokavel

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

@Blackhole Ні, ви не можете змінити порожній файл SVG, але він не зараховується до вашої оцінки, якщо ви завантажуєте його зовні.
геокавель

@Blackhole Що я маю на увазі, ви повинні вивести файл.
geokavel

Відповіді:


7

Пітон 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'

Приклад виводу: вихідний показник

Або натхненний прапором Франції: вихідна цифра Франція


Приємно, демократія живе!
геокавель

Вітаємо, ви переможець! Дякуємо всім, хто брав участь!
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 , він підтримує як читання файлів SVG PShape, так і аналіз SVG-файлів як XML.


Для вашого for-loop майте for(int i=0;i++<51;)замість for(int i=0;i<51;i++). Він економить 1 байт, і в ньому є усміхнене обличчя;)
Kritixi Lithos

@ ΚριτικσιΛίθος Мені довелося змусити його ++iпрацювати. Це правильно звучить?
geokavel

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

@ ΚριτικσιΛίθος Так, я думаю, я не можу це використати, тому що втрачаю Гаваї. Можливо, воно працює інакше, ніж у 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 кожен шлях має ідентифікатор, що відповідає абревіатурі стану, який він представляє (наприклад, <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}.

Гаразд, чудова робота. Хоча технічно він не записує файл так, як я хотів би, користувач може легко зберегти зображення, натиснувши "Зберегти сторінку як" у браузері. Я дозволю такий тип відповіді.
geokavel

3
Цікаво, що абревіатури для Пенсільванії, Род-Айленду та Південної Кароліни вимовляють PARIS.
геокавель

@geokavel Я легко можу створити файл, якщо потрібно. Чи варто змінити свою відповідь? Так, нехай живе Париж! До речі, дякую за вашу підтримку в цей нелегкий час, брати за межами Атлантики!
Blackhole

@DavidCarraher Я додав пояснення. Сподіваюся, це допоможе тобі зрозуміти мою відповідь.
Blackhole

+1 для implodeі ваше ім’я користувача!
cird 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.