Мне слишком холодно, поднимите температуру


53

Это мой первый турнир по гольфу.

Что тебе необходимо сделать

Создайте мне, как можно меньше байтов, мою систему дистанционного управления AC. В моей комнате сейчас слишком холодно, и я скучаю по своему пульту.

Теперь, я не хочу, чтобы вы буквально строили это или что-то еще, просто игра в гольф:

Медленный прирост температуры, начиная с 40 градусов и заканчивая ровно 72. Время приращения всегда должно составлять 500 миллисекунд на приращение. Это может подождать еще 500 мс в конце. Я предпочел бы это остановить однако. Сам прирост должен увеличиваться на два каждый раз, как мой пульт.

Вы не должны очищать экран. Вы должны иметь переводы строк.

Что должно произойти

Пример вывода (все в скобках выводить не следует).

40
(wait 500 millis)
42
(wait 500 millis)
44
(..repeat until 72..)
72
(stop or wait 500ms)

Имейте в виду, это мой первый гольф, поэтому я прошу прощения, если это слишком сложно для гольфа. :(

Удачи, гольфисты!


3
Незначительная вещь, но «всегда должно быть 500 миллис» принципиально слишком строга для любого разумного устройства. Я бы порекомендовал указать отклонение, что-то вроде +/- 10%.
FryAmTheEggman

1
Можете ли вы подождать 500 мс, прежде чем показывать начальный вывод?
FlipTack

35
-1 за использование Фаренгейта (не совсем, но вы должны, по крайней мере, сказать , что используете его; 40 градусов по Цельсию не слишком холодно)
Джон Дворжак

20
+1 за использование Фаренгейта, он имеет лучшее разрешение, чем по Цельсию, и так же произвольно, как и все, кроме Кельвина или Ранкина
Ник Т

8
@NickT тогда вам не повезло, потому что разрешение этого пульта составляет 2 ° F, что выше 1 ° C. И вы можете получить более высокое разрешение в градусах Цельсия, чем по Фаренгейту, с пультом, который может отображать 0,5 и более, если он может отображать до 0,1. Во всяком случае, я простой человек и не могу
различить

Ответы:


43

Утилиты Bash + Linux, 19

seq 40 2 72|pv -qlL2

seqгенерирует числовой вывод. pvограничивает скорость до 2 строк / сек


2
Выходные данные -qподавляются на STDERR, поэтому я не думаю, что вам это нужно.
Деннис

14
Отличная демонстрация «делай одно и делай это хорошо» с правильными инструментами для работы. :)
Дверная ручка

2
Приближаясь к территории "анти-гольфскрипт анти-гольф" .
Ви.

42

Minecraft 1.9.0+, 204 162 байта + 58 36 28 24 20 блоков = 262 240 232 186 182 байт

Это решение отлажено, и его нельзя увидеть целиком в одном или даже в двух скриншотах. Использует два глюка и злоупотребляет еще двумя особенностями игры

БЕГАТЬ!  MINECRAFT убьет вас!

Это решение использует те же принципы, что и ниже, только в 4 блоках более компактный дизайн.

  • Злоупотребляет тем фактом, что цепочки командных блоков (зеленые блоки) не могут быть приведены в действие красным камнем, а только синглом из импульсного командного блока (оранжевым).

  • Злоупотребление тем фактом, что поршни полностью расширяются за 0,30 секунды, а Redstone требуется всего 0,10 секунды, чтобы зарегистрировать сигнал.

  • Также использует двойной глюк, чтобы отключить таймер (TNT): красный камень рядом с таймером (TNT) не только получает питание, но и думает, что TNT является еще одним красным камнем и приводит его в действие.

  • Вдобавок ко всем этим злоупотреблениям, укорочение сигнала (вещь под TNT) является одноразовым, после того, как оно получает питание, оно меняет форму, позволяя передавать сигнал через него на «инкрементатор» (самый верхний оранжевый блок)

Небольшое объяснение функциональности его различных частей можно увидеть в более старых решениях (но лучше всего в приведенном ниже). Вы также можете попробовать это в автономном режиме! (упрощенное решение, увеличивающееся на 4, работает только в 1.11+) , выполнив эту команду в командном блоке .


Старое решение, Minecraft 1.9.0+, 186 байт:

РУКОВОДСТВО

