ปลอมการพยากรณ์


15

สภาพอากาศใหม่คาดการณ์ซูเปอร์คอมพิวเตอร์มาถึงแล้วและมันไม่ทำงาน

ในขณะเดียวกันเจ้านายของคุณต้องการให้คุณซื้อช่างเทคนิคสักครั้งโดยการแกล้งทำแผนที่ลม

งานของคุณคือการวาดตารางลูกศรแสดงทิศทางลม

ตารางคือ:

  • ประกอบด้วยกระเบื้องสี่เหลี่ยม 15px
  • 8 แผ่นโดย 8 แผ่น
  • ผลรวมสี่เหลี่ยมจตุรัส 120px
  • พื้นหลัง 000

กระเบื้องกริดแต่ละตัวมีทิศทางที่อาจเกิดขึ้น 8 ทิศทางซึ่งเป็นทิศทางลม:

  1. ทางทิศเหนือ
  2. ตะวันออกเฉียงเหนือ
  3. ตะวันออก
  4. ทิศตะวันออกเฉียงใต้
  5. ภาคใต้
  6. ทิศตะวันตกเฉียงใต้
  7. ตะวันตก
  8. ตะวันตกเฉียงเหนือ

ซึ่งจะต้องมีการอธิบายดังนี้

N ยังไม่มีข้อความ NE ทิศตะวันออกเฉียงเหนือ E E SE SE S S SW SW W W NWNW

แผนที่จะต้องแตกต่างกันไปเรื่อย ๆเพื่อที่จะเชื่อ

ซึ่งหมายความว่าแต่ละไทล์อาจแตกต่างจากเพื่อนบ้านเพียงหนึ่งขั้นตอน โดยเฉพาะ:

  • ไทล์สามารถแตกต่างกันได้โดยเพิ่มขึ้นหรือลดลงจากกระเบื้องติดกัน 4 แผ่นเท่านั้น (หรือ 3 สำหรับกระเบื้องด้านข้าง 2 สำหรับกระเบื้องมุม)
  • เช่นกระเบื้องที่มีเพื่อนบ้าน E อาจเป็น NE, E หรือ SE (สมมติว่าสอดคล้องกับเพื่อนบ้านอื่น ๆ )
  • การวางแนวสามารถวนกลับไปมาเช่น N -> NW และ NW -> N

เพื่อแสดงแผนที่ต่อไปนี้ถูกต้อง:

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 วัน) ด้วยจำนวนไบต์น้อยที่สุดของซอร์สโค้ด


อินพุตสูงสุดที่ต้องจัดการคืออะไร มีข้อ จำกัด ใด ๆ หรือไม่เช่นการพยากรณ์สองวิธีที่ต่อเนื่องกันจะต้องแตกต่างกันตามจำนวนสูงสุดเท่านั้นเช่นกัน?
Ingo Bürk

การป้อนข้อมูลสูงสุดที่ต้องมีการจัดการเป็น2920 ไม่มีข้อ จำกัด ในการพยากรณ์ต่อเนื่อง (ยกเว้นว่าจะต้องไม่ซ้ำกัน)
jsh

โอ้ขอโทษฉันต้องมองข้ามกระสุนนัดสุดท้าย :)
Ingo Bürk

8
ปิดหัวข้อเล็กน้อย: เพียงแค่แสดงสิ่งนี้ให้เพื่อนที่เป็นผู้พยากรณ์อากาศและเขาบอกฉันว่าแอพพยากรณ์อากาศบางตัวที่คุณสามารถทำได้นั้นไม่ได้ดีไปกว่าสิ่งที่เราทำที่นี่เนื่องจากเห็นได้ชัดว่าพวกเขาใช้ข้อมูลสภาพอากาศฟรีจาก สนามบินขนาดใหญ่และสอดแทรกพวกเขาบ่อยครั้งที่การสอดแทรกเหล่านั้นไม่ได้ดูด
ข้อบกพร่อง

