Wyjściowe naciśnięcia klawiszy


14

W dowolnym języku programowania utwórz program, który pobiera dane i animuje tekst wpisywany na klawiaturze.

Opóźnienie między każdym znakiem powinno być różne, aby symulować prawdziwe pisanie na klawiaturze. Opóźnienie wynosi 0.1, 0.1, 0.5, 0.1, 0.1, 0.5 ...sekundy, aż do wydrukowania ostatniego znaku. Ostateczne wyjście należy pozostawić na ekranie.

Musisz zastąpić bieżący wiersz tekstu, aby tekst nie był drukowany w nowych wierszach.

Przykład: „Cześć, PPCG! Żegnaj Ziemio!” powinien dać następującą animację (zauważ, że częstotliwość próbkowania gif-maker była niska, więc prawdziwy wynik jest nieco inny):

enter image description here

Ponieważ jest to golf golfowy, wygrywa najmniejsza ilość bajtów.


„Musisz zastąpić bieżący wiersz tekstu, aby nie można było wydrukować go w nowych wierszach.” - czy to oznacza, że ​​program musi wyczyścić dane wejściowe i wygenerować dane wyjściowe na swoim miejscu? (Uwaga dodatkowa: twoja animacja wygląda szybciej niż podano.)
Jonathan Allan

Czy możemy założyć, że zawsze są dane wejściowe?
Metoniem

1
Czy opóźnienie ma być losowe, czy powtarzalny wzór 0,1, 0,1, 0,5?
12Me21

2
Czy powinno być opóźnienie przed wydrukowaniem pierwszego znaku?
user41805

1
To taki wzór tak @ 12Me21
Metoniem

Odpowiedzi:


8

C 108 93 89 78 73 80 bajtów

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

Wersja bez golfa:

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

@Kritixi Lithos @Metoniem Dziękujemy za wkład! zapisano niektóre bajty.

W jakiś sposób po prostu int idał mi błąd segmentacji podczas uruchamiania, więc zainicjowałem go wartością 0.


1
Nieważne, czy korzystasz z moich ulepszeń, czy nie: Twoje opóźnienia powinny być odwrotne. jeśli i%3opóźnienie powinno wynosić 5.
Metoniem

Wymień 100000się 1e5golić 3 bajty
Albert Renshaw

@AlbertRenshaw Dzięki za wskazówkę, zaktualizowano. Użyłem go również w niektórych innych moich rozwiązaniach, nie wiem dlaczego tutaj zapomniałem.
Abel Tom

@AbelTom Z jakiegoś powodu 1e5nie działa na moim urządzeniu
41805

@KritixiLithos howcome? jesteś na Linuksie?
Abel Tom

6

Galaretka , 13 bajtów

115D÷⁵ṁȮœS¥@"

Jest to monadyczny link / funkcja. Z powodu niejawnego wyniku nie działa on jako pełny program.

Weryfikacja

Jak to działa

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 bajty

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

Wyjaśnienie:

Kiedyś sporo czasu, aby fprintfwersja krótsza niż disp()z clc. Przełomem było, gdy odkryłem / zapamiętałem, że pausemożna przyjąć wektor jako argument, w którym to przypadku po prostu wybierze pierwszą wartość. Umożliwia to pominięcie licznika.

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

Najkrótszy użyłem dispto 81 bajtów:

c=input('');p=[1,1,5]/10;for i=1:nnz(c),clc;disp(c(1:i));pause(p(mod(i,3)+1));end

Czy możesz to zrobić printfzamiast fprintf? Działa na octave-online.net (ale to Octave, a nie Matlab)
user41805

4

JavaScript (ES6), 67 bajtów

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>


Fragment nie wydaje się działać
user41805

@KritixiLithos Tak, wydaje się, że nie działa w Chrome :-(
Metoniem

pracuje w firefox tho
Conor O'Brien

2
Działa dla mnie w Chrome, ale konsola mówiBlocked form submission to '' because the form's frame is sandboxed and the 'allow-forms' permission is not set.
numermaniac

@numbermaniac Zmieniłem fragment kodu, aby użyć innego zdarzenia. (Jestem tak stary, że pamiętam, kiedy naciśnięcie Enter w polu formularza nie uruchomiło następującego przycisku, ale poszło prosto do przesłania formularza.)
Neil

4

V , 20 19 18 bajtów

1 bajt zapisany dzięki @DJMcMayhem

zapisano 1 bajt, usuwając òna końcu

òD1gÓulD1gÓulDgÓul

Okropnie niemiłe, wiem, to po prostu tak surowe, że unie mogę używać zagnieżdżonych pętli.

Wyjaśnienie

Kursor zaczyna się na początku bufora, który jest pierwszym znakiem wejścia.

ò                      " 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 już wkrótce ...


bez liczby domyślnie 500 ms, więc możesz zapisać tam bajt. Pamiętaj też, że nie potrzebujesz drugiego ò!
James

Zamiast undo możesz po prostu paste? Nie jestem pewien, czy to w ogóle pomaga
nmjcman101,

@DJMcMayhem Nie wiem, dlaczego przegapiłem domyślną 500, dzięki! Ale potrzebuję drugiego, òponieważ w przeciwnym razie program zakończy się wcześniej z powodu niejawnej nowej linii na końcu, powodując błąd przełamania.
user41805

@ nmjcman101 Myślałem również o użyciu paste, ale niestety przesuwa on kursor na koniec linii i do powrotu potrzebowałbym czegoś takiego, ``co tylko zwiększyłoby moją liczbę bajtów
user41805

4

MATL , 16 bajtów

"@&htDTT5hX@)&Xx

Wypróbuj w MATL Online!

Wyjaśnienie

"        % 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 bajtów

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

Spróbuj:)


