Blink the CAPS LOCK

107

Большинство компьютерных клавиатур имеют небольшой встроенный светодиодный индикатор, показывающий текущий режим ввода, который управляется кнопкой CAPS LOCK.

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

Ваша задача - мигнуть:

  • Включи его;
  • Подождите 0,5 (+/- 0,1) секунды;
  • Выключи это снова.

Видеозапись мигания светодиода высоко ценится!

правила

  • Вы можете мигать другим светодиодом (например, Scroll Lock, Num Lock, статус Wi-Fi и т. Д.), Если хотите, но он должен быть физически расположен на вашей клавиатуре;

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

  • Ваша программа должна мигать хотя бы один раз, то, что произойдет после этого, зависит от вас, то есть она может продолжать мигать (в этом случае вы должны дождаться той же задержки, прежде чем снова включить ее), или остановиться и т. Д .;

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

  • Это , выигрывает самый короткий ответ в байтах.

Leaderboard

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 намеренно вылетает ядро. В Linux, эквивалентном BSOD, мигает индикатор Caps Lock, на тот случай, если сбой также привел к отключению видеооборудования, и вы не увидите отчет BSOD на экране. К сожалению, насколько я могу судить, он мигает слишком быстро, чтобы быть подходящим ответом. Это привело бы к (несколько злонамеренному) 14-байтовому решению, если бы оно было разрешено.
57
Теперь поморгайте азбукой Морзе: «Помогите, я в ловушке на фабрике клавиатур!»
mbomb007
12
@ ais523 мой ноутбук сделает это, если я встряхну его (0 байт). Слишком быстро ...
Тим
18
Клавиша с заглушкой на C64 - это механический переключатель. Мигание, которое может быть немного хитрым ...
Марк
8
Теперь мне интересно, мигает ли индикатор низкого заряда батареи на моей беспроводной клавиатуре с правильной частотой. Если так: ноль байтов.
Роджер Липскомб

Ответы:

123

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

Это действительно глупо, но пока этот сайт принимает идею, что переводчик определяет язык , я мог бы также злоупотреблять этим правилом. Этот код работает только в Win32 Befunge-93 Kevin Vigor, версия 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 по умолчанию.

Сам код, по существу , копия Mego «s 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
дирижабль
9
Это теперь мой любимый ответ на этом сайте
Cruncher
2
Отличная реализация!
Даниэль
3
@JamesHolderness Так? Это отличный ответ, даже если он длинный.
NoOneIsHere
72

AutoHotkey, 29 26 байт

Спасибо @Dane за сохранение 3 байта

Loop{
Send,{VK14}
Sleep,500
}

Я изначально выбрал, NumLockпотому что он на один символ короче CapsLock. GIF ниже отражает это условие. Это тот же эффект, что и измененный код выше. Я мог бы пойти VK90выше, чтобы сделать GIF по-прежнему точным, но лучше было согласиться с исходной задачей.

BlinkingNumLock


В честь комментария 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 в режим супервизора , чтобы ему был разрешен доступ к областям с ограниченной памятью (здесь: адрес записи регистра звукового чипа YM2149, который также отвечает за некоторые другие операции ввода-вывода).

И да: светодиод физически расположен на клавиатуре ... Полагаю.

ST Floppy LED

У меня сейчас нет доступа к настоящему ST, так что это всего лишь макет.

Arnauld
источник
7
Дисковод! Вау!
Дэвид Конрад
12
Отсутствует нарисованный вручную красный круг ...
Хаген фон
@HagenvonEitzen Надеюсь, красный круг больше не нужен. :-)
Арно
23

рыба + скб , 56 54 байта

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

Мигает вся моя клавиатура в случайных цветах, хотя, поскольку длина не 6 шестнадцатеричных цифр, она немного ограничена.

И да, эта оболочка потенциально опасна. Работает на моей машине ™

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

#!/usr/bin/fish
while true
        echo rgb (printf '%06x' (random 0 16777215)) | tee /dev/input/ckb*/cmd > /dev/null
        sleep 0.5
