Make America (n Maps) Great Again

16

Nowa premia! (Patrz poniżej)

Zespół kartograficzny amerykańskiego republikańskiego prezydenta z nadzieją, że Ben Carson ma problemy z mapami (zdjęcie za pośrednictwem Washington Post ):

Mapa z bandą stanów przeniesioną w niewłaściwe miejsca (przez zespół kampanii Bena Carsona) i prawdziwa mapa Stanów Zjednoczonych obok

Problem polega na tym, że nie mają odpowiedniego narzędzia do pracy ™. Potrzebują najbardziej kompaktowego i niezawodnego programu, więc nigdy nie będą musieli martwić się o tworzenie map. Właśnie dlatego cię zatrudnili. Musisz wziąć tę mapę i wydrukować ją ponownie z pożądaną kolorystyką:

Pusta mapa Stanów Zjednoczonych z pokazanymi granicami państwowymi

Autorstwa Theshibboleth [GFDL ( http://www.gnu.org/copyleft/fdl.html ) lub CC-BY-SA-3.0 ( http://creativecommons.org/licenses/by-sa/3.0/)] , poprzez Wikimedia Commons

Jeśli nie wiesz, gdzie są wszystkie stany (ponieważ nie jesteś Amerykaninem ... lub jesteś Amerykaninem), oto mapa ze wszystkimi nazwiskami (Waszyngton nie jest wymagany do tego wyzwania): Mapa Stanów Zjednoczonych z granicami państwowymi i nazwami

„Mapa USA z nazwami państw 2”. Licencja na licencji CC BY-SA 3.0 za pośrednictwem 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

Na przykład, jeśli dane wejściowe są Ohio, Indiana, Illinois;New York, New Jersey, Florida, wyprowadzasz: Mapa Stanów Zjednoczonych z granicami państwowymi.  Ohio, Indiana i Illinois są w kolorze czerwonym;  New York, New Jersey na Florydzie są w kolorze niebieskim.

Pusty obraz mapy jest dostępny w formatach SVG i PNG . Dla Twojej wygody, oto lista wszystkich 50 stanów w porządku alfabetycznym

Jest to wyzwanie związane z i . Dane wyjściowe muszą być w formacie SVG lub pliku obrazu. Samo wyświetlenie wyniku na ekranie nie wystarczy. Dane wejściowe należy pobrać ze STDIN lub czytając plik tekstowy. Jestem elastyczny w sposobie formatowania danych wejściowych, chociaż powinny one zawierać pełne nazwy każdego stanu, z czerwonymi (republikańskimi) stanami wymienionymi na pierwszym miejscu, a niebieskim (demokratycznymi) stanami na drugim miejscu. Dowolne dwa wyraźne odcienie czerwieni i niebieskiego są dopuszczalne do kolorowania. Oczywiście możesz mieć pusty obraz mapy w tym samym folderze, co program, o dowolnej nazwie pliku.

Kryteria dokładności

Jeśli plik wyjściowy jest plikiem rastrowym, musi mieć co najmniej 800 x 495 pikseli, a linie nie powinny odbiegać od wyniku skalowania SVG do tego samego rozmiaru o więcej niż 1,5 piksela. Jeśli dane wyjściowe to plik wektorowy, linie nie powinny odbiegać od SVG o więcej niż 1,5 piksela, gdy oba są skalowane do 800 na 495 pikseli.

Premia!

Ben próbuje zmniejszyć zależność od obcych bibliotek i oferuje teraz premię -50% każdemu, kto używa tylko mapy w wersji rastrowej mapy i tworzy własny algorytm wykrywania regionu. Ostatecznie to ode mnie zależy, czy twoje podejście liczy się jako „pisanie własnego” algorytmu.

Powodzenia!

geokavel
źródło
przykład pokazuje niektóre aliasy wokół linii, które nie zostały wypełnione. czy jest to do przyjęcia?
Sparr,
@Sparr Zrobiłem przykład za pomocą edytora obrazów, więc uważam, że jest on „idealny”, więc jeśli coś przeoczysz, przegapisz, jest w porządku.
geokavel
Dla pewności: czy możemy zmodyfikować pusty plik SVG? Czy jego rozmiar liczy się w naszym wyniku? Co rozumiesz przez „samo wyświetlanie wyniku na ekranie nie wystarcza”?
Blackhole
@Blackhole Nie, nie możesz modyfikować pustego pliku SVG, ale nie liczy się on jako część twojego wyniku, o ile ładujesz go zewnętrznie.
geokavel
@Blackhole Mam na myśli, że musisz wydrukować plik.
geokavel

Odpowiedzi:

7

Python 626

W poniższym podejściu dodałem .rstate i .bstate na podstawie .state w opisie CSS. W moim zmieniłem nazwę dostarczonego pliku .svg na v.svg. Pobiera dane wejściowe, jak opisano poniżej i zapisuje do pliku w.png. Aby przenieść z pełnej nazwy stanu do wersji skróconej, sprawdzam je na podstawie pierwszej i ostatniej dwóch liter stanów.

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

Przykładowe dane wejściowe:

'California,Illinois,Iowa,Mississippi;New Mexico,Pennsylvania,South Dakota,Vermont'

Przykładowe dane wyjściowe: wartość wyjściowa

Lub zainspirowany flagą Francji: wielkość produkcji francja

Willem
źródło
Niezły, demokracja żyje!
geokavel
Gratulacje, jesteś zwycięzcą! Dziękujemy wszystkim, którzy wzięli udział!
geokavel
6

Przetwarzanie, 425 bajtów (plik 259 bajtów + 1 +165 bajtów)

Kod:

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

Pusta mapa powinna mieć nazwę „ M.svg ” i być przechowywana w folderze o nazwie / data (wszystkie inne pliki znajdują się w tym samym folderze co program).

Plik wejściowy („ a ”):

Mississippi
California
Connecticut

Delaware
Florida
Wyoming
Hawaii

Plik klucza („ b ”): http://pastebin.com/0pNufAH9

Dane wyjściowe („ m.tif ”):

wprowadź opis zdjęcia tutaj

Ok, oto moja próba na własne wyzwanie. Niektóre uwagi:

  • Mapa wyjściowa wygląda inaczej niż mapa wejściowa w następujący sposób
    1. Mapa wejściowa miała szare wypełnienie na przezroczystym tle. Wyjście ma białe wypełnienie na szarym tle. Myślę, że powinno to być dozwolone, ponieważ biały, szary i przezroczysty są neutralne.
    2. Na mapie wyjściowej brakuje linii wokół Hawajów i Alaski, które miały dane wejściowe. Po raz kolejny myślę, że jest to w porządku, ponieważ linie nie są znaczącą częścią mapy.
  • Program używa zewnętrznego pliku do przechowywania kluczy. Według tego meta postem muszę tylko dodać 1 bajt dla jednego dodatkowego pliku.

Jeśli ktoś ma jakiekolwiek rozbieżności w moim własnym osądzaniu mojego kodu, możesz zostawić komentarz.

Ponadto, jeśli ktoś jest zainteresowany wypróbowaniem tego wyzwania w Przetwarzaniu , obsługuje zarówno odczytywanie plików SVG do plików PShape, jak i parsowanie plików SVG jako XML.

geokavel
źródło
Dla swojej pętli for, for(int i=0;i++<51;)zamiast for(int i=0;i<51;i++). Oszczędza 1 bajt i ma uśmiechniętą twarz;)
Kritixi Lithos
@ ΚριτικσιΛίθος Musiałem to zrobić ++i, żeby działało. Czy to brzmi dobrze?
geokavel
@ ΚριτικσιΛίθος Może zapisać bajt, ale całkowicie zmienia zachowanie w pętli.
Tom Carpenter
@ ΚριτικσιΛίθος Tak, chyba nie mogę z tego skorzystać, ponieważ tracę Hawaje. Może działa inaczej w Javie niż w innych językach.
geokavel
Masz dodatkowe bezużyteczne miejsce wString[] a
Kritixi Lithos
5

PHP, 714 bajtów

Dane wyjściowe to pusty plik SVG, który powinien być przechowywany w pliku o nazwie a, z dodatkowym CSS do pokolorowania stanów, który powinien być przechowywany w pliku o bnastępującym formacie:

Ohio0Indiana0Illinois1New York0New Jersey0Florida

Dodałem kilka nowych linii dla czytelności.

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

Oto wersja bez golfa:

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

Zasada jest prosta: w pustym pliku SVG każda ścieżka ma identyfikator odpowiadający skrótowi reprezentowanego przez nią stanu (na przykład <path d="…" id="HI" />na Hawajach).

Wystarczy dodać CSS, aby pokolorować tę ścieżkę w odpowiednim odcieniu. Ale w pustym pliku jest już trochę CSS (w szczególności <style type="text/css">…</style>tag już istnieje), więc jest to naprawdę łatwe i krótkie. Możemy zauważyć, że ciąg .bznajduje się tylko w CSS dla .border. Dobre wieści! Będziemy po prostu wymienić .bsię OUR_WONDERFUL_CSS.b.

Stworzenie „naszego wspaniałego CSS” nie jest wcale trudniejsze:

  1. Odczytać dane wejściowe z pliku:
    Ohio0Indiana0Illinois1New York0New Jersey0Florida.
  2. Wymień nazwy państw z ich skrótów:
    OH0IN0IL1NY0NJ0FL.
  3. Wymień 0postacie z ,#:
    OH,#IN,#IL1NY,#NJ,#FL.
  4. Wymień 1charakter z {fill:red}#:
    OH,#IN,#IL{fill:red}#NY,#NJ,#FL.
  5. Dodaj #na początku i {fill:blue}na końcu:
    #OH,#IN,#IL{fill:red}#NY,#NJ,#FL{fill:blue}.
Czarna dziura
źródło
Dobra robota. Chociaż technicznie nie zapisuje pliku tak, jak chciałbym, użytkownik może łatwo zapisać obraz, naciskając „Zapisz stronę jako” w przeglądarce. Pozwolę na tego typu odpowiedź.
geokavel
3
Ciekawe, że skróty Pensylwanii, Rhode Island i Południowej Karoliny określają PARIS.
geokavel
@geokavel W razie potrzeby mogę łatwo utworzyć plik. Czy powinienem zmodyfikować swoją odpowiedź? Tak, niech żyje Paryż! Nawiasem mówiąc, dzięki za wsparcie w tych trudnych czasach, bracia za Atlantykiem!
Blackhole
@DavidCarraher Dodałem kilka wyjaśnień. Mam nadzieję, że pomoże ci to zrozumieć moją odpowiedź.
Blackhole
+1 dla implodei twoja nazwa użytkownika!
caird coinheringaahing
3

Mathematica 1025

Nie elegancki, ale działa.

Nie wiedziałem, że pliki SVG mają ścieżki dla każdego stanu, więc znalazłem te stany, MorphologicalComponentsa następnie powiązałem każdy składnik z jego odpowiednim stanem. Stany takie jak Michigan (z górną i dolną półwyspem) i Hawaje (wiele wysp) mają więcej niż jeden składnik.

Kod zakłada, że ​​plik mapy jest zawarty w zmiennej 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}}]])]

Poniżej znajduje się obraz, który zostanie wyeksportowany przez następujące dane wejściowe:

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

mapa

DavidC
źródło