Мерехтіть CAPS LOCK


107

Більшість клавіатур комп'ютера оснащена невеликим інтегрованим світлодіодним індикатором, що вказує поточний режим введення, що контролюється кнопкою CAPS LOCK.

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

Ваше завдання - це моргати:

  • Увімкніть його;
  • Зачекайте 0,5 (+/- 0,1) секунди;
  • Вимкніть його знову.

Відеоматеріали світлодіодного миготіння високо оцінені!

Правила

  • Ви можете блимати іншим світлодіодом (наприклад, Блок прокрутки, Блокування чисел, стан Wi-Fi тощо), якщо бажаєте, але він повинен бути фізично розташований на вашій клавіатурі;

  • Якщо у вашій мові відсутня sleepкоманда підсекунди , ваша програма може використати натомість затримку на 1 секунду, в розмірі +2 байти (це для 0.);

  • Ваша програма повинна блимати принаймні один раз, те, що станеться згодом, залежить від вас, тобто вона може продовжувати блимати (у такому випадку ви повинні дочекатися такої ж затримки, перш ніж увімкнути її), або зупинити і т.д.;

  • Якщо вибраний світлодіод за замовчуванням увімкнено, у вашій системі можна припустити, що він був явно вимкнений (наприклад, вручну) перед запуском програми;

  • Це , найкоротша відповідь у байтах виграє.

Таблиця лідерів

var QUESTION_ID=110974,OVERRIDE_USER=61904;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>


83
Відповідь на обман, яка не дуже спрацьовує: в системі Linux навмисно збийте ядро. Еквівалент BSOD в Linux блимає індикатором Caps Lock, на випадок, якщо збиток також зняв апаратне відео, і ви не можете побачити звіт BSOD на екрані. На жаль, наскільки я можу сказати, це спалахує занадто швидко, щоб бути прийнятною відповіддю. Це призведе до (дещо шкідливого) 14-байтового рішення, якби це було дозволено.

57
Тепер блимніть його кодом Морзе: "Допоможіть, я потрапив у пастку клавіатури на фабриці!"
mbomb007

12
@ ais523 мій ноутбук зробить це, якщо я струшу його (0 байт). Занадто швидко ...
Тім

18
Клавіша Capslock на C64 - це механічний вимикач. Моргання, що може бути дещо хитро ...
Марк

8
Тепер мені цікаво, чи індикатор низької заряду батареї на моїй бездротовій клавіатурі блимає з потрібною швидкістю. Якщо так: нуль байт.
Роджер Ліпскомб

Відповіді:


123

Befunge (BEF32), 390 334 305 байт

Це справді нерозумно, але поки цей сайт приймає думку про те, що інтерпретатор визначає мову , я можу також зловживати цим правилом. Цей код працює лише у впровадженні Win32 Befunge-93 Кевіна Вігора-93, версія 1.01 (я думаю, єдина версія доступна). Ви можете завантажити бінарний файл тут .

p55p99+5p65*5p")"5p"M"3*"I~q"+\3*3445"|"2*"lm"2v
v"y"*3\*2"e/n"4\5"nnIn"*833*2"mn"4\7"nnIn"*833*<
>2*"yO"4"DJG"3*\2*55*3"T"4"DLG"3*\2*55*3"/~M"+\3*4446"~A"+4v
>+00p9p:v:"l'"*2"^D"4"l3"*2"^D"4"l"*54*2"^D"4"l"*2+94*2"^D"<
^1:g00-4_5"u1"*-:1+:1+"@"\0p"%"5*\0p"P"\0p@
Sleep kernel32.dll keybd_event user32.dll

Зараз зазвичай ви не очікуєте, що подібний виклик стане можливим у Befunge, але BEF32 - порт Win32 дуже старої версії референтної реалізації, і тоді не було перевірки меж для команди p(put). Це ефективно дозволяє нам записувати в будь-яке місце в пам'яті, що в кінцевому підсумку дозволяє змусити перекладача виконувати довільний машинний код.

Тепер ми фактично не можемо змінити жоден існуючий код, оскільки розділ .text виконуваного файлу не матиме дозволів на запис. Однак ми можемо обдурити систему у виконанні адреси в розділі .data, записавши цю адресу в atexitтаблицю бібліотеки виконання (принаймні, я підозрюю, що це таке). Кінцевим результатом є те, що наш код автоматично виконується при виході перекладача.

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