end
Una
источник
13
Какая клавиатура это? LOL
Mc Kernel
1
@McKernel говорит о том, что это за клавиатура
CraigR8806
3
K70 RGB с пользовательскими клавишами
Уна,
6
Бонусные баллы за то, что вы делаете все возможное, заставляя всю клавиатуру мигать.
Mast
tee /d*/*/*/c*? Бонусные баллы за то, что в будущем они могут заглушить компьютер какого-то бедняги, когда это неизбежно расширится до чего-то важного. (EFI переменные кто-нибудь? Может быть, будет что-то вроде /dev/efi/vars/cpu_type)
user253751
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является (устаревшей) функцией Windows API для отправки события клавиатуры (keyup или keydown). 20это код для ключа Caps Lock, 69это код сканирования оборудования (я понятия не имею, что это значит), и 1означает keydown и 3означает keyup. Нажатие клавиши имитируется путем отправки события нажатия клавиши, за которым сразу же следует событие нажатия клавиши. Одно нажатие клавиши отправляется для включения Caps Lock, затем программа спит в течение 500 миллисекунд, а затем отправляется другое нажатие, чтобы снова отключить Caps Lock.

Спасибо Steadybox за сохраненную кучу байтов

Мего
источник
1
Учитывая, что это C, вы не можете объявить int keybd_event();?
Нил
@Neil Это будет void keybd_event();, и мне тоже нужно void Sleep();от windows.h. Эти две декларации вместе длиннее, чем include.
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 лет назад, разработав на минимальном уровне) за счет разгрузки шага перевода на хост-компьютер. en.wikipedia.org/wiki/Scancode
Дэн Нили,
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
@ Покей Да! Там идут 66 байт !!
Луис Мендо
7
Забавно, что он короче java-ответа
Мацеманн
15

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

Этот машинный код (отображаемый здесь с рендерингом Unicode обычного CP437 BIOS ПК) будет постоянно мигать индикатором CAPS LOCK на ПК:

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

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

Эффект достигается путем прямой отправки команд на контроллер клавиатуры ПК (порт 60h) для установки состояния светодиодов (в качестве побочного эффекта он может установить для светодиодов 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

Мигает индикатор состояния микрофона. (скоро будет видео)

12Me21
источник
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)
Maltysen
источник
Похоже, я получил ошибку: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 ты на винде?
Maltysen
1
Нет, я на macOS Sierra Version 10.12.1 (16B2555).
haykam
8

shell + 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если создание процессов навсегда считается нормальным.
Ry-
2
watch -n0.5 numlockx toggle для 27 байтов.
Tejas Kale
Чтобы по-другому взглянуть на вышесказанное, в интерактивных оболочках вы могли бы ввести: 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чтобы сохранить байт.
briantist
источник
«Если в вашем языке отсутствует подпоследовательная команда сна ...» - не похоже, что она отсутствует в PowerShell.
датчанин
@ Дейн, я попросил у автора разъяснения. Если решение о принятии штрафа не допускается, я отменю его.
Бриантист
@ Дейн откатился назад.
бриантист
Почему спать .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.

Trelzevir
источник
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 lock и caps lock попеременно мигают и загораются. Я понятия не имею, почему это происходит, потому что это не должно, но это выглядит "круто".

TheLethalCoder
источник
Подождите, вы, using System;но насколько я могу судить, вы на самом деле ничего не используете непосредственно из пространства имен System? Я думаю, что вы можете удалить это.
Метония
@Metoniem Хорошая точка подписи для keybd_eventметода на самом деле void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);. Я освобождаю, я мог удалить UIntPtr's после публикации и иметь их как int' s и просто забыл удалить использование.
TheLethalCoder
1
Ах, я вижу, ха-ха, такие вещи случаются! Хороший ответ, человек :)
Metoniem
Я думаю, что вы действительно должны назвать и ввести две «функции»: вы ссылаетесь на kодну, но она явно не определена. Не проверено, но я думаю, что вам лучше иметь один вызов keybd_event в свободном цикле for, я должен подумать: 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 !
sergiol
Будет ли оптимизирован хвостовой вызов или он в конечном итоге превысит лимит стека вызовов?
Cyoce
@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-символьного заголовка лямбда-объявления.
Тамогна Чоудхури
1
Еще одна причина, по которой я не вернусь! ;) Если серьезно, просто измените ответ на Java 8 и перейдите к двузначным числам. Установите его, если у вас его еще нет для тестирования.
Тамогна Чоудхури
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);
ruler23
источник
1
Для функции стрелки вам не нужны скобки перед ней.
fəˈnɛtɪk
Полностью забыл об этом, спасибо.
ruler23
Я имел в виду круглые скобки, которые были оставлены после удаления функции ()
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}