2
"สภาพอากาศใหม่คาดการณ์ซูเปอร์คอมพิวเตอร์มาถึงแล้วและมันก็ไม่ทำงาน" ส่งไปที่วารสารวิทยาศาสตร์ภูมิอากาศระหว่างประเทศ มันจะเป็นที่ตราไว้สำหรับหลักสูตร : P
COTO

คำตอบ:


4

BBC Basic, 83 ASCII ตัวอักษร, ขนาดไฟล์โทเค็น 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

นี่เป็นแนวคิดของมาร์ติน แต่การใช้งานพื้นฐานของ BBC นั้นแตกต่างกันมาก ฉัน reprogram ตัวอักษรสำหรับตัวเลข0และ1การส่งออกแล้วตัวเลขไบนารีnเพื่อย้อนกลับ

รหัส Ungolfed อยู่ด้านล่าง ใน BBC พื้นฐานคุณสามารถพิมพ์อักขระ ASCII แต่ละตัวโดยใช้VDUคำสั่ง แต่ภาษามีชุดของรหัสเฉพาะเครื่องที่คล้ายกับลำดับการหลีกเลี่ยง แต่เริ่มต้นด้วยอักขระที่ไม่สามารถพิมพ์ได้ สำหรับการเขียนโปรแกรมแบบอักษรใหม่เราเริ่มต้นด้วย ASCII 23 โดยปกติแล้วจะใช้ค่า 8 บิต แต่ถ้าคุณใช้เครื่องหมายอัฒภาคเป็นตัวคั่นแทนเครื่องหมายจุลภาคจะใช้ค่า endian เล็กน้อย 16 บิต (ใช้ในเวอร์ชัน golfed)

  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 หรือไม่
Martin Ender

@ MartinBüttner BBC พื้นฐานช่วยให้คุณสามารถกำหนดตัวอักษรใหม่ในตาราง 8x8 เพื่อให้ตัวเลขมีขนาดเล็กฉันได้ลูกศรทิศตะวันออกที่เล็กที่สุดเท่าที่จำได้ (5x5 บีบลงที่มุมขวาบนของตาราง) และทำให้ลูกศรดูคล้ายกับทิศตะวันออกเฉียงเหนือที่สุด ในโหมดหน้าจอที่ใช้ที่นี่คำจำกัดความมีความสอดคล้อง 1: 1 กับพิกเซล (และปล่อยให้ช่องว่างระหว่างแถว) แต่ฉันสองเท่าขนาดตารางใน Windows Paint เพื่อให้ได้ภาพขนาดที่ดีขึ้นใน SE โหมดหน้าจออื่น ๆ ใน BBC พื้นฐานมีมากกว่า 1 พิกเซลต่อองค์ประกอบกริดและผู้ใช้ที่กำหนดเองนั้นมีความละเอียดมากกว่าตัวอักษรปกติ
ระดับแม่น้ำเซนต์

23

Matlab (182 *)

nมันจะสันนิษฐานว่าการป้อนข้อมูลที่ถูกเก็บไว้ใน เมื่อดูอัลกอรึทึมก็ไม่แน่ใจว่าผลลัพธ์จะไม่ซ้ำกัน แต่ฉันตรวจสอบn=1 upto 3000ว่ามันไม่ซ้ำกันและเป็นไปตามกฎ โดยทั่วไปฉันแค่ใช้จำนวนเชิงซ้อนของวงกลมหน่วยและ 'ทำให้เรียบ' ด้วยการแปลง 2 ด้วยตัวกรอง Gaussian หลังจากนั้นพวกเขาจะ 'ปัดเศษ' เป็น 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

Mathematica, 116 115 ไบต์

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 และ NE ตามบิตของnดังนั้นจริง ๆ แล้วจะสร้างแผนที่ลมที่แตกต่างกัน2 64

นี่คือสิบแผนที่แรก:

ป้อนคำอธิบายรูปภาพที่นี่