Jak to działa

                   # 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-bajtowy fragment kodu, który zapętla się w nieskończoność.

<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
Z jakiegoś powodu opóźnienie wydaje się wyłączone. Opóźnienie wynosi 100 ms, 100 ms, 500 ms. Wydaje się, że masz cały czas 100 ms.
Ismael Miguel

@IsmaelMiguel Dobre oko. Po przejrzeniu źródła pojawia się suma zamiast mnożenia. Mogę to jednak zachować na wypadek, gdybym tego potrzebował, ponieważ mogłem zobaczyć, gdzie może być to przydatne. Wielkie dzięki za to!
tkellehe

Nie ma za co. Przykro mi, że liczba bajtów wzrosła.
Ismael Miguel

@ IsmaelMiguel, jest w porządku, ponieważ kiedy tworzę następną wersję Noodel , mogę zrobić 11-bajtowe (ze względu na podstawy muszę dodać). Oczywiście nie będzie konkurował, ale jest to nowy język i ma przed sobą długą drogę, zanim będzie tak dobry, jak niektóre z najlepszych języków golfowych :)
tkellehe

3

APL, 23 bajty

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

Wyjaśnienie:

               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 bajtów

Nie wiele do wyjaśnienia. Po prostu pobiera ciąg znaków (zawinięty w „”) jako argument i wypisuje każdy znak przy użyciu prawidłowego wzorca opóźnienia. Po animacji kończy się z, OutOfRangeExceptionponieważ pętla nie zatrzymuje się po zapętleniu wszystkich znaków. Ponieważ jest to nieskończona pętla, oznacza to również, że mogę używaćint Main zamiast void Main;-)

Grał w golfa

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

Nie golfił

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

Edycje

  • Zapisano 1 bajt, przesuwając przyrosty iwewnątrz Sleep()metody zamiast w forpętli. (Dzięki Maliafo )

1
Nie jestem programistą C #, ale czy nie możesz zrobić czegoś takiego, Sleep(i++ [...])aby zapisać dodatkowy bajt w pętli for?
Maliafo,

@Maliafo Być może masz rację! Uruchomię go, aby upewnić się, że nadal działa poprawnie, a następnie zaktualizuję swój post. Dzięki!
Metoniem

2

SmileBASIC, 61 bajtów

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

Myślę, że obliczenie opóźnienia może być znacznie krótsze.


2

Clojure, 81 bajtów

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

Pętle nad łańcuchem wejściowym spakowane nieskończoną listą [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 (+ narzędzia), 32 bajty

Pamiętaj, że w trakcie procesu pojawi się sygnał dźwiękowy, ale kto powiedział, że zgłoszenia nie mogą mieć fantazyjnych efektów dźwiękowych!

Grał w golfa

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

Próbny

enter image description here



1

PowerShell, 66 65 63 bajtów

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

enter image description here

-1 usunęło niepotrzebne białe spacje po -m

-2 dzięki AdmBorkBork - wykorzystany 1,1,5i *końcowy wynik 100zamiast użycia100,100,500

przyjmuje $argstablicę char, pętle przechodzi Write-Hostw -Ntryb uśpienia, jak określono, z argumentem oNewline służy do zapisywania znaków w tym samym wierszu.

Ulepszenia?

  • użyj [0..99]zamiast, [char[]]aby zapisać 1 bajt, ale nie będzie działać na ciągach ponad 100 znaków.
  • używać 100,500i [(++$i%3)-gt1]jednak zrobić to krótsze jakoś.
  • połącz go w jeden ciąg i wyczyść między wyjściami, eliminując długi Write-Host

nie mogę znaleźć żadnego sposobu, aby dwa ostatnie działały, a pierwszy nie jest ważny przez żadną konkretną regułę.


1
sleep -m((1,1,5)[++$i%3]*100)
Zdobądź

@AdmBorkBork smart one - thanks!
colsw

0

Perl, 63 bytes

foreach(split//,pop){$|=++$i;print;select('','','',$i%3?.1:.5)}

0

Python 3, 88 Bytes

import time;s=''
for x in input():s+=x;time.sleep(.1+.4*(len(s)%3==0));print('\n'*25+s)

0

Rebol, 65 bytes

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
]


0

Java 7, 151 149 bytes

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 bytes thanks to @KritixiLithos for something I always forget..

Explanation:

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

Usage:

java -jar M.jar "Hello, PPCG! Goodbye Earth!"

1
I haven't tested it, but can you do something like a[0].split("") instead?
user41805

@KritixiLithos Argg.. I always forget that one. Thanks.
Kevin Cruijssen

Speaking about which, I should also use split in my Processing answer...
user41805

0

Processing, 133 131 bytes

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

I tried doing args[0] and wrapping the argument in "" instead, but it does not work for some reason.

Anyways... this is the first time I've written a Processing program that takes arguments. Unlike Java, you don't need to declare the arguments using String[]args, but the variable args will automatically be initialised to the arguments.

Put it in a file called sketch_name.pde under a folder called sketch_name (yes, same name for folder and sketch). Call it like:

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

cheese

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.