Codegolf - Подделать Прогноз

  • Автор темы Mess
  • Обновлено
  • 23, Oct 2024
  • #1

Прибыл новый суперкомпьютер, предсказывающий погоду, но он не работает.

Тем временем ваш босс хочет, чтобы вы выиграли время для техников, подделывая ежедневные карты ветра.

Ваша задача — нарисовать сетку стрелок, обозначающих направление ветра.

Сетка:

  • состоит из квадратных плиток размером 15 пикселей.
  • 8 плиток по 8 плиток
  • Всего 120 пикселей в квадрате
  • 000 фон

Каждый тайл сетки имеет 8 возможных направлений, обозначающих направление ветра:

  1. Север
  2. Северо-восток
  3. Восток
  4. Юго-восток
  5. Юг
  6. Юго-запад
  7. Запад
  8. Северо-Запад

Который необходимо изобразить следующим образом:

Н codegolf - Подделать прогноз СВ codegolf - Подделать прогноз Э codegolf - Подделать прогноз ЮВ codegolf - Подделать прогноз С codegolf - Подделать прогноз ЮВ codegolf - Подделать прогноз Вт codegolf - Подделать прогноз СЗ codegolf - Подделать прогноз

Карты должны меняться постепенно, чтобы быть правдоподобным.

Это означает, что каждая плитка может отличаться от соседней только на один шаг. Конкретно:

  • Плитка может отличаться от каждой из 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) с наименьшим количеством байтов исходного кода.

#код-гольф #графический-вывод

Mess


Рег
24 Apr, 2006

Тем
70

Постов
196

Баллов
556
  • 26, Oct 2024
  • #2

Матлаб (182*)

Предполагается, что входные данные хранятся в

 
 
 
 
 
 
   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.
 
. hen looking at the algorithm, it is not sure that the results will be unique, but I checked for VDU что они уникальны и удовлетворяют правилам. По сути, я просто использую комплексные числа единичного круга и «сглаживаю» их с помощью conv2 с помощью фильтра Гаусса. После этого они «округляются» до 8 возможных направлений.

*Я не знаю, как масштабировать вывод до определенного количества пикселей, поэтому это нужно делать вручную=/

РЕДАКТИРОВАТЬ: Я только что обнаружил, что бывают случаи, когда моя программа проверки не распознавала неправильные решения (изменения более чем на 1 шаг), но я пытаюсь найти другое решение.

Вход:

n

Код:

1

 

Nzhuchkov


Рег
08 Oct, 2011

Тем
79

Постов
200

Баллов
615
  • 26, Oct 2024
  • #3

Математика, 116 115 байт

0

Я полагаю, что хорошая лошадь никогда не прыгает выше, чем нужно. 2920 различных сеток очень легко получить, используя только два направления (я использую INPUTn:VDU23,48,516;543;4;0;23,49,783;5,9;0;0:WIDTH8FORi=1TO64PRINT;1ANDn;:n/=2NEXT and <?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"); ), что делает выполнение правила непрерывности тривиальным. Я просто выбираю между N и NE, основываясь на битах php windmap.php 123 , so this will actually produce 264 разные карты ветров.

Вот первые десять карт:

PS: Моя первоначальная идея заключалась в том, чтобы перечислить все 84 комбинации для 4-х углов и «линейная» интерполяция остальной части сетки. Вероятно, это привело бы к созданию более хороших карт, но, в конце концов, это кодовый гольф, поэтому я выбрал то, что соответствует минимальным требованиям.

 

Shalaev


Рег
14 Sep, 2007

Тем
78

Постов
184

Баллов
594
  • 26, Oct 2024
  • #4

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

Принимает свой аргумент из командной строки, например:

n

Это решение будет использовать входные данные в качестве определения четырех углов. Остальная часть карты будет плавно интерполирована между значениями. Он определил результаты для всех значений от 0 до 4095, в общей сложности около 11,25 лет фальшивого прогноза, чего должно быть более чем достаточно, чтобы исправить программное обеспечение погоды!

Вот GIF всех результатов:

И можно скачать ZIP-архив, содержащий каждую карту. здесь

(Небольшое примечание: срок действия моего домена недавно истек, потому что я не обращал на это внимания. Я продлил его, но изображение и ссылка выше могут не работать до тех пор, пока не обновится DNS)

Неразжатый:

NE ||answer||

BBC Basic, 83 символа ASCII, токенизированный png 72

Загрузите эмулятор на http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

N

По сути, это порт концепции Мартина, но реализация в BBC Basic сильно отличается. Я перепрограммирую шрифт для цифр 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] and 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)); затем выведите двоичные цифры n = 1 in reverse order.

Код Ungolfed приведен ниже. В BBC Basic вы можете печатать отдельные символы ASCII, используя n=1 upto 3000 command, but the language has a series of machine-specific codes similar to escape sequences but starting with unprintable characters. For reprogramming the font, we start with ASCII 23. Normally 8-bit values are taken, but if you use a semicolon as a separator instead of a comma, it takes 16-bit little endian values (as used in the golfed version.)

n

Выход

Для цифр от 0 до 7. Обратите внимание, что шрифт не сбрасывается в конце программы, поэтому в первых двух примерах цифры 0 и 1 отображаются в виде стрелок.

 

Chistyar


Рег
11 Feb, 2014

Тем
80

Постов
176

Баллов
596
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно