Выходные нажатия клавиш

14

На любом языке программирования создайте программу, которая принимает ввод и анимирует текст, набираемый на клавиатуре.

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

Вы должны перезаписать текущую строку текста, чтобы текст не печатался в новых строках.

Например, вход «Привет, PPCG! Goodbye Earth!» должен привести к следующей анимации (обратите внимание, что частота дискретизации gif-maker была низкой, поэтому истинный результат немного отличается):

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

Поскольку это кодовый гольф, выигрывает наименьшее количество байтов.

Олли бриттон
источник
«Вы должны перезаписать текущую строку текста, чтобы текст не печатался в новых строках». - это означает, что программа должна очистить ввод и произвести вывод на свое место? (Примечание: ваша анимация выглядит быстрее, чем указано.)
Джонатан Аллан
Можем ли мы предположить, что всегда есть вход?
Метонием
1
Предполагается, что задержка является случайной или повторяющейся схемой 0,1, 0,1, 0,5?
12Me21
2
Должна ли быть задержка перед печатью первого символа?
Kritixi Lithos
1
Это тот шаблон да @ 12Me21
Metoniem

Ответы:

8

C 108 93 89 78 73 80 байт

f(char *s){for(int i=0;s[i];fflush(0),usleep(100000*(i++%3?1:5)))putchar(s[i]);}

Безголовая версия:

 void f(char *s)
 {
  for( int i=0;s[i];)
  {
    putchar(s[i]);
    fflush(0);
    usleep(100000*(i++%3?1:5));
 }
}

@Kritixi Lithos @Metoniem Спасибо за ваш вклад! сохранил несколько байтов.

Так или иначе, только что int iдал мне ошибку сегментации при запуске, поэтому я инициализировал ее с 0.

Абель Том
источник
1
Используете ли вы мои улучшения или нет: ваши задержки должны быть наоборот. если i%3задержка должна быть 5.
Metoniem
Заменить 100000с 1e5брить 3 байта
Альберт Реншоу
@AlbertRenshaw Спасибо за совет, обновлено. Я использовал его в некоторых других моих решениях тоже не знаю, почему я забыл здесь.
Абель Том
@AbelTom Почему-то 1e5не работает на моем устройстве
Kritixi Lithos
@ KritixiLithos как получается? ты на линуксе?
Абель Том,
6

Желе , 13 байт

115D÷⁵ṁȮœS¥@"

Это монадическая ссылка / функция. Из-за неявного вывода, он не работает как полная программа.

верификация

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

115D÷⁵ṁȮœS¥@"  Monadic link. Argument: s (string)

115            Set the return value to 115.
   D           Decimal; yield [1, 1, 5].
    ÷⁵         Divide all three integers by 10.
      ṁ        Mold; repeat the items of [0.1, 0.1, 0.5] as many times as
               necessary to match the length of s.
          ¥@"  Combine the two links to the left into a dyadic chain and apply it
               to each element in s and the corr. element of the last return value.
       Ȯ         Print the left argument of the chain (a character of s) and sleep
                 as many seconds as the right argument indicates (0.1 or 0.5).
Деннис
источник
6

MATLAB, 74 байта

c=input('');p=[1,1,5]/10;for i=c;fprintf('%s',i);p=p([2,3,1]);pause(p);end

Объяснение:

Я использовал некоторое время, чтобы сделать fprintfверсию короче, чем disp()с clc. Прорыв произошел, когда я узнал / вспомнил, что pauseможет принимать вектор в качестве аргумента, и в этом случае он просто выберет первое значение. Это позволяет опустить счетчик.

c=input('');    % Take input as 'Hello'
p=[.1,.1,.5];   % The various pause times

for i=c;            % For each of the characters in the input c
  fprintf('%s',i);  % Print the character i, without any trailing newline or whitespace
                    % No need to clear the screen, it will just append the new character 
                    % after the existing ones
  pause(p);         % pause for p(1) seconds. If the input to pause is a vector, 
                    % then it will choose the first value
  p=p([2,3,1]);     % Shift the pause times
end

Самое короткое, что я использовал, dispбыло 81 байт:

