Torne a América (n Mapas) grande novamente

16

Novo bônus! (Ver abaixo)

A equipe de cartografia do candidato presidencial republicano dos EUA Ben Carson está tendo alguns problemas com seus mapas (imagem via Washington Post ):

Mapa com vários estados movidos para lugares errados (pela equipe de campanha de Ben Carson) e um mapa real dos EUA ao lado

O problema é que eles não têm a ferramenta certa para o trabalho ™. Eles precisam do programa mais compacto e confiável possível, para nunca mais se preocupar em fazer mapas novamente. Por isso te contrataram. Você precisa pegar este mapa e imprimi-lo novamente com a cor desejada:

Mapa em branco dos Estados Unidos com as fronteiras do estado mostradas

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

Se você não sabe onde estão todos os estados (porque você não é americano ... ou é americano), aqui está um mapa com todos os nomes (Washington DC não é necessário para esse desafio): Mapa dos Estados Unidos com fronteiras estaduais e nomes

"Mapa dos EUA com nomes de estado 2". Licenciado sob CC BY-SA 3.0 via 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

Por exemplo, se a entrada for Ohio, Indiana, Illinois;New York, New Jersey, Florida, você gera: Mapa dos Estados Unidos com fronteiras estaduais.  Ohio, Indiana e Illinois são coloridas em vermelho;  Nova York, Nova Jersey, Flórida são coloridas em azul.

A imagem do mapa em branco está disponível nos formatos SVG e PNG . Para sua conveniência, aqui está uma lista de todos os 50 estados em ordem alfabética

Este é um desafio do e . A saída deve ser como um arquivo de imagem ou SVG. Simplesmente exibir a saída na tela não é suficiente. A entrada deve ser retirada do STDIN ou da leitura de um arquivo de texto. Sou flexível com a formatação da entrada, embora ela deva conter os nomes completos de cada estado, com os estados vermelho (republicano) listados primeiro e os estados azul (democrático) em segundo. Quaisquer dois tons distintos de vermelho e azul são aceitáveis ​​para a coloração. Obviamente, você pode ter a imagem do mapa em branco na mesma pasta do seu programa com o nome de arquivo que desejar.

Critérios de precisão

Se a sua saída for um arquivo raster, ele deverá ter pelo menos 800 x 495 px e as linhas não deverão se desviar do resultado da expansão do SVG para o mesmo tamanho em mais de 1,5 pixels. Se a sua saída for um arquivo vetorial, as linhas não deverão se desviar do SVG em mais de 1,5 pixels quando ambas forem dimensionadas para 800 px por 495 px.

Bônus!

Ben está tentando reduzir a dependência de bibliotecas estrangeiras e agora oferece um bônus de -50% para quem usa apenas uma versão gráfica raster do mapa como entrada e cria seu próprio algoritmo para detecção de região. Por fim, é meu julgamento que determina se sua abordagem conta como algoritmo "escrevendo seu próprio".

Boa sorte!

geokavel
fonte
o exemplo mostra algum alias nas linhas que não foram preenchidas. Isso é aceitável?
Sparr
@ Spar Eu fiz o exemplo com um editor de imagens, por isso considero-o "perfeito", por isso, se você perder alguma coisa que perder, tudo bem.
perfil completo de geokavel
Só para ter certeza: podemos modificar o arquivo SVG em branco? O seu tamanho conta na nossa pontuação? O que você quer dizer com "simplesmente exibir a saída na tela não é suficiente"?
Blackhole
@Blackhole Não, você não pode modificar o arquivo SVG em branco, mas ele não conta como parte da sua pontuação, desde que seja carregado externamente.
perfil completo de geokavel
@ Blackhole O que eu quero dizer é que você precisa gerar um arquivo.
perfil completo de geokavel

Respostas:

7

Python 626

Na abordagem abaixo, adicionei .rstate e .bstate com base em .state na descrição do CSS. No meu, renomei o arquivo .svg fornecido para v.svg. Ele recebe uma entrada conforme descrito abaixo e grava em um arquivo w.png. Para transferir do nome completo do estado para a versão abreviada, procuro-os com base nas duas primeiras e últimas letras dos estados.

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

Exemplo de entrada:

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

Exemplo de saída: figura de saída

Ou inspirado pela bandeira da França: figura de saída frança

Willem
fonte
Bom, a democracia continua viva!
geokavel
Parabéns, você é o vencedor! Obrigado a todos que participaram!
geokavel
6

Processamento, 425 bytes (259 bytes + 1 +165 bytes)

Código:

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

O mapa em branco deve ser nomeado " M.svg " e armazenado em uma pasta chamada / data (todos os outros arquivos estão na mesma pasta que o programa).

Arquivo de entrada (" a "):

Mississippi
California
Connecticut

Delaware
Florida
Wyoming
Hawaii

Arquivo de chave (" b "): http://pastebin.com/0pNufAH9

Saída (" m.tif "):

