Palsu ramalannya

15

Superkomputer baru yang memprediksi cuaca telah tiba, dan itu tidak berfungsi.

Sementara itu bos Anda ingin Anda membeli teknisi beberapa waktu dengan memalsukan peta angin harian.

Tugas Anda adalah menggambar kisi-kisi panah yang mewakili arah angin.

Gridnya adalah:

  • terdiri dari ubin persegi 15px
  • 8 ubin dengan 8 ubin
  • Total 120px persegi
  • 000 latar belakang

Setiap petak kisi memiliki 8 orientasi potensial, mewakili arah angin:

  1. Utara
  2. Timur laut
  3. Timur
  4. Tenggara
  5. Selatan
  6. Barat daya
  7. Barat
  8. Barat laut

Yang harus digambarkan sebagai berikut:

N N NE NE E E SE SE S S SW SW W W NWNW

Peta harus bervariasi secara bertahap , agar dapat dipercaya.

Ini berarti setiap ubin hanya berbeda dari tetangganya dengan satu langkah. Secara khusus:

  • Ubin hanya dapat berbeda dengan satu kenaikan atau penurunan dari masing-masing 4 ubin yang berdekatan. (atau 3 untuk ubin samping, 2 untuk ubin sudut).
  • mis. ubin dengan tetangga E dapat berupa NE, E atau SE (dengan asumsi sesuai dengan tetangga lainnya).
  • Orientasi dapat berputar kembali, yaitu N -> NW dan NW -> N.

Sebagai ilustrasi, peta berikut ini valid:

NW  N NE NE NE NE NE NE 
 N NE NE NE NE NE NE  E 
NE NE NE NE NE NE  E SE 
 E NE NE NE NE  E SE  S 
SE  E  E  E  E SE  S SE 
 S SE SE SE SE  S SE  E 
SW  S  S  S  S SE  E NE 
SW SW  S  S SE  E NE  N 

Peta harus unik , jangan buat peta yang sama untuk input yang berbeda.

  • Input adalah bilangan bulat yang sesuai dengan hari-hari antara sekarang dan perkiraan Anda (mis. 1 adalah perkiraan besok, 365 adalah waktu satu tahun).
  • Output adalah peta sebagai gambar.
  • Output harus dapat direproduksi, input yang sama akan selalu memberikan output yang sama
  • Anda harus memberikan peta unik selama minimal 8 tahun - yaitu tidak ada output yang identik untuk input antara 1 dan 2920 (saya mengabaikan tahun kabisat).
  • Tidak ada output yang ditentukan untuk input apa pun yang lebih besar dari 2920.

Pengajuan yang menang akan menghasilkan peta yang valid (hingga hari 2920) dengan byte kode sumber paling sedikit.

jsh
sumber
Apa input maksimum yang perlu ditangani? Apakah ada batasan pada, misalnya, ramalan dua cara berturut-turut harus berbeda hanya dengan jumlah maksimum juga?
Ingo Bürk
Input maksimum yang perlu ditangani adalah 2920 . Tidak ada batasan pada ramalan berurutan (kecuali bahwa itu harus unik)
jsh
Oh, maaf, saya pasti mengabaikan poin terakhir. :)
Ingo Bürk
8
Sedikit keluar topik: Hanya menunjukkan ini kepada teman yang peramal cuaca dan dia mengatakan kepada saya bahwa beberapa aplikasi cuaca yang bisa Anda peroleh tidak jauh lebih baik daripada yang kami lakukan di sini, karena mereka tampaknya hanya mengambil data cuaca gratis dari bandara besar dan interpolasi mereka, lebih sering interpolasi hanya mengisap.
flawr
2
"Cuaca baru yang memprediksi superkomputer telah tiba, dan itu tidak berhasil." Kirimkan ke Jurnal Internasional Ilmu Iklim. Itu akan setara untuk kursus. : P
COTO

Jawaban:

4

BBC Basic, 83 karakter ASCII, filesize terpatok 72

Unduh emulator di http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

  INPUTn:VDU23,48,516;543;4;0;23,49,783;5,9;0;0:WIDTH8FORi=1TO64PRINT;1ANDn;:n/=2NEXT

Ini pada dasarnya adalah konsep pelabuhan Martin, tetapi implementasi di BBC basic sangat berbeda. Saya memprogram ulang font untuk angka-angka 0dan 1kemudian menampilkan digit biner ndalam urutan terbalik.

Kode tidak dikumpulkan di bawah ini. Di dasar BBC Anda dapat mencetak karakter ASCII individu menggunakan VDUperintah, tetapi bahasa memiliki serangkaian kode khusus mesin yang mirip dengan urutan melarikan diri tetapi mulai dengan karakter yang tidak patut dicetak. Untuk memprogram ulang font, kita mulai dengan ASCII 23. Biasanya nilai 8-bit diambil, tetapi jika Anda menggunakan titik koma sebagai pemisah alih-alih koma, dibutuhkan nilai endian 16-bit kecil (seperti yang digunakan dalam versi golf.)

  INPUTn
  VDU23,48,4,2,31,2,4,0,0,0         :REM redefine font for "0" as an east facing arrow, with an 8x8 bitmap
  VDU23,49,15,3,5,9,0,0,0,0         :REM redefine font for "1" as a northeast facing arrow, with an 8x8 bitmap
  WIDTH8                            :REM set print width to 8 characters
  FORi=1TO64PRINT;1ANDn;:n/=2:NEXT  :REM print the binary digits of n in reverse order from least significant to most significant.