Поскольку TNT обычно взрывается через 3 с в Minecraft, этот должен быть помещен командой ( /setblock) с указанным предохранителем. Также используется более компактная конструкция для удаления избыточного блока команд (содержащего 42 байта) и редстоуна по сравнению со старыми версиями. Я уверен, что это не может быть ниже ...

Более старое решение, Minecraft 1.9.0+, 232 байт:

К сожалению, я обнаружил увеличение этих старых решений на 4 ...

golfcraft

Для сохранения блоков используется функция цепочки блоков команд 1.9 (зеленый блок). Также использует более компактный укороченный сигнал, чем в старых решениях

Еще более старое решение, Minecraft 1.7.0+, 240 байт:

бездушный монстр

Использует более компактный таймер (TNT), чем первое решение (ниже).

Самое старое решение, Minecraft 1.7.0+, 262 байт:

старый монстр


Это так долго из-за того, как Minecraft обрабатывает переменные:

  • Чтобы определить переменную (int): scoreboard objectives add <variable> dummy

  • Чтобы установить значение для переменной (каждый объект, включая игроков, имеет свое собственное значение переменной): scoreboard players set <entity> <variable> <value>

    • *может использоваться как <entity>для выбора всех объектов и сохранения байтов.

    • можно использовать только определенные переменные

    • значение переменной должно быть установлено на число, а не на переменную

  • Чтобы увеличить var1 на var2: scoreboard players operation <entity> var1 += <entity> var2

    • <entity>должен быть единым целым, например. @pне*

Скриншоты мои, с двойной лицензией под WTFPL, и какую лицензию SE решит использовать сегодня (в настоящее время cc by-sa 3.0 with attribution required) :-)


2
Вау! Вы использовали Minecraft, это гений! +1 :)
IMustBeSomeone

1
@IMustBeSomeone Подождите, я нашел способ
поиграть

1
... ваша схема взрывается, когда закончите.
SuperJedi224

@ SuperJedi224 Да. Это неправильно?
РудольфДжелин

2
@ RudolfL.Jelínek Я уверен, что на самом деле это не противоречит правилам, но это немного странно. Опять же, это часть того, что представляет собой гольф-код.
SuperJedi224

18

Vim, 24 , 23 байта / нажатия клавиш

i40<esc>qq:sl500m
Yp2<C-a>q15@q

Один байт сохранен благодаря @Kritixi Lithos!

Написано с моего телефона, проверено в мобильном vim (что, видимо, реальная вещь).

Вот гиф этого бега:

введите описание изображения здесь

А вот объяснение команда за командой:

i40<esc>            " Insert '40' into the buffer
        qq          " Start recording into register 'q'
          :sl500m   " Sleep form 500 ms
Y                   " Yank this line
 p                  " and paste it on a newline
  2<C-a>            " Increment this line twice
        q           " Stop recording
         15@q       " Callback register 'q' 15 times

sВ не msявляется обязательным, вы можете удалить его , чтобы сохранить байт :)
Kritixi LITHOS

@KritixiLithos Я знал это! Как я это упустил? Спасибо!
DJMcMayhem

8
Ученик стал учителем: P
Kritixi Lithos

1
«Я выложу gif и объяснение позже, как только у меня будет доступ к компьютеру», ждет пол года (не совсем)
HyperNeutrino

@HyperNeutrino Хахахахаха, я полностью забыл об этом ответе. Это лучше: P
DJMcMayhem

10

JavaScript (ES6), 52 байта

f=(i=40)=>console.log(i)|i-72&&setTimeout(f,500,i+2)

f()


Вот более аккуратный кроссировочное вашего ответа для вас: f=(i=40)=>setTimeout(i>70||f,500,i+2,console.log(i)). К сожалению, все те же 52 байта.
Исмаэль Мигель

Разве это не должны быть 50байты, поскольку вам не нужно считать на f=основе мета-консенсуса, что анонимные объявления функций разрешены?
Р. Кап

1
@ R.Kap Хороший улов, но в этом случае f=требуется, потому что функция должна вызывать себя (как первый параметр для setTimeout).
ETHproductions

8

Желе , 13 12 байт

40µṄœS.+2µ⁴¡

Попробуйте онлайн! Программа Jelly обернута в сценарий Bash, чтобы поставить перед каждой строкой выходных данных метку времени.

Как это устроено

40µṄœS.+2µ⁴¡  Main link. No arguments.