Сам код по суті є копією техніки Мего , keybd_eventпереведеної в машинний код:

6823B84000         push "keybd_event"
682FB84000         push "user32.dll"
6810B84000         push "Sleep"
6816B84000         push "kernel32.dll"
BB02000000         mov  ebx,2
               initloop:
89C7               mov  edi,eax
FF1594D14000       call LoadLibraryA
50                 push eax
FF1590D14000       call GetProcAddressA
4B                 dec  ebx
75EE               jnz  initloop
89C6               mov  esi,eax
               flashloop:
6A00               push 0
6A01               push 1
6A45               push 69
6A14               push 20
FFD6               call esi
6A00               push 0
6A03               push 3
6A45               push 69
6A14               push 20
FFD6               call esi
68F4010000         push 500
FFD7               call edi
EBE3               jmp  flashloop

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

А оскільки всі публікують анімацію, це приблизне відображення на моїй клавіатурі.

Анімація миготливого світла капсули


30
Зазвичай люди зловживають правилами, щоб полегшити їм життя, але це не кодери Befunge :)
Аарон,

21
Ніколи не сподівався на відповідь esolang на цей виклик +1
zeppelin

9
Це моя улюблена відповідь на цьому сайті
Cruncher

2
Відмінна реалізація!
Даніель

3
@JamesHolderness Так? Це чудова відповідь, навіть якщо вона довга.
NoOneIsHere

72

AutoHotkey, 29 26 байт

Завдяки @Dane за збереження 3 байтів

Loop{
Send,{VK14}
Sleep,500
}

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

МиготливийNumLock


На честь коментаря mbomb007 , ось код морзе в 239 байтах :

s:=000090901009011091100110090111109111901090190110901109091000091001101909101191000911190190109100001090191010919111901091011
Loop,123{
StringMid,c,s,A_Index,1
IfEqual,c,9
{
Sleep,2000
Continue
}
Send,{NumLock}
Sleep,%c%500
Send,{NumLock}
Sleep,500
}

Ось перші 30 секунд цього повідомлення:

MorseCodeBlinking


3
А як send,{vk14}натомість поголити 3 байти? Бонус: ви будете моргати CapsLock.
Дейн

35

GFA-Basic 3,51 (Atari ST),  61 56 43  35 байт

Цей код змусить світлодіод дискети назавжди блимати необхідною швидкістю ( PAUSE 25= пауза на 25/50 секунди).

Можливо, це могло б бути коротшим у монтажі, але я не маю відповідних інструментів під рукою. Це розмір списку GFA-Basic, який одного разу зберігається у форматі .LST та редагується вручну, щоб видалити марну пробіл, перейменувати інструкції на більш короткі рядки та замінити CR+LFїх простими CR. Зауважте, що фінал CRнеобхідний.

DO
i=i XOR2
SP &HFF8802,i
PA 25
LO

Автоматично розшириться до:

DO
  i=i XOR 2
  SPOKE &HFF8802,i
  PAUSE 25
LOOP

SPOKEє наддувом , POKEякий першим ставить 68000 в супервізора режимі, так що це дозволило отримати доступ до обмежених областей пам'яті , (тут: регістр записи адреса soundchip YM2149, який також несе відповідальність за який - або інший I / O).

І так: світлодіод фізично розташований на клавіатурі ... я думаю.

Світлодіодний дисплей ST

Зараз у мене немає доступу до справжнього ІП, тому це просто макет.


7
Дисковод! Оце Так!
Девід Конрад

12
Мальованого червоного кола відсутнє ...
Хаген фон Ейтцен

@HagenvonEitzen Сподіваємось, червоне коло вже не потрібно. :-)
Арнальд

23

риба + ckb , 56 54 байт

while cd;echo rgb (random)|tee /d*/*/*/c*;sleep .5;end

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

І так, ця кулька оболонки потенційно небезпечна. Працює на моїй машині ™

Бонусний сценарій, 8 місяців потому: Це пройде через усі кольори. Не гольф.

#!/usr/bin/fish
while true
        echo rgb (printf '%06x' (random 0 16777215)) | tee /dev/input/ckb*/cmd > /dev/null
        sleep 0.5
end

13
Яка це клавіатура? lol
Мак Кернель

1
@McKernel цікаво, що це за клавіатура
CraigR8806