Keluaran

Untuk angka 0 hingga 7. Perhatikan bahwa font tidak diatur ulang di akhir program, maka angka 0 dan 1 muncul sebagai panah dalam dua contoh pertama. masukkan deskripsi gambar di sini

Level River St
sumber
Ide bagus! :) Tapi apakah ubinnya 15x15?
Martin Ender
@ MartinBüttner BBC basic memungkinkan Anda mendefinisikan ulang font pada kisi 8x8. Untuk menjaga angka tetap kecil, saya melakukan panah timur terkecil yang dapat dikenali (5x5 diperas ke sudut kanan atas kotak) dan membuat panah timur laut yang tampak paling mirip. Dalam metode layar yang digunakan di sini, definisi tersebut memiliki korespondensi 1: 1 dengan piksel (dan meninggalkan celah yang cukup di antara baris) tetapi saya menggandakan ukuran kisi di Windows Paint untuk mendapatkan ukuran gambar yang lebih baik pada SE. Beberapa mode layar lain di BBC basic memiliki lebih dari 1 pixel per elemen grid, dan karakter yang ditentukan pengguna terasa lebih berbintik daripada font biasa.
Level River St
23

Matlab (182 *)

Diasumsikan bahwa input disimpan di n . Ketika melihat algoritma, tidak yakin bahwa hasilnya akan unik, tetapi saya memeriksa n=1 upto 3000bahwa mereka unik dan memenuhi aturan. Saya pada dasarnya hanya menggunakan bilangan kompleks dari lingkaran unit dan 'menghaluskan' mereka dengan conv2 dengan filter gaussian. Setelah itu mereka 'dibulatkan' ke 8 kemungkinan arah.

* Saya tidak tahu cara mengukur skala output ke sejumlah piksel, sehingga harus dilakukan secara manual = /

EDIT: Saya baru saja menemukan bahwa ada kasus di mana program pengecekan saya tidak mengenali solusi yang salah (berubah lebih dari 1 langkah), tetapi saya mencoba mencari solusi lain.

Memasukkan:

n = 1

Kode:

rand('seed',0);
for x=1:n
    b = exp(1i*rand(8)*2*pi);
