Мені занадто холодно, підвищити температуру


53

Це моє перше змагання з гольфу.

Що вам потрібно зробити

Побудуйте мені, якнайкоротше, кількість байтів, свою систему дистанційного керування змінного струму. У моїй кімнаті зараз занадто холодно, і я пропускаю свій пульт.

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

Повільний приріст температури, починаючи з 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. У будь-якому випадку я проста людина і не можу розмежувати між 22 і 23 ° C, тому висока роздільна здатність у цьому випадку для мене марна
phuclv

Відповіді:


43

Утиліти Bash + linux, 19

seq 40 2 72|pv -qlL2

seqгенерує числовий вихід. pvratelimits це до 2 рядків / сек.


2
-qПригнічення виходу переходить до STDERR, тому я не думаю, що вам це потрібно.
Денніс

14
Відмінна демонстрація "зроби одну справу і зроби це добре" з правильними інструментами для роботи. :)
Дверна ручка

2
Наближаючись до території "анти-гольфскрипту проти гольфу" .
Ві.

42

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

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

РУН!  МІНЕКРАФ ТЕБЕ ВІН!

Це рішення використовує ті самі принципи, що і нижче, лише на 4 блоки більш компактний дизайн.

  • Зловживає тим, що ланцюгові командні блоки (зелені блоки) не можуть живитись червоним каменем, лише сингалом із блоку команд імпульсу (помаранчевий).

  • Фактично зловживати поршням потрібно 0,30 секунди, щоб повністю простягнутись, а для реєстрації сигналу Redstone потрібно всього 0,10 секунди.

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

  • Крім усіх цих зловживань, скорочувач сигналу (річ під ТНТ) є одноразовим, після того як він отримує живлення, він змінює форму, дозволяючи передавати сигнал через нього в "інкремент" (верхній помаранчевий блок)

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


Старий розчин, Minecraft 1.9.0+, 186 біліт:

ЗЛОЖЕННЯ МІНЕКРАТ

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

Старіше рішення, Minecraft 1.9.0+, 232 білати:

На жаль, я дізнався, що ці старіші рішення зростають на 4 ...

гольф

Для збереження блоків використовується функція ланцюга команд 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 (що, мабуть, справжня річ).

Ось ваш gif працює:

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

А ось пояснення по команді:

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
Учень став учителем: П
Крітіксі Літос

1
"Я опублікую gif і пояснення пізніше, коли я отримаю доступ до комп'ютера" чекає півроку (не зовсім)
HyperNeutrino

@HyperNeutrino Hahahahaha, я зовсім забув про цю відповідь. Це краще: 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 байт

Дуже просто, використовує цикл від 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, І колони на початку рядка все поодинокі байти.
Julian Lachniet

Дивно ... гаразд, схоже, що і інші відповіді роблять це.
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 Проблема з гольфом говорить про те, щоб не очистити екран, після редагувань / уточнень (можливо, після вашого повідомлення)
Thomas Ward

@ThomasWard Дякую за голову! ОП дійсно повинен був повідомити відповідальних про зміну
Луїс Мендо

4

Діалог 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
Дякуємо за відповідь та ласкаво просимо на сайт. Чи можете ви додати трохи пояснень для тих, хто не так добре знайомий з вашою мовою?
isaacg

1
Дякуємо, що вітали мене. Так, я можу це зробити. Крім того, як змусити свій пост обчислити, скільки байтів потрібно? Я це написав сам, але в інших публікаціях це виглядає інакше.
Уейд Тайлер

Кожен пише сам, немає функції автоматичного обчислення. Ваш заголовок використовується ** ... **для розмітки, тоді як традиційний заголовок на цьому веб-сайті використовується # .... Я відредагував вашу відповідь, щоб ви могли бачити, як це робиться.
isaacg

1
@isaacg Дякую велике Це зараз виглядає краще.
Уейд Тайлер

1
Використання s<72зберігає ще один байт.
Ранісальт

4

Скретч, 5 блоків

(місце на диску 56.0kb)

img

(вибачте за низьку роздільну здатність!)

Пояснювально, справді. Значення змінної відображається у вікні "етап".


Це не має збільшення 4? (на відміну від 2 як запит)
VisualMelon

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

3

Математика, 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")}

Дуже банальне рішення, але воно робить свою справу.


Початковий х = 40 не друкує 40 на старті. Почати потрібно з x = 38.
rnso

Смішна, та сама ідея, але з for-лопом точно такої ж довжини.
JAD

3

Perl 6 , 27 байт

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

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

Шінігани Unicode можуть зменшити його до 23 символів:

sleep .say/2 for ㊵,㊷…72

Але це 29 байтів, кодованих UTF-8.


3

Пітон 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
Ви можете зберегти один байт, скориставшись .5 замість 0,5
Мега Ман

@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тут законно.

Якщо написано як звичайне джерело Котліна з 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. Якщо так, то це проблема навколишнього середовища, схоже, що stdout не змивається чи щось. Коли я запускаю його локально, він поводиться так, як задумано.
гаряча клавіша


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

Третій lisp ftw. Просто перебирає діапазон, друкуючи і спаючи кожну ітерацію. Спить в кінці.

Безголівки:

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

Безголівки:

(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, тому це рішення все ж може бути далі для гольфу. Будь-які поради вітаються!

Безумовно

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

2

Пітон 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)

Спробуйте в Інтернеті!

У Python 3 було б 58 59, так що жодним чином не б'є @ sonrad10.


1
Це призведе до помилки синтаксису, вам потрібна двокрапка (не крапка з комою) післяrange(...)
FlipTack

Дякуємо @ Flp.Tkc. Це було набрано прямо на моєму зручному підписі.
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

Локшина , не конкуруючи 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.