Jadikan Amerika (Peta) Hebat Lagi

16

Bonus Baru! (Lihat di bawah)

Tim kartografi calon presiden dari Partai Republik AS Ben Carson mengalami masalah dengan peta mereka (gambar melalui Washington Post ):

Peta dengan sekelompok negara dipindahkan ke tempat yang salah (oleh tim kampanye Ben Carson) dan peta nyata AS di sebelahnya

Masalahnya adalah mereka tidak memiliki Alat yang Tepat Untuk Pekerjaan ™. Mereka membutuhkan program yang paling ringkas dan andal, sehingga mereka tidak perlu khawatir membuat peta lagi. Itu sebabnya mereka mempekerjakan Anda. Anda perlu mengambil peta ini dan menampilkannya kembali dengan pewarnaan yang diinginkan:

Peta kosong Amerika Serikat dengan batas negara bagian ditampilkan

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

Jika Anda tidak tahu di mana semua negara bagian (karena Anda bukan orang Amerika ... atau Anda orang Amerika), berikut adalah peta dengan semua nama (Washington DC tidak diperlukan untuk tantangan ini): Peta Amerika Serikat dengan batas negara dan nama di atasnya

"Peta USA dengan nama negara 2". Berlisensi di bawah CC BY-SA 3.0 melalui 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

Misalnya jika inputnya adalah Ohio, Indiana, Illinois;New York, New Jersey, Florida, Anda menghasilkan: Peta Amerika Serikat dengan perbatasan negara.  Ohio, Indiana, dan Illinois berwarna merah;  New York, New Jersey Florida berwarna biru.

Gambar peta kosong tersedia dalam format SVG dan PNG . Untuk kenyamanan Anda, berikut adalah daftar semua 50 negara bagian dalam urutan abjad

Ini adalah tantangan dan . Keluaran harus berupa SVG atau file gambar. Cukup menampilkan output di layar tidak cukup. Masukan harus diambil dari STDIN atau dengan membaca file teks. Saya fleksibel dengan cara Anda memformat input, meskipun harus berisi nama lengkap masing-masing negara, dengan negara merah (Republik) terdaftar pertama dan negara biru (Demokrat) kedua. Dua warna berbeda dari merah dan biru dapat diterima untuk pewarnaan. Tentu saja, Anda dapat memiliki gambar peta kosong di folder yang sama dengan program Anda dengan nama file apa pun yang Anda inginkan.

Kriteria Akurasi

Jika output Anda adalah file raster, itu harus setidaknya 800px oleh 495px, dan garis tidak boleh menyimpang dari hasil peningkatan skala SVG ke ukuran yang sama dengan lebih dari 1,5 piksel. Jika output Anda adalah file vektor, garis tidak boleh menyimpang dari SVG lebih dari 1,5 piksel saat keduanya diskalakan ke 800px oleh 495px.

Bonus!

Ben sedang berusaha mengurangi ketergantungan pada perpustakaan asing, dan sekarang menawarkan bonus -50% kepada siapa saja yang hanya menggunakan versi grafik raster peta sebagai input dan menciptakan algoritma mereka sendiri untuk deteksi wilayah. Pada akhirnya, penilaian saya yang menentukan apakah pendekatan Anda dianggap sebagai algoritma "tulis Anda sendiri".

Semoga berhasil!

geokavel
sumber
contoh menunjukkan beberapa alias di sekitar baris yang belum diisi. apakah itu dapat diterima?
Sparr
@Sparr Saya membuat contoh dengan editor gambar, jadi saya menganggapnya sebagai "sempurna", jadi jika Anda melewatkan sesuatu yang terlewatinya tidak apa-apa.
geokavel
Hanya untuk memastikan: apakah kita diizinkan untuk memodifikasi file SVG kosong? Apakah ukurannya masuk dalam skor kami? Apa yang Anda maksud dengan "hanya menampilkan output di layar tidak cukup"?
Blackhole
@ Blackhole Tidak, Anda tidak dapat mengubah file SVG kosong, tetapi itu tidak dihitung sebagai bagian dari skor Anda selama Anda memuatnya secara eksternal.
geokavel
@ Lubang Bor Yang saya maksud adalah, Anda harus menampilkan file.
geokavel

Jawaban:

7

Python 626

Dalam pendekatan di bawah ini, saya menambahkan .rstate dan .bstate berdasarkan .state dalam deskripsi CSS. Di saya, saya mengganti nama file .svg yang disediakan menjadi v.svg. Dibutuhkan input seperti yang dijelaskan di bawah ini dan menulis ke file w.png. Untuk mentransfer dari nama negara lengkap ke versi singkat, saya mencarinya berdasarkan dua huruf pertama dan terakhir dari negara bagian.

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

Contoh input:

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

Contoh output: angka output

Atau terinspirasi oleh bendera Prancis: angka keluaran france

Willem
sumber
Bagus, demokrasi tetap hidup!
geokavel
Selamat, kamu adalah pemenangnya! Terima kasih untuk semua yang berpartisipasi!
geokavel
6

Memproses, 425 byte (259 byte + 1 +165 byte file)

Kode:

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

Peta kosong harus dinamai " M.svg " dan disimpan dalam folder bernama / data (semua file lain berada di folder yang sama dengan program.)

File Input (" a "):

Mississippi
California
Connecticut

Delaware
Florida
Wyoming
Hawaii

File Kunci (" b "): http://pastebin.com/0pNufAH9

Output (" m.tif "):

