फेक फोरकास्ट


15

सुपर कंप्यूटर की भविष्यवाणी करने वाला नया मौसम आ गया है, और यह काम नहीं करता है।

इस बीच आपका बॉस चाहता है कि आप दैनिक पवन मानचित्रों को रोककर कुछ समय के लिए तकनीशियनों को खरीद लें।

आपका काम हवा की दिशा का प्रतिनिधित्व करने वाले तीरों का एक ग्रिड खींचना है।

ग्रिड है:

  • 15px वर्ग टाइल से बना है
  • 8 टाइल्स द्वारा 8 टाइल्स
  • कुल 120px वर्ग
  • 000 पृष्ठभूमि

प्रत्येक ग्रिड टाइल में 8 संभावित झुकाव हैं, जो हवा की दिशा का प्रतिनिधित्व करते हैं:

  1. उत्तर
  2. ईशान कोण
  3. पूर्व
  4. दक्षिण-पूर्व
  5. दक्षिण
  6. दक्षिण पश्चिम
  7. पश्चिम
  8. उत्तर पश्चिम

जिसे निम्नानुसार दर्शाया जाना चाहिए:

एन एन NE NEइ एसई एसई एस एस दप दप डब्ल्यू डब्ल्यू एनडब्ल्यूNW

विश्वसनीय होने के लिए नक्शे में धीरे-धीरे भिन्नता होनी चाहिए

इसका मतलब है कि प्रत्येक टाइल अपने पड़ोसी से केवल एक कदम अलग हो सकती है। विशेष रूप से:

  • एक टाइल केवल 4 आसन्न टाइलों में से प्रत्येक से एक वेतन वृद्धि या वृद्धि से भिन्न हो सकती है। (या साइड टाइल्स के लिए 3, कॉर्नर टाइल्स के लिए 2)।
  • जैसे पड़ोसी E के साथ एक टाइल NE, E या SE हो सकती है (यह मानते हुए कि वह अपने अन्य पड़ोसियों के साथ उच्चारण करता है)।
  • अभिविन्यास वापस चारों ओर लूप कर सकते हैं, अर्थात एन -> एनडब्ल्यू और एनडब्ल्यू -> एन।

वर्णन करने के लिए, निम्नलिखित नक्शा मान्य है:

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 

मैप्स अद्वितीय होने चाहिए , विभिन्न इनपुट्स के लिए समान मैप जेनरेट न करें।

  • इनपुट अब और आपके पूर्वानुमान के बीच के दिनों के लिए एक पूर्णांक है (उदाहरण के लिए 1 कल का पूर्वानुमान है, 365 एक वर्ष का समय है)।
  • आउटपुट छवि के रूप में मानचित्र है।
  • आउटपुट प्रजनन योग्य होना चाहिए, एक ही इनपुट हमेशा एक ही आउटपुट देगा
  • आपको कम से कम 8 वर्षों के लिए अद्वितीय मानचित्र देना होगा - अर्थात 1 और 2920 के बीच किसी भी इनपुट के लिए कोई समान आउटपुट नहीं (मैं लीप वर्षों की अनदेखी कर रहा हूं)।
  • 2920 से अधिक किसी भी इनपुट के लिए कोई निर्धारित आउटपुट नहीं है।

जीतने वाला प्रस्तुत स्रोत कोड के सबसे कम बाइट्स के साथ वैध नक्शे (दिन 2920 तक) का उत्पादन करेगा।


अधिकतम इनपुट क्या है जिसे संभालने की आवश्यकता है? क्या इस पर कोई प्रतिबंध है, उदाहरण के लिए, दो लगातार तरीकों का पूर्वानुमान केवल एक अधिकतम राशि से भिन्न होता है?
इंगो बुर्क

अधिकतम इनपुट जिसे संभालने की आवश्यकता है वह है 2920 । लगातार पूर्वानुमानों पर कोई प्रतिबंध नहीं है (सिवाय इसके कि वे अद्वितीय हों)
jsh

ओह, क्षमा करें, मुझे अंतिम बुलेट बिंदु की अनदेखी करनी चाहिए थी। :)
इंगो बुर्क

8
विषय से थोड़ा हटकर: बस एक दोस्त को यह दिखाया गया है, जो कि मौसम संबंधी है और उसने मुझे बताया कि उन मौसम ऐप्स में से कुछ जो आपको मिल सकते हैं, हम जो यहां कर रहे हैं, उससे बेहतर नहीं है, क्योंकि वे जाहिरा तौर पर सिर्फ मुफ्त मौसम का डेटा लेते हैं। बड़े हवाई अड्डे और उन्हें प्रक्षेपित करते हैं, अधिक बार उन प्रक्षेपों को नहीं जो सिर्फ चूसते हैं।
दोष

2
"सुपरकंप्यूटर की भविष्यवाणी करने वाला नया मौसम आ गया है, और यह काम नहीं करता है।" इसे इंटरनेशनल जर्नल ऑफ क्लाइमेट साइंस में जमा करें। यह पाठ्यक्रम के लिए बराबर होगा। : पी
सीओटीओ

जवाबों:


4