40             Set the return value to 40.
  µ      µ⁴¡  Execute the chain between the two µ 16 times.

   Ṅ           Print the return value, followed by a linefeed.
      .        Yield 0.5.
    œS         Sleep for 0.5 seconds. Yield the previous result.
       +2      Add 2.

После последней итерации конечное значение 72 печатается неявно, и программа завершается.


Вау, это намеченная особенность - возможность звонить на другие языки с Bash in tio?
миль

2
Да, это предназначено. Вы должны быть в состоянии сделать то же самое со всеми языками, которые поддерживают системные вызовы или аналогичные функции.
Деннис

Для языка, который побеждает в соревнованиях по гольфу, и часть задачи увеличивается на постоянную величину, это выглядит очень долго для меня :)
AlexRacer

6

Perl 6 , 30 байт

for 20..36 {sleep .5;say 2*$_}

Извините, что это похоже на код без кода, я не вижу способа сделать его короче ...

Версия, которая останавливается сразу после последнего номера, будет 37 байтов:

for 20..36 {sleep .5 if $++;say 2*$_}

Вам нужно место после 36?
NoOneIsHere

2
.say&sleep(.5) for 40,42...7229 байт
ugexe

@ugexe: Опираясь на побочные эффекты аргументов операторов, не использующих короткое замыкание, чтобы они происходили по порядку, для меня это похоже на хак, связанный с реализацией, потому что AFAIK языковая спецификация не гарантирует этого. OTOH, может быть, для кода гольф это нормально?
smls

@SeeOneRhino: Да. {Кронштейн следующего другое выражение без пробелов, интерпретируются как начало хэша ( «ассоциативный массив») нижний индекс. Perl 6 такой строгий, потому что его грамматика была специально разработана, чтобы позволить однопроходный синтаксический анализ исходного кода без (почти) обратного отслеживания.
smls

6

Pyth - 12 байт

Очень просто, использует цикл for от 0-17.

V17+40yN.d.5

Самый маленький на данный момент, вы привязаны к первому месту :)
IMustBeSomeone

6

TI-Basic (только CE или CSE), 16 байтов