end
for k=1:12
    b = conv2(b,[1,2,1]'*[1,2,1],'same');b=b./abs(b);
end
c = exp(1i*round(angle(b)*4/pi)*pi/4)/3;
quiver(real(c),imag(c));

bidang vektor

cacat
sumber
Apa yang Anda maksud dengan "skala output ke sejumlah piksel," skala panah, atau gambar?
krs013
@ krs013 Maksud saya menskalakan seluruh gambar, saya belum menemukan cara melakukannya sehingga memiliki lebar 8 * 16 piksel.
flawr
15

Mathematica, 116 115 byte

f@n_:=Graphics[Array[(d=n~BitGet~#;Arrow@{1+{w=15#~Mod~8+6.5d,h=15Floor[#/8]},14+{w-13d,h}})&,64,0],ImageSize->120]

Saya kira kuda yang baik tidak pernah melompat lebih tinggi dari yang seharusnya. 2920 grid yang berbeda sangat mudah dicapai dengan hanya menggunakan dua arah (Saya menggunakan Ndan NE), yang membuat memuaskan aturan kontinuitas sepele. Saya hanya memilih antara N dan NE berdasarkan bit n, jadi ini sebenarnya akan menghasilkan 2 64 peta angin yang berbeda.

Berikut ini sepuluh peta pertama:

masukkan deskripsi gambar di sini

PS: Ide awal saya adalah untuk menghitung semua 8 4 kombinasi untuk 4 sudut dan "linear" interpolasi sisa grid. Itu mungkin akan menghasilkan peta yang lebih bagus, tapi ini kode golf, jadi saya pergi dengan apa yang memenuhi persyaratan minimum.

Martin Ender
sumber
Saya harus minta 2 ^ 64 +1 grid. :)
jsh
@ jsh saya punya 8 pilihan untuk dua arah yang berdekatan. Itu akan membuat kodenya agak lebih lama, tetapi itu akan tetap mudah, dan akan memungkinkan 2 ^ 67 kisi unik. Tapi jangan khawatir, saya pikir ini masih golf kode yang bagus - melakukan golf output grafis sulit (karena obyektivitas yang diperlukan) dan saya pikir Anda telah melakukan pekerjaan yang cukup baik dengannya.
Martin Ender
Saya suka ide interpolasi, tetapi bagaimana Anda akan diinterpolasi ketika masing-masing dari empat sudut akan menunjuk ke pusat?
flawr
4
@ MartinBüttner: Meskipun secara teknis memenuhi spesifikasi, ini tampaknya bertentangan dengan semangat tantangan, yaitu membuat peta dapat dipercaya. Hanya sebuah pengamatan.
COTO
2
@COTO Sangat benar, tetapi ini juga kode golf dan bukan kontes popularitas, dan "kepercayaan" bukan kriteria validitas objektif.
Martin Ender
5

PHP 5.4, 549 byte

Agak terhalang oleh kebutuhan untuk mendefinisikan panah sebagai grafik, berikut ini adalah kode PHP saya:

<? $i=$argv[1];$p="R0lGODdhBQAFAIAAAP///wAAACwAAAAABQAFAAAC";$a=[$p."BwRiicGsDwoAOw",$p."CEQeoLfmlhQoADs",$p."CARiF8hnmGABADs",$p."CIwDBouYvGIoADs",$p."BwRil8Gs+QoAOw",$p."CIQRYcqrnkABADs",$p."CARihscYn1YBADs",$p."CAx+Bmq6HWIBADs"];$c=[$i&7,$i>>3&7,$i>>6&7,$i>>9];$m=imagecreate(120,120);imagecolorallocate($m,255,255,255);foreach($a as$_)$z[]=imagecreatefromstring(base64_decode($_));for($y=0;$y<8;$y++)for($x=0;$x<8;$x++)imagecopy($m,$z[($c[0]*(7-$x)*(7-$y)+$c[1]*$x*(7-$y)+$c[2]*(7-$x)*$y+$c[3]*$x*$y)/49%8],$x*15+5,$y*15+5,0,0,5,5);imagepng($m);

Mengambil argumennya dari baris perintah, seperti:

php windmap.php 123

Solusi ini akan menggunakan input sebagai definisi keempat sudut. Sisa peta akan diinterpolasi dengan lancar antar nilai. Ini telah menentukan hasil untuk semua nilai dari 0 hingga 4095, total besar ~ 11,25 tahun perkiraan palsu, yang seharusnya lebih dari cukup waktu untuk memperbaiki perangkat lunak cuaca!

Inilah GIF dari semua hasil:

Udara panas!

Dan ZIP yang berisi setiap peta dapat diunduh di sini

(Catatan kecil: Domain saya baru-baru ini kedaluwarsa karena saya tidak memperhatikan. Saya telah memperbaruinya, tetapi gambar dan tautan di atas mungkin tidak berfungsi sampai pembaruan DNS)

Tidak dipadamkan:

<?php
$input = $argv[1];
$prefix = "R0lGODdhBQAFAIAAAP///wAAACwAAAAABQAFAAAC";
$arrows = [
    $prefix."BwRiicGsDwoAOw", // E
    $prefix."CEQeoLfmlhQoADs", // NE
    $prefix."CARiF8hnmGABADs", // N
    $prefix."CIwDBouYvGIoADs", // NW
    $prefix."BwRil8Gs+QoAOw", // W
    $prefix."CIQRYcqrnkABADs", // SW
    $prefix."CARihscYn1YBADs", // S
    $prefix."CAx+Bmq6HWIBADs", // SE
];
$points = [
    $input & 7,
    $input >> 3 & 7,
    $input >> 6 & 7,
    $input >> 9 // input beyond 0o7777 (4095) will be undefined due to lack of & 7 here
];
$img = imagecreate(120,120);
imagecolorallocate($img,255,255,255);
$arrowimgs = [];
foreach($arrows as $src) {
    $arrowimgs[] = imagecreatefromstring(base64_decode($src));
}
for($y=0; $y<8; $y++) {
    for($x=0; $x<8; $x++) {
        $point = (
              $points[0] * (7-$x)/7 * (7-$y)/7
            + $points[1] *   $x  /7 * (7-$y)/7
            + $points[2] * (7-$x)/7 *   $y  /7
            + $points[3] *   $x  /7 *   $y  /7
        ) % 8;
        imagecopy($img,$arrowimgs[$point],$x*15+5,$y*15+5,0,0,5,5);
    }
}
imagepng($img,"out.png");
Niet the Dark Absol
sumber
Bagaimana cara kerja interpolasi?
flawr
@ flawr Diperlukan perkiraan jarak ke setiap sudut dan menggunakannya sebagai bobot untuk seberapa banyak nilai sudut itu harus memengaruhi nilai titik saat ini.
Niet the Dark Absol
Tetapi dalam hal ini setiap panah harus mengarah ke tengah dalam bingkai 1647? tinyurl.com/o7z9grl
flawr
1
@ flawr Lihat kolom paling kiri untuk melihat bagaimana "interpolasi" dari 7 (SE) ke 1 (NE) dengan menelusuri semua nilai 6, 5, 4, 3, 2 ... sebagai kebalikan dari yang lebih pendek "7, 0, 1 "yang mungkin Anda harapkan. Algoritma tidak cukup canggih untuk diinterpolasi dengan rotasi seperti itu.
Niet the Dark Absol
Ah, begitulah cara Anda menyelesaikannya! Ini benar-benar bagus, karena interpoasi dengan '7,0,1' akan menghasilkan bidang panah tidak valid =) +1 untuk grafik panah!
flawr