Вихідні клавіші


14

На будь-якій мові програмування створіть програму, яка приймає текст та анімує текст, який набирається на клавіатурі.

Затримка між кожним символом повинна бути різною, щоб імітувати справжнє введення тексту на клавіатурі. Затримка повинна становити 0.1, 0.1, 0.5, 0.1, 0.1, 0.5 ...секунди до моменту друку останнього символу. Кінцевий вихід повинен бути залишений на екрані.

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

Наприклад, вхід "Привіт, PPCG! До побачення Земля!" має спричинити таку анімацію (зауважте, що частота вибірки у виробника gif була низькою, тому справжній результат дещо інший):

enter image description here

Оскільки це кодовий гольф, виграє найменша кількість байтів.


"Ви повинні перезаписати поточний рядок тексту, щоб ви не могли надрукувати текст у нових рядках." - Це означає, що програма повинна очистити вхід і створити вихід на своєму місці? (Бічна примітка: ваша анімація виглядає швидше, ніж зазначено.)
Джонатан Аллан

Чи можна припустити, що завжди є вхід?
Metoniem

1
Чи затримка повинна бути випадковою чи повторюваною схемою 0,1, 0,1, 0,5?
12Me21

2
Чи має бути затримка перед друком першого символу?
користувач41805

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не працює на моєму пристрої
user41805,

@KritixiLithos howcome? ти в Linux?
Авель Том

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 (але це Octave, а не Matlab)
користувач41805

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>


Здається, що фрагмент не працює
користувач41805

@KritixiLithos Yup, схоже, не працює на Chrome :-(
Metoniem

працює в firefox tho
Conor O'Brien

2
Він працює для мене в Chrome, але на консолі написаноBlocked form submission to '' because the form's frame is sandboxed and the 'allow-forms' permission is not set.
numbermaniac

@numbermaniac Я змінив фрагмент, щоб використовувати іншу подію. (Мені вже так багато років, що я фактично пам'ятаю, коли натискання клавіші Enter у полі форми не запустило наступну кнопку, а перейшло прямо до подання форми.)
Ніл,

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 скоро ...


без підрахунку за замовчуванням до 500 мс, тому ви можете зберегти там байт. Також пам’ятайте, що другого вам не потрібно ò!
Джеймс

Замість undo ви можете просто paste? Не впевнений, чи це взагалі допомагає
nmjcman101

@DJMcMayhem Я не знаю, чому я пропустив 500 за замовчуванням, дякую! Але мені потрібен другий, òбо в іншому випадку програма припиняється достроково через неявну нову лінію в кінці, що викликає помилку зриву.
користувач41805

@ nmjcman101 Я також думав про використання paste, але, на жаль, він переміщує курсор до кінця рядка, і щоб повернутися назад, мені знадобиться щось на зразок, ``що тільки збільшить мій рахунок, далі
user41805

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

Локшина , 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>


1
Чомусь затримка здається вимкненою. Затримка - 100 мс, 100 мс, 500 мс. Ви, здається, маєте 100 мс весь час.
Ісмаїл Мігель

@IsmaelMiguel Добре око. Після перегляду джерела з’являється додавання, а не множення. Я можу тримати це таким чином, хоча у випадку, якщо мені це потрібно, бо я міг бачити, де це може бути корисно. Дякую за це!
tkellehe

Ласкаво просимо. І мені шкода, що кількість байтів збільшилась.
Ісмаїл Мігель

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

Гольф

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

Безумовно

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циклі. (Дякую Маліафо )

1
Я не програміст на C #, але чи не можете ви зробити щось на кшталт, Sleep(i++ [...])щоб зберегти зайвий байт у циклі for?
Маліафо

@Maliafo Ви можете мати рацію! Я запускаю його, щоб переконатися, що він все ще працює правильно, а потім оновлю свою посаду. Спасибі!
Metoniem

2

SmileBASIC, 61 байт

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

Я думаю, що розрахунок затримки може бути набагато коротшим.


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

2

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

Зауважте, це буде звуковим сигналом у процесі, але хто сказав, що повідомлення не можуть мати фантазійні звукові ефекти!

Гольф

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як масив char, проходить цикл сну, як зазначено, Write-Hostпри цьому -Nаргумент oNewline використовується для запису символів у той самий рядок.

Поліпшення?

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

не вдається знайти жодних останніх робіт, і перша не є дійсною жодним конкретним правилом.


1
Розбийте сотню, щоб зберегти два байти -sleep -m((1,1,5)[++$i%3]*100)
AdmBorkBork

@AdmBorkBork розумний - спасибі!
colsw



0

Ребол, 65 байт

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

Безголівки:

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

forall s [
    prin s/1
    wait last append t take t
]


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("")замість цього?
користувач41805

@KritixiLithos Argg .. Я завжди забуваю це. Спасибі.
Кевін Крейссен

Якщо говорити про це, я також повинен використовувати splitсвою відповідь на обробку ...
user41805

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]і завершити аргумент"" замість цього , але він чомусь не працює.

У будь-якому випадку ... це перший раз, коли я написав програму Processing, яка бере аргументи. На відміну від Java, вам не потрібно оголошувати аргументи за допомогою String[]args, але змінноїargs автоматично ініціалізується на аргументи.

Помістіть його у файл, який називається sketch_name.pdeпід названою папкою sketch_name(так, однакова назва папки та ескізу). Назвіть це так:

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

cheese

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.