:For(A,40,72
:Pause A,.5
:End

Обратите внимание, что многие команды являются однобайтовыми токенами.


Я вижу 29 байт? Можно ли показать 8-байтовый код?
Redstarcoder

1
TI-Basic имеет свой собственный набор символов. For(, Pause , End, И колоны в начале строки все одиночные байты.
Джулиан Лакниет

Странно ... хорошо, похоже, что другие ответы тоже так делают.
Redstarcoder

1
Наши лучшие пока! Тем не менее, я не знаю, если я буду считать набор символов своего рода вещь.
IMustBeSomeone


5

MATL , 14 байтов

17:E38+".5Y.@D

Попробуйте это в MATL Online! Возможно, вам придется перезагрузить страницу, если она изначально не работает.

объяснение

17:     % Push array [1 2 ... 17]
E       % Multiply by 2, element-wise
38+     % Add 38, element-wise. This gives [40 42 ... 72]
"       % For each k in that array
  .5Y.  %   Pause 0.5 seconds
  @D    %   Push k and display
        % End (implicit)

Старая версия (до изменения спецификации), очистка экрана

17:E38+"5&Xx@D

Попробуйте это в MATL Online!


Вам не нужно очищать экран.
Адам

@ Adám Спасибо. Я знаю, но это заняло столько же байтов и выглядит лучше :-)
Луис Мендо

1
@LuisMendo В соревновании по гольфу говорится о том, что не нужно очищать экран после правок / уточнений (возможно, после вашего поста)
Томас Уорд

@ThomasWard Спасибо за хедз-ап! ОП действительно должен был уведомить ответчиков об изменении
Луис Мендо

4

Dyalog APL , 20 байтов

{⎕DL.5⊣⎕←⍵}¨38+2×⍳17

{ анонимная функция

⎕DL задержка ...

.5⊣ половина (секунда), а не значение

⎕← печать (с новой строки)

 Аргумент

применяется к каждому из

38+ тридцать восемь плюс

дважды

⍳17 целые числа от 1 до 17


4

C скомпилирован с Clang 3.8.1 в Linux, 62 59 58 байт

2 байта сохранены благодаря @ranisalt

s=38;main(){for(;s<74;printf("%d\n",s+=2))usleep(500000);}

59 байт

s=38;main(){for(;s<73;printf("%d\n",s+=2+usleep(500000)));}

62 байта

s=38;main(){for(;s!=72;){printf("%d\n",s+=2);usleep(500000);}}

s=38                # Initializes a global (int) variable, this is only possible in C, in other languages from the C family variables must have an explicit type.
main()              # Is the main entry point, again as before, in case a type isn't specified C defaults to int
printf("%d\n",s+=2) # printf outputs to stdout based on the pattern defined in the first parameter 
                    # %d is a placeholder for an int variable
                    # \n appends a newline to stdout
                    # The second parameter increments the s variable and afterwards it goes in the placeholder's spot.
usleep(500000)      # This function is Linux specific, it takes an int as parameter, it represents how much time the app needs to sleep in microseconds

2
Спасибо за ответ, и добро пожаловать на сайт. Не могли бы вы добавить немного объяснений для тех, кто не так хорошо знаком с вашим языком?
Исаак

1
Спасибо, что приветствовали меня. Да, конечно, я могу это сделать. Кроме того, как мне сделать, чтобы мой пост вычислял, сколько байт требуется? Я написал это сам, но в постах других это выглядит иначе.
Уэйд Тайлер

Все пишут сами, функции автоматического расчета нет. Ваш заголовок используется ** ... **в разметке, тогда как традиционный заголовок на этом сайте использует # .... Я отредактировал ваш ответ, чтобы вы могли видеть, как это делается.
Исаак

1
@isaacg Большое спасибо. Теперь это выглядит лучше.
Уэйд Тайлер

1
Использование s<72сохраняет другой байт.
Ранисалт

4

Царапина, 5 блоков

(дисковое пространство 56.0kb)

IMG

(извините за низкое разрешение!)

Самоочевидно, правда. Значение переменной отображается в поле на «сцене».


Разве это не имеет приращения 4? (в отличие от 2 по запросу)
VisualMelon

1
@VisualMelon Ах, спасибо за уведомление - я неправильно понял вопрос до того, как он был отредактирован; Позже я перечитал его и отредактировал другой ответ, забыв этот. Спасибо!
РудольфДжелин

3

Mathematica, 34 байта

Pause[Print@#;.5]&/@Range[40,72,2]

Полная программа. Не требует ввода и вывода на STDOUT.


3

R, 49 байт

x=38;while(x<72){Sys.sleep(.5);x=x+2;cat(x,"\n")}

Очень тривиальное решение, но оно делает свое дело.


Начальный x = 40 не печатает 40 при запуске. Вы должны начать с х = 38.
Рнсо

Забавно, та же идея, но с for-loop точно такой же длины.
JAD

3

Perl 6 , 27 байт

sleep .say/2 for 40,42...72

sayвозвращает True, который приводится к числовому 1при делении на 2.

Unicode shenanigans может получить до 23 символов:

sleep .say/2 for ㊵,㊷…72

Но это 29 байтов в кодировке UTF-8.


3

Python 2, 57 56 55 байт

import time
a=40
while a<73:print a;time.sleep(.5);a+=2

РЕДАКТИРОВАТЬ:

-1 байт благодаря Mega Man

-1 байт благодаря Flp.Tkc


1
Вы можете сохранить один байт, используя 0,5 вместо 0,5
Mega Man

@MegaMan Спасибо, я не осознавал, что это может сработать
sonrad10

Почему бы не снять круглые скобки вокруг оператора print и не использовать Python 2?
FlipTack


3

C #, 95 байт

()=>{for(int i=40;i<73;i+=2){System.Console.WriteLine(i);System.Threading.Thread.Sleep(500);}};

Это простой цикл, он ждет дополнительных 500 мс в конце.


3

QBIC , 21 байт

[44,72,4|?a┘'sleep 1.

QBIC запускает цикл FOR, работающий с 44 до 72 и увеличивая счетчик на 4 в каждом цикле. Затем он спит в течение 1 секунды. У QBasic нет более тонкого контроля sleep, поэтому я добавил .имитацию дачи .5в качестве аргумента.


3

Котлин, 47 байтов

Я предполагаю, что в формулировке проблемы не было сказано, что решения должны содержать увеличение на два, так что 40+2*iздесь это законно.

Если написано как обычный источник Kotlin с main:

fun main(args:Array<String>){(0..16).map{println(40+2*it);Thread.sleep(500)}}

(77 байт)

UPD : в Kotlin 1.3 args:Array<String>его можно удалить, так что это на 18 байт меньше.

А в Kotlin Script вся программа будет

(0..16).map{println(40+2*it);Thread.sleep(500)}

(47 байт)


Кажется, ваша первая программа сначала долго ждет, а затем выводит все результаты.
devRicher

1
@devRicher, похоже, вы запускаете его на try.kotlinlang.org. Если это так, то это проблема среды, похоже, что стандартный вывод не сброшен или что-то в этом роде. Когда я запускаю его локально, он ведет себя как задумано.
горячая клавиша


2

Haskell, 67 байт

import System.Posix.Unistd
mapM((>>usleep 500000).print)[40,42..70]

Если вы хотите использовать только ghc, вы можете сохранить несколько байтов, импортируя GHC.Concи используя threadDelayвместо usleep.


2

php, 38 байт

for(;35>$t+=2;usleep(5e5))echo$t+38,_;

использует подчеркивание в качестве разделителя. Беги с -nr.


2

Clojure, 54 байта

(doseq[t(range 32 73 2)](println t)(Thread/sleep 500))

Третий лист Просто выполняйте итерации по всему диапазону, печатая и пересылая каждую итерацию. Спит в конце.

Ungolfed:

(doseq [t (range 32 73 2)]
    (println t)
    (Thread/sleep 500)))

Версия, которая не спит в конце, 66 байт

(doseq[t(range 32 73 2)](println t)(if(< t 72)(Thread/sleep 500)))

Обратите внимание, что это полные программы, так как инструкции не указывают. Добавьте байт к каждому, если требуется функция.


2

Ракетка 46 байт

(for((i(range 40 73 2)))(println i)(sleep .5))

Ungolfed:

(define (f)
  (for ((i (range 40 73 2)))
    (println i)
    (sleep .5)))

Команда для запуска: (f)


1
Помните, он не должен останавливаться на 72, он может ждать еще 500 мс. :)
IMustBeSomeone

2

Октава, 38 35 байт

Сохраненные 3 байта благодаря @LuisMendo пути изменения endforвend

for i=20:36;disp(2*i);sleep(.5);end

Попробуйте онлайн!

Я новичок в Octave, так что это решение может быть еще лучше. Любые советы приветствуются!

Ungolfed

for i=20:36
  disp(2*i)
  sleep(.5)
end

2

Python 2, 57 58 байт

редактировать

На моем счету 57 байтов, но TIO говорит 58 теперь, когда я вернулся на свою машину, так что это мое последнее предложение. Интересно, что TIO, похоже, не соблюдает тайм-аут и просто ждет, а затем распечатывает весь список за один раз. Работает на QPython для Android и Python 2 на моем Ubuntu, так что мне этого достаточно.

import time
for x in range(40,74,2):print x;time.sleep(.5)

Попробуйте онлайн!

Было бы 58 59 в Python 3, так что не бьет @ sonrad10 в любом случае.


1
Это приведет к синтаксической ошибке, вам нужно двоеточие (не точка с запятой) послеrange(...)
FlipTack

Спасибо @ Flp.Tkc. Это было напечатано непосредственно на моей удобной hense опечатка.
ElPedro

2

R, 44 42 байта

Прямой цикл, скорее всего, есть более подходящий путь. (Кроме того, перечеркнутый 44 все еще обычный 44 ...)

for(i in 20:36*2)cat(i,"\n",Sys.sleep(.5))

2

F #, 60 байтов

async{for i in 40..2..72 do printfn"%d"i;do!Async.Sleep 500}

Это асинхронное выражение, чтобы запустить его, передайте его в Async.Startили Async.RunSynchronously.


2

Noodel , неконкурентный 10 байтов

Не может соревноваться, потому что Нудель родился после того, как был создан вызов :(

40Ḷ16ñ++ḍh

Попробуй:)

Как это устроено

40         # Creates the literal number 40 and places it into the pipe.
  Ḷ16      # Loop the following code 16 times.
     ñ     # Print what is in the front of the pipe with a new line.
      ++   # Increment what is in the pipe by two.
        ḍh # Delay for a half a second (500ms).

Нет версии Noodel, которая поддерживает синтаксис, использованный в этом ответе. Вот верная версия:

kȥḶ16ñ⁺2ḍh

<div id="noodel" code="kȥḶ16ñ⁺2ḍh" input="" cols="10" rows="17"></div>

<script src="https://tkellehe.github.io/noodel/noodel-latest.js"></script>
<script src="https://tkellehe.github.io/noodel/ppcg.min.js"></script>

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