बीबीसी बेसिक, 83 एएससीआईआई अक्षर, टोकन फ़ाइलें 72 हैं

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

यह मूल रूप से मार्टिन की अवधारणा का एक बंदरगाह है, लेकिन बीबीसी बेसिक में कार्यान्वयन बहुत अलग है। मैं संख्याओं के लिए फ़ॉन्ट को फिर से शुरू करता हूं 0और 1फिर बाइनरी अंकों का उत्पादन करता हूंn रिवर्स ऑर्डर में ।

अनलग्ड कोड नीचे है। बीबीसी बेसिक में आप VDUकमांड का उपयोग करके व्यक्तिगत ASCII वर्णों को प्रिंट कर सकते हैं , लेकिन भाषा में अनुक्रमों से बचने के लिए मशीन-विशिष्ट कोडों की एक श्रृंखला है लेकिन अनपेक्षित वर्णों से शुरू होती है। फ़ॉन्ट को पुन: स्वरूपित करने के लिए, हम ASCII 23 से शुरू करते हैं। आम तौर पर 8-बिट मान लिया जाता है, लेकिन यदि आप अल्पविराम के बजाय एक विभाजक के रूप में अर्धविराम का उपयोग करते हैं, तो यह 16-बिट कम एंडियन मान (जैसा कि गोल्फ संस्करण में उपयोग किया जाता है) लेता है।

  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.

उत्पादन

नंबर 0 से 7. के लिए ध्यान दें कि प्रोग्राम के अंत में फ़ॉन्ट रीसेट नहीं किया गया है, इसलिए नंबर 0 और 1 पहले दो उदाहरणों में तीर के रूप में दिखाई देते हैं। यहां छवि विवरण दर्ज करें


अछा सुझाव! :) लेकिन टाइल्स 15x15 हैं?
मार्टिन एंडर

@ मार्टिनबटनर बीबीसी बेसिक आपको 8x8 ग्रिड पर एक फ़ॉन्ट को फिर से परिभाषित करने की अनुमति देता है। संख्याओं को छोटा रखने के लिए, मैंने सबसे छोटा पहचानने योग्य पूर्वी तीर (5x5 ग्रिड के ऊपरी दाएं कोने में निचोड़ा) किया और सबसे समान दिखने वाला उत्तर-पूर्व तीर बनाया। यहां उपयोग किए गए स्क्रीनमोड में, परिभाषा में पिक्सल के साथ 1: 1 पत्राचार होता है (और पंक्तियों के बीच पर्याप्त अंतर छोड़ देता है) लेकिन मैंने एसई पर एक बेहतर आकार की छवि प्राप्त करने के लिए विंडोज पेंट में ग्रिड आकार को दोगुना कर दिया। बीबीसी बेसिक में कुछ अन्य स्क्रीन मोड्स में 1 पिक्सेल प्रति ग्रिड तत्व से अधिक है, और उपयोगकर्ता परिभाषित वर्ण नियमित फ़ॉन्ट के लिए विशेष रूप से अधिक दानेदार हैं।
लेवल रिवर सेंट

23

मतलाब (182 *)

यह माना जाता है कि इनपुट में संग्रहीत है n। एल्गोरिथ्म को देखते हुए, यह सुनिश्चित नहीं है कि परिणाम अद्वितीय होंगे, लेकिन मैंने इसके लिए जाँच कीn=1 upto 3000 कि वे अद्वितीय हैं और नियमों को संतुष्ट करते हैं। मैं मूल रूप से यूनिट सर्कल के जटिल नंबरों का उपयोग करता हूं और एक गाऊसी फिल्टर के साथ conv2 द्वारा उन्हें 'स्मूथ' करता हूं। इसके बाद वे 8 संभावित दिशाओं के लिए 'गोल' हो जाते हैं।

* मुझे पता है कि पिक्सेल की एक निश्चित संख्या में आउटपुट को कैसे मापना है, इसलिए इसे मैन्युअल रूप से किया जाना चाहिए = /

संपादित करें: मुझे पता चला कि ऐसे मामले हैं जहां मेरे चेकिंग प्रोग्राम ने गलत समाधान (1 से अधिक चरणों में परिवर्तन) को नहीं पहचाना, लेकिन मैं एक और समाधान खोजने की कोशिश कर रहा हूं।

इनपुट:

n = 1

कोड:

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

वेक्टर क्षेत्र


आप "एक निश्चित संख्या में पिक्सेल को आउटपुट पैमाने पर", तीर या छवि को स्केल करके क्या मतलब है?
krs013

@ krs013 मेरा मतलब है कि पूरी छवि को स्केल करना, मुझे अभी तक यह पता नहीं चला है कि ऐसा कैसे करना है जैसे कि इसकी चौड़ाई 8 * 16 पिक्सेल है।
दोष

15

गणितज्ञ, ११६ ११५ बाइट्स

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]