insira a descrição da imagem aqui

Ok, aqui está a minha tentativa no meu próprio desafio. Algumas notas:

  • O mapa de saída parece diferente do mapa de entrada das seguintes maneiras
    1. O mapa de entrada tinha preenchimento cinza em um fundo transparente. A saída possui preenchimento branco sobre fundo cinza. Eu acho que isso deve ser permitido, porque branco, cinza e transparência são todos neutros.
    2. O mapa de saída está faltando as linhas ao redor do Havaí e do Alasca que a entrada tinha. Mais uma vez, acho que está tudo bem, porque as linhas não são uma parte significativa do mapa.
  • O programa usa um arquivo externo para manter as teclas. De acordo com este meta post , só preciso adicionar 1 byte para um arquivo adicional.

Se alguém tiver alguma discrepância com meu auto-julgamento do meu código, fique à vontade para deixar um comentário.

Além disso, se alguém tiver curiosidade em experimentar esse desafio no Processing , ele suporta a leitura de arquivos SVG em PShape's, bem como a análise de arquivos SVG como XML.

geokavel
fonte
Para o seu loop for, em for(int i=0;i++<51;)vez de for(int i=0;i<51;i++). Ele economiza 1 byte e tem um rosto sorridente nele;)
Kritixi Lithos
@ ΚριτικσιΛίθος Eu tive que fazê- ++ilo funcionar. Isso soa certo?
geokavel
@ ΚριτικσιΛίθος Pode salvar um byte, mas altera completamente o comportamento dentro do loop.
Tom Carpenter
@ ΚριτικσιΛίθος Sim, acho que não posso usar isso porque perco o Havaí. Talvez funcione diferente em Java e em outras linguagens.
geokavel
Você tem um espaço extra inútil em:String[] a
Kritixi Lithos
5

PHP, 714 bytes

A saída é o arquivo SVG em branco, que deve ser armazenado em um arquivo nomeado a, com CSS adicional para colorir os estados, que devem ser armazenados em um arquivo nomeado bno seguinte formato:

Ohio0Indiana0Illinois1New York0New Jersey0Florida

Eu adicionei algumas novas linhas para facilitar a leitura.

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

Aqui está a versão não destruída:

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

O princípio é simples: no SVG em branco, cada caminho possui um ID correspondente à abreviação do estado que representa (por exemplo, <path d="…" id="HI" />no Havaí).

Tudo o que precisamos fazer é adicionar um pouco de CSS para colorir esse caminho na tonalidade apropriada. Mas já existe algum CSS no arquivo em branco (em particular a <style type="text/css">…</style>tag já existe), por isso é realmente fácil e curto de fazê-lo. Podemos notar que a string .bsó é encontrada no CSS para .border. Boas notícias! Nós vamos apenas substituir .bcom OUR_WONDERFUL_CSS.b.

Criar "nosso maravilhoso CSS" não é realmente mais difícil:

  1. Leia a entrada do arquivo:
    Ohio0Indiana0Illinois1New York0New Jersey0Florida.
  2. Substitua os nomes dos estados com suas abreviaturas:
    OH0IN0IL1NY0NJ0FL.
  3. Substituir os 0caracteres com ,#:
    OH,#IN,#IL1NY,#NJ,#FL.
  4. Substituir o 1personagem com {fill:red}#:
    OH,#IN,#IL{fill:red}#NY,#NJ,#FL.
  5. Adicionar #no início e {fill:blue}no final:
    #OH,#IN,#IL{fill:red}#NY,#NJ,#FL{fill:blue}.
Blackhole
fonte
Ok, ótimo trabalho. Embora tecnicamente não grave um arquivo como eu gostaria, o usuário pode salvar facilmente a imagem pressionando "Salvar página como" no navegador. Eu permitirei esse tipo de resposta.
perfil completo de geokavel
3
Interessante que as abreviaturas da Pensilvânia, Rhode Island e Carolina do Sul enunciam PARIS.
precisa
@geokavel Posso criar um arquivo facilmente, se necessário. Devo modificar minha resposta? Sim, viva Paris! A propósito, obrigado por seu apoio nestes tempos difíceis, irmãos além do Atlântico!
Blackhole
@DavidCarraher Adicionei algumas explicações. Espero que ajude você a entender minha resposta.
Blackhole
+1 para implodee seu nome de usuário!
caird coinheringaahing
3

Mathematica 1025

Não é elegante, mas funciona.

Eu não sabia que os arquivos SVG tinham caminhos para cada estado, então encontrei os estados usando MorphologicalComponentse depois associei cada componente ao seu respectivo estado. Estados como Michigan (com penínsulas superior e inferior) e Havaí (ilhas múltiplas) têm mais de um componente.

O código pressupõe que o arquivo de mapa esteja contido na variável 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}}]])]

Abaixo está a imagem que será exportada pela seguinte entrada:

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

mapa

DavidC
fonte