c=input('');p=[1,1,5]/10;for i=1:nnz(c),clc;disp(c(1:i));pause(p(mod(i,3)+1));end
Стьюи Гриффин
источник
Вы можете сделать printfвместо fprintf? Это работает на octave-online.net (но это октава, а не Matlab)
Kritixi Lithos
4

JavaScript (ES6), 67 байт

f=(i,o,n=0)=>i[n]&&(o.data+=i[n],setTimeout(f,++n%3?100:500,i,o,n))
<form><input id=i><button onclick=f(i.value,o.firstChild)>Go!</button><pre id=o>

Нил
источник
Фрагмент не работает
Kritixi Lithos
@KritixiLithos Да, похоже, не работает на Chrome :-(
Metoniem
работает в Firefox Tho
Конор О'Брайен
2
Это работает для меня в Chrome, но консоль говоритBlocked form submission to '' because the form's frame is sandboxed and the 'allow-forms' permission is not set.
число человек
@numbermaniac Я изменил фрагмент, чтобы использовать другое событие. (Я настолько стар, что могу вспомнить, когда нажатие клавиши Enter в поле формы не вызвало следующую кнопку, а сразу пошло к
Neil
4

V , 20 19 18 байт

1 байт сохранен благодаря @DJMcMayhem

спас 1 байт, удалив òв конце

òD1gÓulD1gÓulDgÓul

Я знаю, что это ужасно негольфия, это просто то, что я uне могу использовать вложенные циклы.

объяснение

Курсор начинается в начале буфера, который является первым символом ввода.

ò                      " Start recursion
 D                     " Deletes everything from the cursor's position to the end of line
  1gÓ                  " Sleep for 100ms
     u                 " Undo (now the deletion is reverted)
      l                " Move cursor one to the right
       D1gÓul          " Do it again
             D         " Same as before but...
              gÓ       " Sleep for 500ms this time
                ul     " Then undo and move right
                       " Implicit ò

Gif в ближайшее время ...

Kritixi Lithos
источник
без счетчика по умолчанию 500 мс, так что вы можете сохранить байт там. Кроме того, помните, что вам не нужно второе ò!
Джеймс
Вместо undo ты можешь просто paste? Не уверен, что это поможет, хотя
nmjcman101
@DJMcMayhem Я не знаю, почему я пропустил 500 по умолчанию, спасибо! Но мне нужно второе, òпотому что в противном случае программа завершается рано из-за неявного перехода на новую строку в конце, вызывающего ошибку прерывания.
Kritixi Lithos
@ nmjcman101 Я также думал об использовании paste, но, увы, он перемещает курсор в конец строки, и чтобы вернуться назад, мне нужно что-то подобное, ``что только увеличит мой счет еще больше
Kritixi Lithos
4

MATL , 16 байт

"@&htDTT5hX@)&Xx

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

объяснение

"        % Implicitly input string. For each char of it
  @      %   Push current char
  &h     %   Concatenate everything so far into a string
  tD     %   Duplicate and display
  TT5h   %   Push array [1 1 5]
  X@)    %   Get the k-th element modularly, where k is current iteration.
         %   So this gives 1, 1, 5 cyclically
  &Xx    %   Pause for that many tenths of a second and clear screen
         % Implicit end. Implicitly display the final string, again (screen
         % was deleted at the end of the last iteration)
Луис Мендо
источник
4

Noodel , 18 байт

ʋ115ṡḶƙÞṡạḌ100.ṡ€ß

Попытайся:)


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

                   # Input is automatically pushed to the stack.
ʋ                  # Vectorize the string into an array of characters.
 115               # Push on the string literal "115" to be used to create the delays.
    ṡ              # Swap the two items on the stack.

     ḶƙÞṡạḌ100.ṡ€  # The main loop for the animation.
     Ḷ             # Loops the following code based off of the length of the string.
      ƙ            # Push on the current iteration's element of the character array (essentially a foreach).
       Þ           # Pop off of the stack and push to the screen.
        ṡ          # Swap the string "115" and he array of characters (this is done because need array of characters on the top for the loop to know how many times to loop)
         ạ         # Grab the next character in the string "115" (essentially a natural animation cmd that every time called on the same object will access the next item looping)
                   # Also, turns the string into an array of characters.
          Ḍ100.    # Pop the character off and convert to a number then multiply by 100 to get the correct delay. Then delay for that many ms.
               ṡ   # Swap the items again to compensate for the one earlier.
                €  # The end of the loop.

                 ß # Clears the screen such that when implicit popping of the stack occurs it will display the correct output.