मुझे लगता है कि एक अच्छा घोड़ा जितना ऊपर होता है उससे अधिक कभी नहीं कूदता। 2920 विभिन्न ग्रिड बहुत आसानी से केवल दो दिशाओं (मैं उपयोग कर रहा हूँ का उपयोग कर के साथ प्राप्त कर रहे हैं Nऔर NE) है, जो निरंतरता नियम तुच्छ संतोषजनक बना देता है। मैं बस के बिट्स के आधार पर एन और एनई के बीच चयन कर रहा हूं n, इसलिए यह वास्तव में 2 64 का उत्पादन करेगा विभिन्न पवन मानचित्रों का ।

यहाँ पहले दस नक्शे हैं:

यहां छवि विवरण दर्ज करें

पुनश्च: मेरा मूल विचार 4 कोनों के लिए सभी 8 4 संयोजनों की गणना करना और बाकी ग्रिड के "रैखिक रूप से" प्रक्षेप करना था। यह संभवत: अच्छे नक्शों के परिणामस्वरूप हुआ होगा, लेकिन यह कोड गोल्फ है, इसलिए मैं न्यूनतम आवश्यकताओं की पूर्ति करता हूं।


मुझे 2 ^ 64 + 1 ग्रिड के लिए कहा जाना चाहिए। :)
जेएस

@jsh को दो निकटवर्ती दिशाओं के लिए 8 विकल्प मिले। इसने कोड को कुछ लंबा बना दिया होगा, लेकिन यह अभी भी उसी तरह आसान होगा, और 2 ^ 67 अद्वितीय ग्रिड के लिए अनुमति देगा। लेकिन चिंता मत करो, मुझे लगता है कि यह अभी भी एक अच्छा कोड गोल्फ है - ग्राफिकल आउटपुट गोल्फ करना कठिन (आवश्यक निष्पक्षता के कारण) है और मुझे लगता है कि आपने इसके साथ काफी अच्छा काम किया है।
मार्टिन एंडर

मुझे प्रक्षेप का विचार पसंद है, लेकिन जब आप चार कोनों में से प्रत्येक को केंद्र में इंगित करेंगे, तो आप कैसे प्रक्षेपित होंगे?
दोष

4
@ मार्टिनबटनर: हालांकि यह तकनीकी रूप से कल्पना को पूरा करता है, लेकिन यह चुनौती की भावना के विपरीत है, जो मानचित्र को विश्वसनीय बनाने के लिए है। सिर्फ एक अवलोकन।
सीओटीओ

2
@ COTO बहुत सही है, लेकिन यह भी गोल्फ कोड और एक लोकप्रियता प्रतियोगिता नहीं है, और "विश्वासनीयता" एक उद्देश्य वैधता मानदंड नहीं है।
मार्टिन एंडर

5

PHP 5.4, 549 बाइट्स

ग्राफिक्स के रूप में तीर को परिभाषित करने की आवश्यकता से थोड़ा बाधित, यहाँ मेरा PHP कोड है:

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

कमांड लाइन से अपना तर्क लेता है, जैसे:

php windmap.php 123

यह समाधान चार कोनों की परिभाषा के रूप में इनपुट का उपयोग करेगा। बाकी मानचित्रों को मूल्यों के बीच आसानी से प्रक्षेपित किया जाएगा। इसने 0 से 4095 तक सभी मूल्यों के लिए परिणामों को परिभाषित किया है, नकली पूर्वानुमान के ~ 11.25 साल का एक भव्य कुल, जो मौसम सॉफ्टवेयर को ठीक करने के लिए पर्याप्त समय से अधिक होना चाहिए!

यहाँ सभी परिणामों का GIF है:

गर्म हवा!

और प्रत्येक मानचित्र युक्त एक ज़िप यहाँ डाउनलोड किया जा सकता है

(छोटा नोट: मेरा डोमेन हाल ही में समाप्त हो गया था क्योंकि मैं ध्यान नहीं दे रहा था। मैंने इसे नवीनीकृत कर दिया है, लेकिन उपरोक्त चित्र और लिंक DNS सर्वर तक काम नहीं कर सकते हैं)

Unsquishified:

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

प्रक्षेप कैसे काम करता है?
दोष

@flawr यह प्रत्येक कोने के लिए दूरी का एक अनुमान लगाता है और उस कोने के मूल्य को वर्तमान बिंदु के मूल्य को प्रभावित करने के लिए वजन के रूप में उपयोग करता है।
नीट द डार्क एब्सॉल

लेकिन इस मामले में हर तीर को फ्रेम 1647 में मध्य की ओर इशारा करना चाहिए? tinyurl.com/o7z9grl
flawr

1
@flawr बाईं ओर के कॉलम को देखें कि यह 7 (SE) से लेकर 1 (NE) तक सभी "6, 5, 4, 3, 2 ..." के रूप में "इंटरपोल्टिंग" कैसे हो रहा है। 0, 1 "जो आप उम्मीद कर सकते हैं। एल्गोरिथ्म पर्याप्त परिष्कृत नहीं है जैसे कि रोटेशन के साथ प्रक्षेपित करना।
नीट द डार्क एबोल

आह, आप इसे कैसे हल किया! यह वास्तव में एक अच्छा है, क्योंकि '7,0,1' के साथ अंतरायन के परिणामस्वरूप तीर के ग्राफिक्स के लिए एक अमान्य तीर फ़ील्ड =) +1 होगा!
दोष
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.