Сделайте Matrix Digital Rain, используя самый короткий код [закрыто]


21

Правила:

  • Любой язык, который вы выберете (Стандартные библиотеки).
  • Вывод отображается в терминале или командном процессоре Windows или любым другим способом, который вы предпочитаете.
    (ширина буфера = 80)
  • ASCII символов достаточно. (может добавить Юникод)
  • Не должен заполнять весь экран при запуске (Должно быть похоже на дождь, да!).
  • Цвета получают бонусные очки (+5).
  • Эффекты : случайные символы, разный размер падения, периодически восстанавливаются.

Очки: (обновление)

  • +32 балла для начала.
  • -1 балл за каждый байт (не символ) в коде после ** 1024 ***-го * байта.
  • Точки могут доходить до нуля и минус.
  • Примечание: языки, использующие многобайтовые символы, должны считать байты, а не символы.
  • +5 за каждый новый эффект. (не опубликовано другими)
  • +15 за любой из этих эффектов:
    1. Ветер (дует символы в сторону)
    2. Подбор номера (пользовательский ввод, например: 90210):
      номер случайно расположен в матрице
      введите описание изображения здесь
    3. Звук
    4. Зашифрованное сообщение (пользовательский ввод):
      символы представляют секретное зашифрованное сообщение
    5. Режим Galaga:
      стреляет ^ чтобы уничтожить персонажей
      введите описание изображения здесь

Табло:

┌-----┬------------┬------------┬-------------┬---------------┬--------------┐
| pos |    name    |    type    |    bytes    |    effects    |    points  ^ |
|-----|------------|------------|-------------|---------------|--------------|
|1    |nitro2k01   |QBasic      |913          |Colours        |+57           |
|     |            |            |             |Colour Fade    |              |
|     |            |            |             |Sound (+15)    |              |
|-----|------------|------------|-------------|---------------|--------------|
|2    |squeamish   |HTML, Java- |1024         |Colours        |+47           |
|     |ossifrage   |Script, CSS |             |Transition     |              |
|     |            |            |             |Size Variation |              |
|-----|------------|------------|-------------|---------------|--------------|
|3    |manatwork   |Ruby        |374          |Colours        |+47           |
|     |            |            |             |Actual Words   |              |
|     |            |            |             |Character -    |              |
|     |            |            |             |      Disperse |              |
|-----|------------|------------|-------------|---------------|--------------|
|4    |plg         |Bash        |1024         |Colours        |+42           |
|     |            |            |             |Random Pause   |              |
|-----|------------|------------|-------------|---------------|--------------|
|5    |Timtech     |TI-84 calc  |120          |Umbrella       |+42           |
|     |            |            |             |Run Inside     |              |
|-----|------------|------------|-------------|---------------|--------------|
|6    |Samuel Cook |JavaScript  |830          |Colours        |+42           |
|     |            |            |             |Transition     |              |
└-----┴------------┴------------┴-------------┴---------------┴--------------┘

Примечание. Табло будет / может обновляться кем угодно после публикации правильного ответа. Не превышайте десятку лучших позиций. Добавьте больше эффектов в свой код и побейте свой собственный счет!
Очистка начального экрана, очистка, ошибки, сторонние библиотеки и т. Д. Не будут учитываться при подсчете очков. Не забудьте указать подробности о нет. используемых байтов и название языка или программы.

Нео: Что ты пытаешься мне сказать? Что я могу увернуться от пуль?

Морфеус: Нет, Нео. Я пытаюсь сказать вам, что когда вы будете готовы, вам не придется.


А как насчет библиотек?
Vereos

Включите или импортируйте или потребуйте столько библиотек, сколько вам нужно (стандартные библиотеки)!
Рене Лидер

Вы бы добавили баллы, если код меньше 250 символов? (У меня очень короткое решение, но у него нет тонны функций)
ThinkChaos

Вам это не понадобится; у вас все равно будет +32 балла! Скорее всего, многие превысят лимит и начнут сбрасывать очки, заставляя короткие коды подниматься до верха на табло. (также, добавление большего количества правил и пунктов усложнило бы вещи)
Рене Лидер

Хорошо, я включу версию для гольфа просто для удовольствия!
ThinkChaos

Ответы:


18

HTML, Javascript и CSS: 1024 байта, 47 баллов

Матрица дождя демо