masukkan deskripsi gambar di sini

Ok, ini saya coba di tantangan saya sendiri. Beberapa catatan:

  • Peta output terlihat berbeda dari peta input dengan cara berikut
    1. Peta input berwarna abu-abu mengisi latar belakang transparan. Output memiliki pengisian putih pada latar belakang abu-abu. Saya pikir ini harus diizinkan, karena putih, abu-abu, dan transparansi semuanya netral.
    2. Peta keluaran hilang garis di sekitar Hawaii dan Alaska yang dimiliki input. Sekali lagi, saya pikir ini tidak masalah karena garis-garisnya bukan bagian penting dari peta.
  • Program menggunakan file eksternal untuk menahan kunci. Menurut posting meta ini , saya hanya perlu menambahkan 1 byte untuk satu file tambahan.

Jika ada yang memiliki ketidaksesuaian dengan penilaian diri saya terhadap kode saya, jangan ragu untuk meninggalkan komentar.

Juga, jika ada orang yang ingin mencoba tantangan ini dalam Memproses , ia mendukung membaca file SVG ke PShape, serta mem-parsing file SVG sebagai XML.

geokavel
sumber
Untuk for-loop Anda, miliki for(int i=0;i++<51;)saja for(int i=0;i<51;i++). Ini menghemat 1 byte dan memiliki wajah smiley di dalamnya;)
Kritixi Lithos
@ ΚριτικσιΛίθος Saya harus membuatnya ++iagar berfungsi. Apakah itu benar?
geokavel
@ ΚριτικσιΛίθος Mungkin menyimpan byte, tetapi itu benar-benar mengubah perilaku di dalam loop.
Tom Carpenter
@ ΚριτικσιΛίθος Ya, saya kira saya tidak bisa menggunakannya karena saya kehilangan Hawaii. Mungkin ini bekerja berbeda di Jawa daripada bahasa lain.
geokavel
Anda mendapat ruang ekstra yang tidak berguna diString[] a
Kritixi Lithos
5

PHP, 714 byte

Outputnya adalah file SVG kosong, yang harus disimpan dalam file bernama a, dengan CSS tambahan untuk mewarnai negara, yang harus disimpan dalam file bernama bdalam format berikut:

Ohio0Indiana0Illinois1New York0New Jersey0Florida

Saya telah menambahkan beberapa baris baru untuk keterbacaan.

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

Ini adalah versi yang tidak dikoleksi:

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

Prinsipnya sederhana: dalam SVG kosong, setiap jalur memiliki ID yang sesuai dengan singkatan negara yang diwakilinya (misalnya, <path d="…" id="HI" />untuk Hawaii).

Yang harus kita lakukan adalah menambahkan beberapa CSS untuk mewarnai jalur ini di tempat yang sesuai. Tetapi sudah ada beberapa CSS di file kosong (khususnya <style type="text/css">…</style>tag sudah ada), jadi sangat mudah dan singkat untuk melakukannya. Kami dapat melihat bahwa string .bhanya ditemukan di CSS untuk .border. Kabar baik! Kami hanya akan mengganti .bdengan OUR_WONDERFUL_CSS.b.

Membuat "CSS kami yang luar biasa" tidak terlalu sulit:

  1. Membaca input dari file:
    Ohio0Indiana0Illinois1New York0New Jersey0Florida.
  2. Ganti nama-nama negara-negara dengan singkatan mereka:
    OH0IN0IL1NY0NJ0FL.
  3. Mengganti 0karakter dengan ,#:
    OH,#IN,#IL1NY,#NJ,#FL.
  4. Mengganti 1karakter dengan {fill:red}#:
    OH,#IN,#IL{fill:red}#NY,#NJ,#FL.
  5. Tambahkan #di awal dan {fill:blue}di akhir:
    #OH,#IN,#IL{fill:red}#NY,#NJ,#FL{fill:blue}.
Lubang hitam
sumber
Ok, kerja bagus. Meskipun secara teknis itu tidak menulis file seperti yang saya inginkan, pengguna dapat dengan mudah menyimpan gambar dengan menekan "Save Page As" di browser. Saya akan mengizinkan jenis jawaban ini.
geokavel
3
Menarik bahwa singkatan untuk Pennsylvania, Rhode Island, dan South Carolina mengeja PARIS.
geokavel
@geokavel Saya dapat dengan mudah membuat file, jika perlu. Haruskah saya mengubah jawaban saya? Yap, panjang umur Paris! Omong-omong, terima kasih atas dukungan Anda di masa-masa sulit ini, saudara-saudara di seberang Atlantik!
Blackhole
@ DavidVarraher Saya telah menambahkan beberapa penjelasan. Saya harap ini akan membantu Anda memahami jawaban saya.
Blackhole
+1 untuk implodedan nama pengguna Anda!
caird coinheringaahing
3

Mathematica 1025

Tidak elegan tapi berhasil.

Saya tidak menyadari bahwa file SVG memiliki jalur untuk setiap negara bagian, jadi saya menemukan negara bagian menggunakan MorphologicalComponents dan kemudian menghubungkan setiap komponen dengan masing-masing negara. Negara-negara seperti Michigan (dengan semenanjung atas dan bawah) dan Hawaii (beberapa pulau) memiliki lebih dari satu komponen.

Kode mengasumsikan bahwa file peta terkandung dalam variabel, 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}}]])]

Di bawah ini adalah gambar yang akan diekspor oleh input berikut:

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

peta

DavidC
sumber