19-байтовый фрагмент кода, который зацикливается бесконечно.

<div id="noodel" cols="30" rows="2" code="ʋ115ṡḷḶƙÞṡạḌ100.ṡ€ß" input='"Hello, PPCG! Goodbye Earth!"'/>
<script src="https://tkellehe.github.io/noodel/release/noodel-2.5.js"></script>
<script src="https://tkellehe.github.io/noodel/ppcg.min.js"></script>

tkellehe
источник
1
По какой-то причине задержка кажется выключенной. Задержка составляет 100 мс, 100 мс, 500 мс. Кажется, у вас все время 100 мс.
Исмаэль Мигель
@IsmaelMiguel Хороший глаз. После просмотра источника вместо умножения появляется дополнение. Я мог бы оставить это так, хотя в случае, если мне это нужно, потому что я мог видеть, где это может быть полезно. Большое спасибо за это!
17
Пожалуйста. И мне жаль, что ваш счетчик байтов увеличился.
Исмаэль Мигель
@IsmaelMiguel, это нормально, потому что когда я делаю следующую версию Noodel, я могу сделать 11-байтовое решение (из-за основ, которые мне нужно добавить). Это, очевидно, будет неконкурентоспособным, но это новый язык, и ему предстоит пройти долгий путь, прежде чем он станет таким же хорошим, как некоторые из лучших языков для игры в гольф :)
tkellehe
3

APL, 23 байта

⊢{⍞←⍺⊣⎕DL⍵÷10}¨1 1 5⍴⍨⍴

Объяснение:

               1 1 5⍴⍨⍴  ⍝ repeat the values [1,1,5] to match the input length
⊢                        ⍝ the input itself
 {           }¨          ⍝ pairwise map
      ⎕DL⍵÷10            ⍝ wait ⍵÷10 seconds, where ⍵ is the number
     ⊣                   ⍝ ignore that value, and
  ⍞←⍺                    ⍝ output the character   
Мэринус
источник
3

C #, 131 байт

Не так много, чтобы объяснить. Он просто принимает строку (обернутую в "") в качестве аргумента и печатает каждый символ, используя правильный шаблон задержки. После анимации он завершается с OutOfRangeExceptionциклом, потому что цикл не останавливается после зацикливания всех символов. Поскольку это бесконечный цикл, это также означает, что я могу использовать int Mainвместо void Main;-)

Golfed

class C{static int Main(string[]a){for(int i=0;){System.Console.Write(a[0][i]);System.Threading.Thread.Sleep(i++%3<1?500:100);}}}

Ungolfed

class C
{
    static int Main(string[] a)
    {
        for (int i = 0; ;)
        {
            System.Console.Write(a[0][i]);
            System.Threading.Thread.Sleep(i++ % 3 < 1 ? 500 : 100);
        }
    }
}

Правки

  • Сохраняется 1 байт, перемещаясь приращением iвнутри Sleep()метода, а не в forцикле. (Спасибо Малиафо )
Metoniem
источник
1
Я не программист на C #, но разве вы не можете сделать что-то вроде Sleep(i++ [...])сохранения дополнительного байта в цикле for?
Малиафо
@Maliafo Вы можете быть правы! Я запустил его, чтобы убедиться, что он по-прежнему работает правильно, а затем обновлю свой пост. Благодарность!
Метония
2

SmileBASIC, 61 байт

LINPUT S$FOR I=0TO LEN(S$)-1?S$[I];
WAIT 6+24*(I MOD 3>1)NEXT

Я думаю, что расчет задержки может быть намного короче.

12Me21
источник
2

Clojure, 81 байт

#(doseq[[c d](map vector %(cycle[100 100 500]))](Thread/sleep d)(print c)(flush))

Зацикливает входную строку в архиве с бесконечным списком [100 100 500].