Функции:

  • Использует символы Unicode (не думайте, что это приносит очки)
  • Трассы исчезают от ярких до темно-зеленых, пока они рисуются (*)
  • Следы также исчезают от темно-зеленого до черного после того, как рисунок закончен (*)
  • Случайный размер текста в каждом следе (*)
  • Трассы случайным образом перемещаются и меняются каждый раз, когда они нарисованы

(*) Я буду требовать +5 баллов за каждый из них, но дайте мне знать, если вы не согласны :-)

Демо-версия:

http://ruletheweb.co.uk/matrix.html

Исходный код:

Ровно 1024 байта. Боюсь, это немного некрасиво.

<head><style>*{margin:0;padding:0;line-height:1;overflow:hidden;}div{width:1em;position:absolute;}</style><script>
w=window;n=w.innerWidth;m=w.innerHeight;d=document;q="px";function z(a,b){return Math.floor(Math.random()*(b-a)+a)}f=" 0123456789";for(i=0;i<45;i++)f+=String.fromCharCode(i+65393);function g(){for(i=0;i<90;i++){r=d.createElement("div");for(j=z(20,50);j;j--){x=d.createElement("pre");y=d.createTextNode(f[z(0,56)]);x.appendChild(y);x.style.opacity=0;r.appendChild(x)}r.id="r"+i;r.t=z(-99,0);with(r.style){left=z(0,n)+q;top=z(-m,0)+q;fontSize=z(10,25)+q}d.body.appendChild(r);setInterval("u("+i+")",z(60,120))}}function u(j){e=d.getElementById("r"+j);c=e.childNodes;t=e.t+1;if((v=t-c.length-50)>0){if((e.style.opacity=1-v/32)==0){for(f in c)if(c[f].style)c[f].style.opacity=0;with(e.style){left=z(0,n)+q;top=z(-m/2,m/2)+q;opacity=1}t=-50}}e.t=t;if(t<0||t>c.length+12)return;for(f=t;f&&f>t-12;f--){s=1-(t-f)/16;if(f<c.length&&c[f].style){c[f].style.opacity=s;}}}
</script><body text=#0f0 bgcolor=#000 onload=g()>

2
Это выглядит хорошо как снимок экрана, но это съедает дерьмо из моих ресурсов. +1 от меня
Сэмюэль Кук

Очень круто! Я мог бы украсть ваши символы Unicode :) +1
ThinkChaos

1
UglifyJS может удалить 17 символов из исходного кода JavaScript. Не то, чтобы это действительно имело значение, так как это не кодовый гольф (скорее, не более 1024 символов).
Конрад Боровски

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

10

удар

1024 байта (включая комментарии)

COL=80
ROW=$(tput lines)

cleanup() {
  wait # wait for background jobs (the drops)
  # clear; move cursor to (1,1); show cursor
  # reset color
  printf '\033[2J\033[1;1H\033[?25h\033[0;0m'
}

drop() { # $1=column ; $2=row to end on ; $3 = drop size (ranges from 5 to 15)
  for ((r=1; r<$2+$3+1; r++)); do
    # if before drop's end point : print lowest char in white
    [ $r -lt $2 ] && printf "\033[$r;$1H\033[0;0m\u$[RANDOM % 59 + 21]"

    # if before or on drop's end point : replace older white char with a green one
    [ $r -le $2 ] && printf "\033[$[r-1];$1H\033[0;32m\u$[RANDOM % 59 + 21]"

    # if drop's longer than it's size : erase last char
    [ $r -gt $3 ] && printf "\033[$[r-$3];$1H "

    # wait before moving drop down
    sleep .1
  done
}

# cleanup on exit
trap cleanup EXIT
# clear screen; hide cursor
printf '\033[2J\033[?25l'

# loop with delay
while sleep .1; do
  # start a drop in background : column; ending row; size
  drop $[RANDOM % COL] $[RANDOM % ROW + ROW/3] $[RANDOM % 10 + 5] &
done

Новые эффекты:

  • все (первая запись);)
  • капли будут останавливаться случайно на экране
  • классные цветовые эффекты: последний символ белый, а остальные зеленые
  • случайные символы и escape-последовательности остаются на консоли ... Хорошо, это ошибка, но это потому, что термин не успевает за движением курсора

Гольф @ 188 186 176 :

d(){ for((r=1;r<$2+41;r++));do $4"$3$r;$1H\u$[RANDOM%59+21]";(($r>$2))&&$4"$3$[r-$2];$1H ";$s;done;}
s=sleep\ .1;while $s;do d $[RANDOM%80] $[RANDOM%10+5] '\033[' printf\ &done