3
K70 RGB до призначених для користувача ковпачків - unascribed.com/f/67209fe8_keyboard_design.svg
Уна

6
Бонусні бали за перехід вище і далі, коли вся клавіатура моргає.
Маст

tee /d*/*/*/c*? Бонусні бали за те, що в майбутньому можна цегелювати якийсь поганий дерновий комп’ютер, коли це неминуче перетвориться на щось важливе. (Змінні EFI кому-небудь? Можливо, буде щось подібне /dev/efi/vars/cpu_type)
immibis

21

Bash + amixer, 45 байт

a() { amixer set Master toggle
}
a;sleep .5;a

Блимає світло відключення звуку на моїй клавіатурі.


17
a()(amixer set Master toggle;sleep .5;a)або amixer set Master toggle;sleep .5;$0як повноцінна програма трохи коротша.
Денніс

19

C (Windows), 79 байт

#include<windows.h>
k(n){keybd_event(20,69,n,0);}f(){k(1);k(3);Sleep(500);f();}

Пояснення

keybd_eventце (застаріла) функція API API для надсилання події клавіатури (клавіатури або клавіші). 20це код для ключа Caps Lock, 69це код сканування апаратного забезпечення (я не маю поняття, що це означає), і 1означає клавіш і 3означає клавіш. Симуляція натискання клавіші моделюється шляхом надсилання події клавіші, одразу після якої відбувається подія клавіатури. Одне натискання клавіш надсилається, щоб увімкнути функцію Caps Lock, потім програма спить протягом 500 мілісекунд, а потім ще одне натискання клавіші відправляється для відключення функції Caps Lock.

Завдяки Steadybox за купу збережених байтів


1
З огляду на це C, ви не можете декларувати int keybd_event();?
Ніл

@Neil Було б void keybd_event();, і мені також потрібно void Sleep();з windows.h. Ці дві декларації разом більше, ніж включають.
Mego

1
79 байт:#include<windows.h> k(n){keybd_event(20,69,n,0);}f(){k(1);k(3);Sleep(500);f();}
Steadybox

2
Звичайно, але для примітивних типів C не дбає про невідповідність, якщо ви ніколи не використовуєте результат.
Ніл

6
Коди сканування - це те, що клавіатура надсилає по дроту на найнижчому рівні. Їх значення базуються на положеннях у стандартному макеті, тому що вони дозволяють зробити клавіатуру якомога тупішою і без необхідності підключати кожну клавішу (обмеження цієї конструкції є частиною того, чому більш дешеві клавіатури можуть повернути лише кілька одночасних натискань клавіш - Базовий інтерфейс USB-клавіатури тоді виправдав обмеження на переважну більшість клавіатур близько 20 років тому, спроектувавши мінімум std) ціною завантаження кроку перекладу на хост-комп'ютер. en.wikipedia.org/wiki/Scancode
Dan Neely

16

MATLAB, 146 136 70

Дякуємо @Poke за видалення 66 байт!

r=java.awt.Robot;while 1
r.keyPress(20)
r.keyRelease(20)
pause(.5);end

Для цього використовується можливість Matlab викликати Java-класи. Індикатор Num Lock блимає в циклі шляхом програмного натискання та відпускання Num Lock.

Відео, або цього не сталося .


9
Можна використовувати 144замість java.awt.event.KeyEvent.VK_NUM_LOCK? CAPS_LOCK буде20
Poke

2
@ Poke Так! Там йде 66 байт !!
Луїс Мендо

7
Смішно, що це коротше, ніж відповідь на java
Матсман

15

машинний код x86 для ПК (наприклад, MS-DOS COM-файл), 27 байт

Цей машинний код (відображається тут із відображенням Unicode у звичайному CP437 PC BIOS) назавжди блимає індикатором CAPS LOCK на ПК:

j@▼î▐j`Z░φεê╪εÇ≤♦╞♦◙Ç<☺t∩δ∙

Код зроблений таким чином, що він не містить байтів NULL і тому може бути набраний за допомогою клавіатури (використовуючи трюк Alt + XXX для розширених символів), щоб створити файл COM (наприклад, використовуючи COPY CON blink.comкоманду під MS-DOS, в цьому випадку вихідний файл повинен містити помилковий 28- й байт ^Z(символ (EOF), необхідний для припинення операції копіювання).

Ефект досягається шляхом прямого надсилання команд на контролер клавіатури ПК (порт 60 год) для встановлення стану світлодіодів (як побічний ефект, він може встановити світлодіодні індикатори Num Lock і Scroll Lock у випадковий не миготливий стан). Час, щоб мінімізувати кількість вказівок, досягається за допомогою таймера зворотного відліку, який підтримує BIOS за адресою 0040:0040(він зменшується кожні 54,925 мс, за 9 циклів миготливий цикл становить 494,3 мс, що в межах допустимого поля) - цей лічильник зазвичай використовується BIOS для зупинки двигуна дискети; оскільки дискета не використовується програмою, і код передбачається, що він працює в середовищі з однією задачею (наприклад, DOS), грати з дискетом таймера двигуна не є проблемою.

Код працює нормально під MS-DOS (спробував VirtualBox, він також повинен працювати добре на реальному апаратному забезпеченні, хоча у мене ще не було часу зробити завантажувальну MS-DOS USB-паличку для тестування). Оскільки він не покладається на жодні функції ОС, він може працювати навіть без операційної системи (наприклад, розміщуючи його в завантажувальному секторі диска). Для роботи потрібен щонайменше процесор 80186 через інструкції "негайного натискання", що використовуються для скорочення коду деяких байт.

Вихідний код складання:

  PUSH 0x40               ; pushes 0x0040 (BIOS data segment) on the stack
  POP DS                  ; pops it into DS segment selector
  MOV SI, DS              ; copies DS to SI (timer counter is nicely placed at 40:40)
  PUSH 0x60               ; pushes 0x0060 (kbd controller port) on the stack
  POP DX                  ; pops it to DX
loop:
  MOV AL, 0xED            ; 8042 keyboard controller 'set mode indicators' command
  OUT DX, AL              ; outputs the command to the keyboard contr oller
  MOV AL, BL              ; copy BL register to AL
  OUT DX, AL              ; outputs LED state to keyboard controller
  XOR BL, 4               ; toggles bit 2 (CAPS LOCK) for next iteration
  MOV BYTE PTR[SI], 0x0A  ; sets floppy motor countdown timer to 10
wait:
  CMP BYTE PTR[SI], 0x01  ; checks if timer reached 1
  JE loop                 ; if yes, time for next iteration
  JMP wait                ; if not, checks again

Шестнадцятковий дамп зібраного коду:

6A 40 1F 8C DE 6A 60 5A B0 ED EE 88 D8 EE 80 F3 04 C6 04 0A 80 3C 01 74 EF EB F9

Ось результат, що працює під MS-DOS у VirtualBox (не працює з DosBox, імовірно, тому що контролер клавіатури не повністю імітується):

Миготіння CAPS LOCK

(вибачте за хитке відео).


Приклад фактичного використання copy con program.exe: youtube.com/watch?v=iefuJ_jZAiQ
Джеррі Єремія

13

SmileBASIC, 36 23 байти

XON MIC
WAIT 30XOFF MIC

Блимає індикатор стану мікрофона. (відео незабаром)


12

Python2 - 108 байт

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

import fcntl,os,time;exec"fcntl.ioctl(os.open('/dev/console',os.O_NOCTTY),19250,%d);time.sleep(.5);"*2%(4,0)

Схоже, я отримав помилку:Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<string>", line 1, in <module> IOError: [Errno 25] Inappropriate ioctl for device
haykam

@haykam ти в Windows?
Мальтісен

1
Ні, я на macOS Sierra Version 10.12.1 (16B2555).
haykam

8

оболонка + numlockx, 40 35 байт

[Збережено 5 байт завдяки Райану.]

Постійно блимає світло NumLock на unixish системах.

numlockx toggle;sleep .5;exec sh $0

Одне моргання, 33 байти

numlockx on;sleep .5;numlockx off

1
Ви можете використовувати exec sh $0замість того, whileщоб зберегти 5 байт, або sh $0якщо створення процесів назавжди вважається нормальним.
Ри-

2
watch -n0.5 numlockx toggle за 27 байт.
Техас Кале

Для іншого смаку вищезазначеного, на інтерактивних оболонках ви можете ввести: numlockx toggle;sleep .5;!#(27 байт) за один мигті. !#це подія розширення історії, замінене всім набраним дотепер у командному рядку.
init_js

в одній команді блимання onможна пропустити. це за замовчуванням.
init_js

З завданнями, без хитрощів: f=numlockx;$f;sleep .5;$f off(29). І (нижча) циклічна версія з використанням рекурсії: g(){ f=numlockx;$f toggle;sleep .5;g;};g(40).
init_js

8

PowerShell , 71 байт

for(){(New-Object -c WScript.Shell).SendKeys('{NUMLOCK}');sleep -m 500}

Примітки

  • Блимає назавжди
  • Використовує NUM LOCKдля збереження байт.

Msgstr "Якщо у вашій мові відсутня команда сну другого режиму сну ..." - не здається, що вона відсутня в PowerShell.
Дейн

@Dane Я попросив у плаката роз'яснень. Якщо вибір на прийняття штрафу не дозволений, я його скасую.
британіст

@Dane відкотився.
британіст

Чому сон .5 тут не працює? Я спробував це, і, здається, йде як 5 мс, але я за замовчуванням подумав, що це (-ів), так що це буде 0,5 с?
Джейк Гаррі

1
@JakeHarry: -SecondsПараметр є int, тому 0.5буде перетворений в int, що призводить до 0(округлення до парного є режимом округлення за замовчуванням). Таким чином, ви зовсім не спите (це призводить до затримки близько 1000 кліщів, тобто 10 мкс). Досить основні правила перетворення та прив’язки параметрів у PowerShell.
Джої

7

VBS, 75 байт

do
wscript.sleep 500
Createobject("wscript.shell").sendkeys"{numlock}"
loop

Неодноразово блимає клавішу Num Lock, оскільки numlockна 1 байт коротше, ніж capslock.


7

C #, 215 202 198 195 185 байт

Не усвідомлюючи, що я зробив "той самий" код, що і ця відповідь від @Mego , перевірте це.

[System.Runtime.InteropServices.DllImport("user32")]static extern void keybd_event(int v,int s,int f,int e);n=>{for(n=0;;System.Threading.Thread.Sleep(125))keybd_event(20,69,n++&2,0);};

Збережено 13 байт завдяки @Metoniem
Збережено 10 байт завдяки @VisualMelon

Ось повна відформатована версія, яка показує, що вона працює:

class P
{
    [System.Runtime.InteropServices.DllImport("user32")]
    static extern void keybd_event(int v, int s, int f, int e);

    static void Main()
    {
        System.Action<int> a = n =>
        {
            for (n = 0; ; System.Threading.Thread.Sleep(125))
                keybd_event(20, 69, n++ & 2, 0);
        };

        a(0);
    }
}

Для бонусної забави перейдіть n++ & 2на n+=2 & 2та переглядайте клавіші блокування num та caps, що чергуються, мигаючи і вимикаючи. Я поняття не маю, чому це відбувається, тому що це не повинно, але це виглядає "круто".


Зачекайте, ви, using System;але наскільки я можу сказати, ви насправді нічого не використовуєте безпосередньо з простору імен системи? Я думаю, ви можете це зняти.
Metoniem

@Metoniem Добре знайдіть підпис keybd_eventметоду насправді void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);. Я повідомляю, що можу видалити їх UIntPtrпісля публікації та мати їх як int's' та просто забув видалити використання.
TheLethalCoder

1
А-а, я бачу, ха-ха, такі речі трапляються! Гарна відповідь людина :)
Metoniem

Я думаю, ви дійсно повинні назвати та ввести дві "функції": ви посилаєтесь kв одній, але це чітко не визначено. Не перевірено, але я думаю, вам буде краще мати один дзвінок на keybd_event у необмеженому для циклу, я думаю: for(int i=0;;...Sleep(250))keybd_event(i++&2)або щось.
VisualMelon

@VisualMelon Спасибі, я оновив код, довелося змінити сон, щоб отримати правильний час, хоча :)
TheLethalCoder

6

Java 7, 121 118 113 байт

void a()throws Exception{java.awt.Robot r=new java.awt.Robot();r.keyPress(20);r.delay(500);r.keyRelease(20);a();}

Одне натискання та звільнення просто викликає стан; це не моргає. Таким чином, ми можемо також це зробити, і, схоже, рекурсія є найдешевшим способом цього зробити.


1
Шкода, що у мене немає інтерпретатора QBasic! Тому що це робиться за допомогою інструкції Poke !
сергіол

Чи оптимізується це зворотній дзвінок або це врешті перевищить ліміт стека викликів?
Кіос

@Cyoce Я не думаю, що у Java є оптимізація хвостових викликів до Java 9, тому це врешті-решт досягає межі глибини рекурсії, але це нормально, тому що мені потрібно було лише блимати світло один раз:]
Poke

1
Я маю на увазі, що ви можете помістити весь код у лямбда, який втрачає накладні функції оголошення. Начебто подібного: ()->for(;;){java.awt.Robot r=new java.awt.Robot();r.keyPress(20);r.delay(500);r.keyRelease(20);}що дозволяє заощадити 18 байт завдяки 4-символьній лямбда-декларації.
Tamoghna Chowdhury

1
Ще одна причина, що я не повертаюся назад! ;) По суті, просто змініть відповідь на Java 8 і перейдіть до двозначних балів. Встановіть його, якщо у вас його вже немає для тестування.
Tamoghna Chowdhury

5

JavaScript, 82 байти

Кредит фактично переходить на @FinW , я просто змінив стару функцію на нову функцію стрілки ES6, щоб зберегти кілька байт. І тому, що у мене недостатньо балів для коментарів, я написав нову відповідь.

Редагувати - видалені дужки, щоб зберегти ще 2 байти.

o=new ActiveXObject("WScript.Shell");setInterval(()=>o.SendKeys("{NUMLOCK}"),500);

Його код виглядав приблизно так

o=new ActiveXObject("WScript.Shell");setInterval(function(){o.SendKeys("{NUMLOCK}")},500);

1
Для функції стрілки вам не потрібні круглі дужки.
fəˈnɛtɪk

Повністю забув про це, дякую.
лінійка23

Я мав на увазі круглі дужки, які залишилися, коли ви видалили функцію ()
fəˈnɛtɪk

О, але ви не можете цього зробити, це не спрацює. Але ви можете зняти дужки, оскільки вони не потрібні в однорядкових висловлюваннях (чомусь ваш коментар нагадав мені про них, навіть якщо ви мали на увазі щось інше)
ruler23

Зберегти байт або замінюючи ()іншим, один символ, наприклад, _або зробивши oпараметр із значенням за замовчуванням, наприклад , так: (o=new ActiveXObject("WScript.Shell"))=>.
Кудлатий

4

Scala, 84 83 78 байт

Редагувати: збережено 1 байт завдяки @TheLethalCoder,

Він запропонував використовувати 1>0замість true.

Редагувати 2: збережено 5 байт завдяки @ Corvus_192,

Він запропонував використовувати позначення інфіксації та пропустити круглі дужки після конструктора

while(1>0){val r=new java.awt.Robot;r keyPress 20;r keyRelease 20;r delay 500}

Безголовки:

while(1>0) {
    val r=new java.awt.Robot()
    r.keyPress(20)
    r.keyRelease(20)
    r.delay(500)
}

Стандартний порт Scala на відповідь Java @Poke . Введіть його прямо у підказку інтерпретатора Scala.

Відео його блимає як мій світлодіод Caps Lock, так і екранний екран!

Блимає світлодіодний екран і екранний екран


Ви можете зробити for(;;)або while(1>0)чи while(1)в Scala?
TheLethalCoder

Можливе друге. 1-байт збереження, яке раніше не траплялося мені. Дякую!
Tamoghna Chowdhury

Ви можете використовувати позначення інфіксації: r keyPress 20байт коротший за r.keyPress(20). Те саме стосується і інших викликів методу, заощаджуючи всього 3 байти.
corvus_192

Також скиньте дужки з виклику конструктора, щоб зберегти ще 2 байти.
corvus_192

4

Термінал Linux, 8 + 11 = 19 байт

демонстрація

Файл f=1B 5B 33 71 1B 5B 30 71

native@shell:~$ pv f -q -L8

ВАТ?

Відповідно до ECMA-48 , 1Bзапускається термінальна керуюча послідовність управління.

Caps включено = 1B 5B 33 71, потім вимкнено =1B 5B 30 71

pv перегляд ходу

f файл

-q спокійно

-L8 8 байт / с = 0,5 секунди затримки

Використання

Підготуватися

#Create file
echo "1B 5B 33 71 1B 5B 30 71"|xxd -r -p > f 

#Install progress view utility
sudo apt install pv

Ctrl+ Alt+ F6перехід на рідну консоль

бігати pv f -q -L8

Ctrl+ Alt+ F7перемикання назад


3

Bash + Xdotool, 36 байт

for((;;)){ xdotool key 66;sleep .5;}

Просто виконайте це в оболонці bash. Це потрібно знаходитись у графічному середовищі. Звідси нескінченна петля . Змінено Num_Lock на 66, щоб зберегти 6 байт, і завдяки @Michael Kjörling за 2 байти.


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

Крім того, щодо вашої первинної редакції: майте на увазі, що ви можете використовувати :псевдонім для trueбільшості систем. while :;do sth;doneробить те саме, що, while true;do sth;doneале на три байти коротше. for((;;)){ sth;}все ж коротше, хоча.
CVn

@Cyoce Де? Це не працювало для мене.
Feldspar15523

@Cyoce Я думаю, що працює лише для оголошення функцій.
Польовий

@ Feldspar15523 ой
ніколи не подумаєш

3

xdotool , 20 байт

key -delay=500 66 66

Двічі натискає клавішу 66 aka Caps Lock із затримкою в 500 мс між натисканнями клавіш.

Зауважте, що xdotool - це сценарна мова; його можна запустити з файлу, і він навіть підтримує shebangs. Оскільки його execкоманда дозволяє виконувати зовнішні програми, вона здатна до тестування додавання та первинності, тому задовольняє наше визначення мови програмування.

Тестовий запуск

$ cat blink.xdo; echo
key -delay=500 66 66
$ xdotool blink.xdo

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


3

Python, використовуючи pyautogui: 126 143 115 103 байт

Завдяки @ nedla2004 за збереження 12 байт

from pyautogui import*
import time
while 1:keyDown('capslock');time.sleep(.5);keyUp('capslock')pslock')

1
Ви можете змінити цикл while на while 1:keyDown('capslock');time.sleep(.5);keyUp('capslock'), а ви можете змінити перший рядок from pyautogui import*, а другий на import time.
nedla2004

ви можете видалити дублікат "caplock". import time;c='capslock' ...
init_js

ви також можете timeповністю видалити . from pyautogui import*; while 1:press('capslock',1,.5). ymmv. в моєму середовищі п'ятогуї впливають на тип, який я ввожу, але світло не блимає.
init_js

3

Баш, 31 байт

xset led 1;sleep .5;xset -led 1

Працює в X, без кореневого доступу! (Якщо це не працює для вас, перегляньте функцію init коду нижче, щоб переконатися, що xkbcomp налаштований правильно)

І бонусний скрипт для надсилання будь-якого коду Морзе через блокування шапок (не для гольфу):

unit=0.15
id=1
function init {
        file=/tmp/blink_tmp
        xkbcomp $DISPLAY $file
        sed -i 's/!allowExplicit/allowExplicit/' $file
        xkbcomp $file $DISPLAY &>/dev/null
        rm $file
}
if [[ -z $1 ]]; then
        echo "Usage : blink [message]"
        exit 1
fi
init
function finish {
        off
}

function on {
#su -c 'setleds -L +caps < /dev/console'
xset led $id
}
function off {
#su -c 'setleds -L -caps < /dev/console'
xset -led $id
}
function slp {
        sleep $(echo "$unit*$1" | bc)
}
function dot {
on
slp 1
off
slp 1
}
function dash {
on
slp 3
off
slp 1
}
function gap {
        slp 3
}
function morse {
        msg=$1
        for (( i=0; i<${#msg}; i++ )); do
                char=${msg:$i:1}
                if [[ $char == "-" ]]; then
                dash
                elif [[ $char == "." ]]; then
                dot
                elif [[ $char == "/" ]]; then
                gap
                fi
        done
}
while true; do
        morse $1
done

Приклад: blink "...././.-../.-../---//.--/---/.-./.-../-..///"


2

Bash + setleds , 43 байти

setleds -D +caps;sleep 0.5;setleds -D -caps

Досить просто. Використовує setledsдля перемикання світла.


2

Баш, 103 байти

cd /sys/class/leds/asus\:\:kbd_backlight;while true;do echo 3;sleep .5;echo 0;sleep .5;done>brightness

Потрібно запустити як root.

Чи працює миготливе підсвічування всієї клавіатури? (відео, яке вийде, коли я повернуся додому)


1
Does flashing the entire keyboard backlight work?Що ж, якщо ви це подумаєте, підсвічування клавіатури - це індикатор включення або вимкнення підсвітки клавіатури, і це, безумовно, "фізично розташоване на клавіатурі", так що так, я думаю, це враховується.
zeppelin

2

JavaScript, 90 байт

o=new ActiveXObject("WScript.Shell");setInterval(function(){o.SendKeys("{NUMLOCK}")},500);

Це вимагає ActiveXсенсу, що він працюватиме лише в IE (Edge, однак, не підтримує його). Вона блимає клавіше NUMLOCK, оскільки, як і в інших відповідях, вона коротша, ніж CAPSLOCK або SCROLLLOCK.

Безумовно

shell = new ActiveXObject("WScript.Shell");
setInterval(
    function(){
        shell.SendKeys("{NUMLOCK}")
    }
,500);

2

Баш, 33 байт

Це передбачає, що Num-Lock увімкнений перед його запуском. Вимкніть offі onіншим способом. Потрібен numlockxпакет очевидно;)

numlockx off;sleep .5;numlockx on

Редагувати:

Пила Алекс Хованський вже розмістив це рішення, але не позначив його Bash, і я просто шукав на сайті "Bash".


+1, вам не доведеться повторно моргати (я думаю).
NoOneIsHere

Якщо ви знаходитесь в інтерактивній оболонці, ви можете ввести командний рядок: numlockx toggle;sleep .5;!# (27 байт). !#це подія, яка розширюється на все, що було введено до цього часу в командному рядку.
init_js

2

Пакетний файл (за допомогою vbs), 74 + 2 = 76 байт

echo Createobject("wscript.shell").sendkeys"{numlock}">z.vbs&z&timeout 1&z

Частково грунтується на відповіді Трельзевіра .

.vbsавтоматично включається в PATHEXT.


1

Котлін Скрипт, 72 байти

Хоча і не найменший, все-таки це досить добре. Я люблю Котлін в перспективі для деяких речей, і це один з них (менше , ніж вал г = java.awt.Robot () , тому що ми не потрібні і р. І Вел г =. Тим НЕ менше, це більше , ніж MathLab)

java.awt.Robot().run{while(1>0){keyPress(20);keyRelease(20);delay(500)}}

Безголовки:

java.awt.Robot().run {
    while(1>0) {
        keyPress(20)
        keyRelease(20)
        delay(500)
    }
}

1

Python3, 55 49 байт

Дякую @NoOneIsHere за -4 байти!

Сюди входять пакети: pyautogui та timeмодулі
Код:

while(1):pag.press("capslock");time.sleep(0.5)  

Дякую @NoOneIsHere за -4 байти!
Ключові дії:
Caps Lock


3
Ласкаво просимо на сайт! :)
DJMcMayhem

Ви можете зберегти досить багато байтів, скориставшись while 1однотонним крапкою з крапкою з комою. ( while 1:pyautogui.press("capslock");time.sleep(.5))
NoOneIsHere

1
На жаль, це також фрагмент, але додавши import pyautoguiдо початку програми та змінивши решту, while 1:pyautogui.press("capslock");time.sleep(.5)ви можете зробити це правильною відповіддю.
caird coinheringaahing

@cairdcoinheringaahing Там теж потрібно бути import timeтам.
FlipTack

@cairdcoinheringaahing Саме для цього вам потрібен import time...
FlipTack

1

VBA, 82 байт

Анонімна функція негайного вікна VBE, яка не приймає даних і нескінченно роздратує користувача. Депеданс на сплячому режимі Windows kernel32, який оголошено нижче.

Декларація сну (Win-32)

Declare Sub Sleep Lib "kernel32" (ByVal M&)

Декларація сну (Win-64, + 8 байт)

Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal M&)

Анонімна функція прямого вікна VBE

Do:SendKeys"{CAPSLOCK}":Sleep 500:DoEvents:Loop

Трохи веселіша версія, 97 байт

Набір взаєморекурсивних підпрограм, які нескінченно дратують користувача

Sub A
Application.OnTime Now+5.8E-6,"B"
End Sub

Sub B
DoEvents
SendKeys"{CAPSLOCK}"
A
End Sub

Сумнівна версія, 66 + 2 байти

Я не впевнений, що якщо декларувати функцію з dll, вважається, що вона має вбудовану функцію, тож у випадку, якщо цього немає, то ось версія 66 + 2 байти, яка чекає 1 секунду

Do:DoEvents:Application.Wait Now+#0:0:1#:SendKeys"{CAPSLOCK}":Loop
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.