출력 키 스트로크


14

모든 프로그래밍 언어에서 입력을 받아 키보드에서 입력되는 텍스트를 애니메이션으로 만드는 프로그램을 만듭니다.

각 문자 사이의 지연 시간은 키보드에서 실제 입력을 시뮬레이트하도록 다양해야합니다. 0.1, 0.1, 0.5, 0.1, 0.1, 0.5 ...마지막 문자가 인쇄 될 때까지 지연 시간은 초입니다. 최종 출력은 화면에 남아 있어야합니다.

텍스트를 새 행에 인쇄 할 수없는 현재 텍스트 줄을 덮어 써야합니다.

예를 들어, "Hello, PPCG! Goodbye Earth!" 다음 애니메이션이 표시되어야합니다 (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

교체 1000001e5면도를 3 바이트에
알버트 렌쇼

@AlbertRenshaw 팁을 주셔서 감사합니다. 다른 솔루션에서도 사용했는데 왜 내가 여기에서 잊었는지 모르겠습니다.
Abel Tom

@AbelTom 어떤 이유로 든 1e5내 장치에서 작동하지 않습니다
user41805

@KritixiLithos Howcome? 당신은 리눅스에 있습니까?
Abel Tom

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

설명:

with 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이 아닌 Octave입니다.
user41805

4

자바 스크립트 (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>


스 니펫이 작동하지 않는 것 같습니다
user41805

@KritixiLithos Yup, Chrome에서 작동하지 않는 것 같습니다 :-(
Metoniem

파이어 폭스에서 작동
코너 오브라이언

2
그것은 크롬에 나를 위해 작동하지만 콘솔은 말한다Blocked form submission to '' because the form's frame is sandboxed and the 'allow-forms' permission is not set.
numbermaniac의

@numbermaniac 다른 이벤트를 사용하도록 스 니펫을 변경했습니다. (양식 필드에 Enter 키를 눌렀을 때 실제로 기억할 수있는 나이가 너무
Neil

4

V , 20 19 18 바이트

@DJMcMayhem 덕분에 1 바이트 절약

ò마지막 에 제거 하여 1 바이트 저장

òD1gÓulD1gÓulDgÓul

엄청나게 골치 아프다. 나는 그것이 엄격한 undo로 인해 중첩 루프를 사용할 수 없다는 것을 알고있다 .

설명

커서는 입력의 첫 문자 인 버퍼의 시작 부분에서 시작합니다.

ò                      " 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 ò

곧 온다 ...


카운트가 없으면 기본값은 500ms이므로 바이트를 저장할 수 있습니다. 또한 두 번째는 필요하지 않습니다 ò!
James

undo 대신 그냥 paste 할 수 있습니까? 확실 그 도움이된다면 모든 생각에서
nmjcman101

@DJMcMayhem 기본 500을 놓친 이유를 모르겠습니다. 감사합니다! 그러나 두 번째가 필요합니다. ò그렇지 않으면 프로그램이 결국 암시 적 줄 바꿈으로 인해 조기에 종료되어 오류가 발생하기 때문입니다.
user41805

@ nmjcman101 또한 사용에 대해 생각했다 pASTE,하지만 슬프게도 그것은 라인의 끝으로 커서를 이동하고 내가 좋아하는 뭔가 필요가 돌아가고 ``만 더 내 bytecount가 증가 것이다
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
어떤 이유로 지연이 사라지는 것 같습니다. 지연 시간은 100ms, 100ms, 500ms입니다. 당신은 항상 100ms를 가지고있는 것 같습니다.
Ismael Miguel

@IsmaelMiguel 좋은 눈. 소스를 살펴본 후 곱하기 대신 추가가 있습니다. 유용 할 수있는 곳을 볼 수 있기 때문에 필요한 경우를 대비하여 유지할 수 있습니다. 고마워요!
tkellehe

천만에요. 바이트 수를 늘려서 죄송합니다.
Ismael Miguel

@IsmaelMiguel, 그것의 미세 내가 다음 버전 할 때 때문에 Noodel 내가 할 수있는 11 바이트 솔루션을 (기본의 나는 추가해야하기 때문에). 분명히 비 경쟁적이지만, 이것은 새로운 언어이며 최고의 골프 ​​언어들만큼 좋기 전에 갈 길이
멀다

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

편집

  • 루프 대신 메소드 i내부에서 증분을 이동하여 1 바이트를 절약했습니다 . (감사합니다 Maliafo )Sleep()for

1
나는 C # 프로그래머가 아니지만 Sleep(i++ [...])for 루프에 여분의 바이트를 저장하는 것과 같은 것을 할 수 없습니까?
Maliafo

@Maliafo 당신이 옳을 수도 있습니다! 여전히 제대로 실행되는지 확인한 다음 게시물을 업데이트합니다. 감사!
Metoniem

2

SmileBASIC, 61 바이트

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

지연 계산이 훨씬 짧을 수 있다고 생각합니다.


2

클로저, 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

배쉬 (+ 유틸리티), 32 바이트

이 과정에서 경고음이 들리지만 누가 제출하면 멋진 음향 효과를 얻을 수 없다고 말했습니까?

골프

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

데모

enter image description here



1

파워 쉘, 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하며, -NoNewline 인수는 문자를 같은 행에 쓰는 데 사용됩니다.

개량?

  • 1 바이트를 저장 하는 [0..99]대신 사용 [char[]]하지만 100 자 이상의 문자열에서는 작동하지 않습니다.
  • 사용 100,500하고 [(++$i%3)-gt1]있지만, 어떻게 든 짧은합니다.
  • 단일 문자열로 결합하고 출력 사이를 지우면 긴 Write-Host

마지막 두 작업을 수행 할 수있는 방법을 찾을 수 없으며 첫 번째 작업은 특정 규칙에 따라 유효하지 않습니다.


1
백을 sleep -m((1,1,5)[++$i%3]*100)
나누어

@AdmBorkBork 똑똑한 하나-감사합니다!
colsw

0

펄, 63 바이트

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


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

Bash + coreutils, 57 바이트

for((;k<${#1};k++)){ echo -n ${1:k:1};sleep .$[2&k%3|1];}

0

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

내가 항상 잊어 버린 무언가에 대한 @KritixiLithos 덕분에 -2 바이트 ..

설명:

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("")대신 비슷한 것을 할 수 있습니까?
user41805

@KritixiLithos Argg. 나는 항상 그 것을 잊어 버립니다. 감사.
케빈 크루이 센

에 대해 말하면, 나는 또한 split처리 답변에 사용해야합니다 ...
user41805

0

처리 중, 133131 바이트

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.