Это работает в сетке 80x40. Вы можете изменить это в RANDOM%80последней строке и r<$2+41во второй. Я не очищаю капли после того, как они выходят из сетки, поэтому либо измените свой термин до 80x40 или измените 41 на $LINES+1. Есть пара вещей, которых нет по сравнению с полной версией:

  • срок подготовки или очистки
  • причудливая окраска (занимает 52 байта, поэтому не стоит)
  • останавливается случайно (здесь капли всегда опускаются на дно)
  • Я мог бы уменьшить его до 174, не указав минимальную длину для «капель»: $[RANDOM%10+5]станет$[RANDOM%15]

Даже с этими ограничениями я думаю, что это круто!

Редактировать: я пытался использовать символы Юникода, такие как брезгливое оссиффраж, но поскольку они представляют собой символы двойной ширины, они заполняют сетку довольно быстро, и в итоге это выглядит странно.

Я также сократил версию для гольфа, используя кодовые символы Юникода вместо ASCII, так что мне не нужно идти восьмерично, чтобы получить символ, сохраняя шаг. Я сделал то же самое в основной версии, но добавил комментарии, чтобы сохранить его на 1024 байта.

А затем изменил сравнение int с [ $r -gt $2 ]на то (($r>$2)), что пробел убил меня, но я не смог найти другой метод, который сравнивал бы целые, а не строки. Это дало гольф-версию до 176 байт!


игра в гольф тоже немного бомба;)
Роб Старлинг

1
@RobStarling они оба на самом деле!
ThinkChaos