PS: ความคิดดั้งเดิมของฉันคือการแจกแจงชุดค่าผสมทั้งหมด 8 4สำหรับมุมทั้ง 4 และการแทรก "เชิงเส้น" ที่เหลือของตาราง นั่นอาจจะส่งผลให้แผนที่ดีกว่า แต่นี่คือรหัสกอล์ฟดังนั้นฉันจึงไปด้วยสิ่งที่ตอบสนองความต้องการขั้นต่ำ


ฉันควรจะได้รับการร้องขอ 2 ^ 64 + 1 กริด :)
jsh

@jsh ฉันมี 8 ตัวเลือกสำหรับสองทิศทางติดกัน มันจะทำให้โค้ดค่อนข้างนาน แต่มันก็ยังง่ายเหมือนกันและจะอนุญาตให้มีกริดที่ไม่ซ้ำกัน 2 ^ 67 แต่ไม่ต้องกังวลฉันคิดว่ามันยังเป็นรหัสกอล์ฟที่ดีการทำกอล์ฟเอาท์พุทแบบกราฟิกนั้นยาก (เนื่องจากความเที่ยงธรรมที่จำเป็น) และฉันคิดว่าคุณทำได้ดีพอสมควร
Martin Ender

ฉันชอบความคิดของการแก้ไข แต่คุณจะแก้ไขได้อย่างไรเมื่อมุมทั้งสี่จะชี้ไปที่ศูนย์กลาง
ข้อบกพร่อง

4
@ MartinBüttner: แม้ว่าเทคนิคนี้จะตรงตามข้อกำหนด แต่ดูเหมือนจะตรงกันข้ามกับจิตวิญญาณของความท้าทายซึ่งทำให้แผนที่เชื่อได้ เพียงแค่การสังเกต
COTO

2
@COTO เป็นความจริงมาก แต่มันเป็นรหัสกอล์ฟและไม่ใช่การประกวดความนิยมและ "ความเชื่อมั่น" ไม่ใช่เกณฑ์ความถูกต้องตามวัตถุประสงค์
Martin Ender

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 ของผลลัพธ์ทั้งหมด:

อากาศร้อน!

และสามารถดาวน์โหลด ZIP ที่มีแต่ละแผนที่ได้ที่นี่

(หมายเหตุเล็ก ๆ : โดเมนของฉันหมดอายุเมื่อเร็ว ๆ นี้เพราะฉันไม่ได้ใส่ใจฉันได้ต่ออายุ แต่รูปภาพและลิงก์ด้านบนอาจไม่ทำงานจนกว่า 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 มันใช้เวลาประมาณระยะทางในแต่ละมุมและใช้มันเป็นน้ำหนักสำหรับค่าของมุมที่ควรมีผลต่อค่าของจุดปัจจุบัน
Niet the Dark Absolut

แต่ในกรณีนี้ลูกศรทุกคนควรชี้ไปที่ตรงกลางในกรอบ 1647? tinyurl.com/o7z9grl
ข้อบกพร่อง

1
@ flawr ดูคอลัมน์ซ้ายสุดเพื่อดูว่ามันเป็น "interpolating" จาก 7 (SE) ถึง 1 (NE) โดยการผ่านค่าทั้งหมด 6, 5, 4, 3, 2 ... ตรงข้ามกับที่สั้นกว่า "7, 0, 1 "ที่คุณอาจคาดหวัง อัลกอริทึมไม่ซับซ้อนพอที่จะสอดแทรกการหมุนเช่นนั้นได้
Niet the Dark Absolut

อานั่นเป็นวิธีที่คุณแก้ไขมัน! นี่เป็นสิ่งที่ดีจริงๆเนื่องจากการสอดแทรกด้วย '7,0,1' จะส่งผลให้ฟิลด์ลูกศรไม่ถูกต้อง =) +1 สำหรับกราฟิกลูกศร!
ข้อบกพร่อง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.