(defn typer [input]
  ; (map vector... is generally how you zip lists in Clojure 
  (doseq [[chr delay] (map vector input (cycle [100 100 500]))]
    (Thread/sleep delay)
    (print chr) (flush)))
Carcigenicate
источник
2

Bash (+ утилиты), 32 байта

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

Golfed

sed 's/.../&\a\a\a\a/g'|pv -qL10

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

enter image description here

дирижабль
источник
1

Powershell, 66 65 63 байт

[char[]]$args|%{sleep -m((1,1,5)[++$i%3]*100);Write-Host $_ -N}

enter image description here

-1 убрал ненужный пробел после -m

-2 благодаря AdmBorkBork - используется 1,1,5и *конечный результат 100вместо использования100,100,500

принимает $argsмассив символов, циклически переходит Write-Hostв -Nспящий режим, как указано, с аргументом oNewline, используемым для записи символов в одной строке.

Улучшения?

  • используйте [0..99]вместо того, [char[]]чтобы сохранить 1 байт, но не будете работать со строками более 100 символов.
  • использовать 100,500и [(++$i%3)-gt1]но сделать его короче как - то.
  • объединить его в одну строку и очистить между выходами, устраняя длинные Write-Host

не могу найти способ заставить последние два работать, и первый не действителен ни по какому конкретному правилу.

colsw
источник
1
Разбейте сотню, чтобы сэкономить два байта -sleep -m((1,1,5)[++$i%3]*100)
AdmBorkBork
@ AdmBorkBork умный - спасибо!
Colsw
0

Perl, 63 байта

foreach(split//,pop){$|=++$i;print;select('','','',$i%3?.1:.5)}
tourdetour
источник
0

Python 3, 88 байт

import time;s=''
for x in input():s+=x;time.sleep(.1+.4*(len(s)%3==0));print('\n'*25+s)
Тристан Бэтчлер
источник
0

Ребол, 65 байт

s: input t:[.1 .1 .5]forall s[prin s/1 wait last append t take t]

Ungolfed:

s: input
t: [.1 .1 .5]

forall s [
    prin s/1
    wait last append t take t
]
draegtun
источник
0

Bash + coreutils, 57 байт

for((;k<${#1};k++)){ echo -n ${1:k:1};sleep .$[2&k%3|1];}
Митчелл Спектор
источник
0

Java 7, 151 149 байт

class M{public static void main(String[]a)throws Exception{int n=0;for(String c:a[0].split("")){System.out.print(c);Thread.sleep(n++%3>0?100:500);}}}

-2 байта спасибо @KritixiLithos за то, что я всегда забываю ..

Объяснение:

class M{
  public static void main(String[] a) throws Exception{ // throws Exception is required due to the Thread.sleep
    int n = 0;                                          // Initialize counter (and set to 0)
    for(String c : a[0].split("")){                     // Loop over the characters of the input
      System.out.print(c);                              // Print the character
      Thread.sleep(n++ % 3 > 0 ?                        // if (n modulo 3 != 0)
                                 100                    //   Use 100 ms
                               :                        // else (n modulo 3 == 0):
                                 500);                  //   Use 500 ms
    }
  }
}

Использование:

java -jar M.jar "Hello, PPCG! Goodbye Earth!"
Кевин Круйссен
источник
1
Я не проверял это, но вы можете сделать что-то вроде a[0].split("")этого?
Kritixi Lithos
@KritixiLithos Argg .. Я всегда забываю это. Благодарю.
Кевин Круйссен
Говоря о том, что я должен также использовать splitв своем ответе Обработка ...
Kritixi Lithos
0

Обработка, 133 131 байт

int i;void setup(){for(String c:String.join("",args).split(""))p{try{Thread.sleep(i++%3<1?500:100);}catch(Exception e){}print(c);}}

Я пытался сделать args[0]и завернуть аргумент в""Вместо этого , но по какой-то причине он не работает.

В любом случае ... это первый раз, когда я написал программу обработки, которая принимает аргументы. В отличие от Java, вам не нужно объявлять аргументы с помощью String[]args, но переменная argsавтоматически инициализируется аргументами.

Поместите его в файл с именем sketch_name.pdeв папке с именем sketch_name(да, то же имя для папки и эскиза). Назовите это как:

processing-java --sketch=/full/path/to/sketch/folder --run input text here

cheese

Kritixi Lithos
источник