Ungolfed:

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

Стандартный порт Scala для Java- ответа @Poke . Введите его прямо в командной строке интерпретатора Scala.

На видео мигает и мой индикатор Caps Lock, и мое OSD для загрузки!

Мигающий индикатор блокировки колпачков и экранное меню

Тамогна Чоудхури
источник
Вы можете сделать for(;;)или while(1>0)или while(1)в Scala?
TheLethalCoder
Второе возможно. 1-байтовое сохранение, которое раньше не приходило мне в голову. Спасибо!
Тамогна Чоудхури
Вы можете использовать инфиксную нотацию: 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

WAT?

Согласно ECMA-48 , 1Bзапускается управляющая последовательность терминала.

Caps on = 1B 5B 33 71, затем off =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 байта.

Feldspar15523
источник
Вы можете сохранить как минимум два байта, удалив ненужные пробелы. Вам не нужны пробелы перед закрывающей фигурной скобкой, и вам не нужны пробелы вокруг точек с запятой, разделяющих команды. Вы действительно нужен пробел после открывающей фигурной скобки, хотя.
CVn
Кроме того, относительно вашей первоначальной ревизии: имейте в виду, что вы можете использовать :в качестве псевдонима для trueбольшинства систем. while :;do sth;doneделает то же самое, while true;do sth;doneно на три байта короче. for((;;)){ sth;}все еще короче, хотя.
CVn
@ Кайос Где? Это не сработало для меня.
Feldspar15523
@Cyoce Я думаю, что это работает только для объявления функций.
Feldspar15523
@
Feldspar15523 К сожалению, неважно
3

xdotool , 20 байтов

key -delay=500 66 66

Дважды нажимает клавишу 66, также известную как 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.
Недла2004
Вы можете удалить дубликаты "capslock". import time;c='capslock' ...
init_js
Вы также можете удалить timeполностью. from pyautogui import*; while 1:press('capslock',1,.5), YMMV. на моем окружении pyautogui влияет на тип, который я печатаю, но свет не мигает.
init_js
3

Баш, 31 байт

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

Работает в X, без рут-доступа! (Если это не работает для вас, посмотрите функцию инициализации кода ниже, чтобы убедиться, что 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 "...././.-../.-../---//.--/---/.-./.-../-..///"

tourdetour
источник
2

Bash + setleds , 43 байта

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

Довольно просто Использует setledsдля переключения света.

Rɪᴋᴇʀ
источник
2

Баш, 103 байта

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

Должен быть запущен от имени пользователя root.

Работает ли перепрошивка всей подсветки клавиатуры? (видео, чтобы прийти, когда я вернусь домой)

Tyzoid
источник
1
Does flashing the entire keyboard backlight work?Что ж, если подумать, подсветка клавиатуры - это индикатор того, включена ли подсветка клавиатуры, и она определенно «физически расположена на клавиатуре», так что да, я думаю, она имеет значение.
Цеппелин
2

JavaScript, 90 байт

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

Это ActiveXозначает, что он будет работать только в IE ( хотя Edge его не поддерживает). Он мигает клавишей NUMLOCK, потому что, как и в других ответах, он короче, чем CAPSLOCK или SCROLLLOCK.

Ungolfed

shell = new ActiveXObject("WScript.Shell");
setInterval(
    function(){
        shell.SendKeys("{NUMLOCK}")
    }
,500);
FinW
источник
2

Баш, 33 байта

Предполагается, что Num-Lock будет включен до его запуска. Переключить offи onиначе. Требуется numlockxпакет, очевидно;)

numlockx off;sleep .5;numlockx on

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

Видел, что Алекс Ховански уже опубликовал это решение, но не пометил его Bash, и я просто искал на сайте «Bash».

DBX12
источник
+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.

no1xsyzy
источник
1

Kotlin Script, 72 байта

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

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

Ungolfed:

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 Coneheringaahing
@cairdcoinheringaahing Там также должно быть import timeтам.
FlipTack
@cairdcoinheringaahing Точно, именно поэтому вам нужно import time...
FlipTack
1

VBA, 82 байта

Anonymous VBE Immediate оконная функция, которая не требует ввода и раздражает пользователя бесконечно. Зависит от режима сна windows32, который объявлен ниже.

Декларация сна (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
Тейлор Скотт
источник