1
Очень люблю это! Я возился с ним немного , и кажется , что вы могли бы сделать его зеленым, изменяя \033[к \033[0;32m\033[(по крайней мере , в моем терминале). Насколько плоха идея, чтобы попытаться установить это как заставку терминала? : P
Дом Гастингс

Хм. Я получаю 1059 байтов для первого и 190 байтов для второго.
Рене Лидер

1
Вы, ребята, в основном волшебники! Спасибо, что поделился!
Дом Гастингс

8

JavaScript, 830 байт

Он имеет все классические функции, такие как:

  1. черный фон
  2. зеленый текст
  3. белый текст при падении
  4. случайные символы
  5. пустые отверстия
  6. бесконечный цикл

window.onload=function(){
    var tbl=document.createElement('table'),
	body=document.body;
	body.style.backgroundColor='#000';
	body.style.color='#060';
	body.style.fontFamily='Lucida Console';

    for(var i = 0; i <= 30; i++){
        var tr = tbl.insertRow();
        for(var j = 0; j <= 50; j++){
            var td = tr.insertCell();
			td.style.width="2%";
        }
    }
    body.appendChild(tbl);
	setInterval(function(){
		rain(Math.floor((Math.random()*50)),0)
	},20);
}
function rain(n,i) {          
   setTimeout(function (){
	  var e=document.getElementsByTagName('tr')[i].childNodes[n];
	  e.style.color='#fff';
      e.innerHTML = '&#'+Math.floor((Math.random()*127)+1)+';';
	  setTimeout(function(){e.style.color=''},200)
	  
      if (i++ < 30) rain(n,i);
   },20);
};

Мне это нравится, потому что он невероятно легкий, подвижный и простой. наслаждаться!


6

QBasic 1, 587 байт, 32 + 5 = 37 баллов

DECLARE SUB d (p!, s!, x!, y!)
DIM t(80)
FOR i = 1 TO 80
    t(i) = INT(-50 * RND)
NEXT
s = TIMER

CLS
WHILE 1
    FOR i = 1 TO 80
        IF t(i) > 28 THEN t(i) = 0
        t(i) = t(i) + 1
        y = t(i)
        d 0, 0, i, y - 6
        d 2, 0, i, y - 5
        d 2, 0, i, y - 4
        d 10, 0, i, y - 3
        d 10, 0, i, y - 2
        d 11, 0, i, y - 1
        d 0, 2, i, y
    NEXT

    l = TIMER
    WHILE l = TIMER
    WEND
WEND

SUB d (p, s, x, y)
COLOR p, s
IF y > 0 AND y < 24 THEN LOCATE y, x: PRINT CHR$(33 + (x * y) MOD 200);
END SUB

Пример скриншота:

QBasic matrix 1

32 базовых пункта + 5 баллов за цвет. Но так как я плаваю значительно ниже 1024 байт, даже без обрезки или оптимизации пробелов, давайте добавим еще несколько вещей, чтобы украсть некоторые моменты:

QBasic 2, 913 байт, 32 + 5 + 15 + 5 = 57 баллов

DECLARE SUB d (p!, s!, x!, y!)
DIM t(80)
FOR i = 1 TO 80
    t(i) = INT(-50 * RND)
NEXT
s = TIMER
f = 0
w$ = "bullet"
o = 1
CLS
WHILE 1
    FOR i = 1 TO 80
        IF t(i) > 28 THEN t(i) = 0: IF f THEN SOUND 100 * i, 1
        t(i) = t(i) + 1
        y = t(i)
        d 0, 0, i, y - 6
        d 2 + x, 0, i, y - 5
        d 2 + x, 0, i, y - 4
        d 10 + x, 0, i, y - 3
        d 10 + x, 0, i, y - 2
        d 11 + x, 0, i, y - 1
        d 0, 2 + x, i, y
    NEXT
    k$ = INKEY$
    IF k$ <> "" THEN
        IF MID$(w$, o, 1) = k$ THEN
            o = o + 1
            IF o = LEN(w$) + 1 THEN z = 1: f = 100
        ELSE
            o = 1
        END IF

    END IF
    x = x + z
    l = TIMER
    WHILE l = TIMER
    WEND

WEND

SUB d (p, s, x, y)
COLOR p MOD 16, s MOD 16
IF y > 0 AND y < 24 THEN LOCATE y, x: PRINT CHR$(33 + (x * y) MOD 200);
END SUB

Пример скриншота (активирован цветовой эффект):

Qbasic Matrix 2

Те же функции, что и первый. Дополнительно имеет:

  • Цвет (+5)
  • Пароль для активации дополнительных функций. (Я требую +5 за это как новую функцию.)
  • Пароль активирует палитру затухания и звуковые эффекты. (+15 за звук.)

Видео, показывающее его в действии, включая цветовой эффект и звуковой эффект, активируемый паролем:

http://www.youtube.com/watch?v=MQc-FDl_AZ8


5

GTB , 42 балла

Выполнено из калькулятора TI-84, около 100 байт:

"  O O    O O   O"→Str1:"O  O   O O  O O "→Str2:0→X[@getkey=25$~""~""~""~""~""~""~""p;&@round(r;$~""#@round(r;$~Str1#~Str2&:&]

Последствия

Так как калькулятор чёрный + белый, для начала ничего не могу поделать ...

  • Зонт - Нажатие клавиши «вверх» удаляет дождь и сохраняет вас сухим, пока вы не нажметеEnter
  • Run Inside - Нажатие ONнарушает программу и дает вам хорошую крышу, чтобы держать вас сухим (вы можете вернуться в дождь, нажав Enterдважды

отлично работает на моем TI-92! Потрясающе.
Рене Лидер

@ user3058846 Я рад, что тебе понравилось :) Я не знал, что GTB может работать на TI-92.
Timtech

ТИ-92 Плюс на самом деле.
Рене Лидер

@ user3058846 Так ты скачал компилятор, а? Отличная работа :)
Timtech

4

Рубин: 374 персонажа

$><<"^[[2J"
w=->c,d,m{$><<"^[[0;3%d;%dm^[[%d;%dH%s"%[c,d[4],d[3]+d[1]-m,d[2],d[0][d[1]-m]]}
t=%w{Stack Exchange Programming Puzzle Code Golf}
r=[]
loop{r.map{|o|w[2,o,1]if o[1]>0
w[7,o,0]
o[1]+=1
o[0][0]==" "?r.delete(o):(o[0]=" "*o[1])*o[1]=0if o[1]>o[0].size}
sleep 0.1
r<<[(k=rand(10)%2)==0 ?t.sample: [*?a..?z].sample(rand(10)+5)*"",0,rand(80),rand(20),k+1]while r.size<25}

(Примечание: ^[одиночные символы.)

Описание:

  • 25 одновременных прогонов (поддерживается на низком уровне, поэтому предопределенные тексты остаются читаемыми)
  • каждый проход имеет 50% / 50% шанс быть либо
    • предопределенное слово - отображается яркими цветами
    • случайная строка из 5..15 строчных букв - отображается темными цветами
  • при отображении бега нижний цвет - белый, остальные - зеленый
  • после того, как пробег полностью отображается, он удаляется символ за символом

Образец прогона:

матричный дождь


Сколько байт (не символов)?
Рене Лидер

1
Используются только однобайтовые символы, поэтому 374 байта.
manatwork

Очень понравилась твоя версия! Продолжайте хорошую работу.
Рене Лидер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.