Çıkış Tuş Vuruşları


14

Herhangi bir programlama dilinde, girdi alan ve klavyede yazılan metni canlandıran bir program oluşturun.

Her karakter arasındaki gecikme, klavyedeki gerçek yazmayı simüle etmek için değişmelidir. 0.1, 0.1, 0.5, 0.1, 0.1, 0.5 ...Son karakter yazdırılana kadar gecikme saniye olacaktır . Nihai çıktı ekranda bırakılacaktır.

Metnin yeni satırlara yazdırılmasını sağlayamayacağınız geçerli metin satırının üzerine yazmalısınız.

Örnek, "Merhaba, PPCG! Elveda Dünya!" aşağıdaki animasyonla sonuçlanmalıdır (gif yapımcının örnekleme oranının düşük olduğunu, dolayısıyla gerçek sonucun biraz farklı olduğunu unutmayın):

resim açıklamasını buraya girin

Bu kod golf olduğundan, en az bayt miktarı kazanır.


"Metnin yeni satırlara yazdırılmasını sağlayamayacağınız geçerli metin satırının üzerine yazmalısınız." - Bu programın girdiyi temizlemesi ve yerine çıktı üretmesi gerektiği anlamına mı geliyor? (Yan not: animasyonunuz belirtilenden daha hızlı görünüyor.)
Jonathan Allan

Her zaman girdi olduğunu varsayabilir miyiz?
Metoniem

1
Gecikme rasgele mi yoksa 0.1, 0.1, 0.5 tekrarlayan bir model mi?
12

2
İlk karakteri yazdırmadan önce bir gecikme olmalı mı?
user41805

1
Bu desen evet @ 12Me21
Metoniem

Yanıtlar:


8

C 108 93 89 78 73 80 bayt

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

Ungolfed sürümü:

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

@Kritixi Lithos @Metoniem Girişiniz için teşekkürler! bazı baytlar kaydetti.

Her nasılsa, sadece int ibana çalışan bir segmentasyon hatası verdi, bu yüzden 0 ile başlattım.


1
Geliştirmelerimi kullanıp kullanmamanız: Gecikmeleriniz başka bir şekilde olmalıdır. eğer i%3gecikme 5. olmalı
Metoniem

3 bayt tıraş 100000etmek 1e5için değiştirin
Albert Renshaw

@AlbertRenshaw Tavsiye için teşekkürler, güncellendi. Bunu diğer nedenlerimde de kullandım, neden burada unuttuğumu bilmiyorum.
Abel Tom

@AbelTom Herhangi bir nedenden dolayı cihazımda 1e5çalışmıyor
user41805

@KritixiLithos nasıl olur? Linux'ta mısın?
Abel Tom

6

Jöle , 13 bayt

115D÷⁵ṁȮœS¥@"

Bu monadik bir bağlantı / işlevdir. Örtük çıktı nedeniyle, tam bir program olarak çalışmaz.

Doğrulama

Nasıl çalışır

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 bayt

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

Açıklama:

Ben yapmak için uzunca bir süre kullanılan fprintfdaha versiyon kısa disp()olan clc. Atılım, pausebir vektörü argüman olarak alabileceğini öğrendiğim / hatırladığım zamandı , bu durumda sadece ilk değeri seçecekti. Bu bir sayaç bırakmayı mümkün kılar.

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

En kısa sürede disp81 bayt aldım :

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

printfBunun yerine yapabilir misin fprintf? Octave-online.net üzerinde çalışıyor (ancak Matlab değil Octave)
user41805

4

JavaScript (ES6), 67 bayt

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>


Snippet çalışmıyor gibi görünüyor
user41805

@KritixiLithos Yup, Chrome'da çalışmıyor gibi görünüyor :-(
Metoniem

firefox tho çalışır
Conor O'Brien

2
Chrome'da benim için çalışıyor, ancak konsol diyor kiBlocked form submission to '' because the form's frame is sandboxed and the 'allow-forms' permission is not set.
numbermaniac

@numbermaniac Snippet'i farklı bir etkinlik kullanacak şekilde değiştirdim. (Bir form alanına Enter tuşuna basarken hatırlayabildiğim kadar yaşlıyım, aşağıdaki düğmeyi tetiklemedi, ancak doğrudan form gönderme için gitti.)
Neil

4

V , 20 19 18 bayt

@DJMcMayhem sayesinde 1 bayt kaydedildi

òsonunda kaldırarak 1 bayt kaydedildi

òD1gÓulD1gÓulDgÓul

Korkunç bir ungolfy, biliyorum, bu uiç içe döngüler kullanmamı engelleyen sadece katı bir geri alma.

açıklama

İmleç, girdinin ilk karakteri olan ara belleğin başında başlar.

ò                      " 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 yakında ...


sayım olmadan varsayılan değer 500 ms'dir, böylece oraya bir bayt kaydedebilirsiniz. Ayrıca, ikincisine ihtiyacınız olmadığını unutmayın ò!
James

Geri almak yerine usadece aste yapabilir misin p? Yine de yardımcı olup olmadığından emin değilim
nmjcman101 19:17

@DJMcMayhem Neden varsayılan 500'ü kaçırdığımı bilmiyorum, teşekkürler! Ama ikincisine ihtiyacım var, òçünkü aksi takdirde program, sondaki satırsonu hatasına neden olan örtük satırsonu nedeniyle erken sona erer.
user41805

@ nmjcman101 Ben de aste kullanmayı düşünüyordum p, ama ne yazık ki imleci satırın sonuna taşıyor ve geri dönmek için ``sadece bayt sayımı daha da artıracak bir şeye ihtiyacım var
user41805

4

MATL , 16 bayt

"@&htDTT5hX@)&Xx

MATL Online'da deneyin!

açıklama

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

Erişte , 18 bayt

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

Dene:)


Nasıl çalışır

                   # 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.

Sonsuz bir şekilde döngüye giren 19 bayt kod snippet'i.

<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
Nedense, gecikme kapalı görünüyor. Gecikme 100ms, 100ms, 500ms'dir. Her zaman 100ms var gibi görünüyor.
Ismael Miguel

@IsmaelMiguel İyi göz. Kaynağa baktıktan sonra, çarpma yerine bir ekleme var. İhtiyacım olması halinde bunu böyle tutabilirim, çünkü nerede yararlı olabileceğini görebiliyordum. Bunun için çok teşekkürler!
tkellehe

Rica ederim. Bayt sayınızın arttığı için üzgünüm.
Ismael Miguel

@IsmaelMiguel, bu iyi çünkü Noodel'in bir sonraki sürümünü yaptığımda 11 baytlık bir çözüm yapabilirim (temelleri nedeniyle eklemem gerekiyor). Açıkçası rakipsiz olacak, ancak bu yeni bir dil ve en iyi golf dillerinden bazıları kadar iyi gitmeden önce uzun bir yol var :)
tkellehe

3

APL, 23 bayt

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

Açıklama:

               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 bayt

Açıklamak için fazla bir şey yok. Yalnızca bir dize ("" içine sarılmış) bağımsız değişken olarak alınır ve her karakteri doğru gecikme desenini kullanarak yazdırır. Animasyondan sonra bir ile çıkar OutOfRangeExceptionçünkü döngü tüm karakterlerin üzerine döngü yaptıktan sonra durmaz. Sonsuz bir döngü int Mainolduğu için void Main;-) yerine de kullanabileceğim anlamına gelir

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

Düzenlemeler

  • Döngüde değil i, Sleep()yöntemin içinde artırım hareket ettirilerek 1 bayt kaydedildi for. (Teşekkürler Maliafo )

1
Ben bir C # programcısı değilim, ama Sleep(i++ [...])for döngüsünde fazladan bir bayt kaydetmek gibi bir şey yapamaz mısınız?
Maliafo

@Maliafo Haklı olabilirsin! Hala düzgün çalışıp çalışmadığından emin olmak için çalıştıracağım ve ardından yazımı güncelleyeceğim. Teşekkürler!
Metoniem

2

SmileBASIC, 61 bayt

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

Gecikme hesaplamasının çok daha kısa olabileceğini düşünüyorum.


2

Clojure, 81 bayt

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

Sonsuz bir listesiyle sıkıştırılmış giriş dizesi üzerindeki döngüler [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 (+ yardımcı programlar), 32 bayt

Not, bu süreçte bip sesi olacak, ama gönderilerin süslü ses efektleri olamaz dedi!

golfed

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

gösteri

resim açıklamasını buraya girin



1

Powershell, 66 65 63 Bayt

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

resim açıklamasını buraya girin

-1 sonra gereksiz boşluk kaldırıldı -m

-2 AdmBorkBork sayesinde - kullanmak yerine kullanılmış 1,1,5ve *sonuç100100,100,500

$argskarakter dizisi olarak alır , belirtildiği gibi uyku yoluyla döner Write-Host, -NoNewline argümanı ile aynı satırdaki karakterleri yazmak için kullanılır.

İyileştirmeler?

  • 1 bayt kaydetmek [0..99]yerine kullanın [char[]], ancak 100 karakterden fazla dizelerde çalışmaz.
  • kullanın 100,500ve bir [(++$i%3)-gt1]şekilde kısaltın.
  • tek bir dizede birleştirin ve çıkışlar arasında temizleyin, uzun Write-Host

son iki işi yapmanın bir yolunu bulamıyor ve ilki belirli bir kural tarafından geçerli değil.


1
İki bayt kurtarmak için yüz sleep -m((1,1,5)[++$i%3]*100)
kırmak

@AdmBorkBork akıllı olan - teşekkürler!
colsw

0

Perl, 63 bayt

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

0

Python 3, 88 Bayt

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

0

Rebol, 65 bayt

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, 151149 bayt

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

Her zaman unuttuğum bir şey için @KritixiLithos'a -2 bayt teşekkürler ..

Açıklama:

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

Kullanımı:

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

1
Test etmedim ama a[0].split("")onun yerine böyle bir şey yapabilir misin ?
user41805

@KritixiLithos Argg .. Bunu hep unuturum. Teşekkürler.
Kevin Cruijssen

Hangisi hakkında konuşurken, aynı zamanda splitİşleme
cevabımda

0

İşleme, 133131 bayt

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

Bunun yerine args[0]argümanı yapmayı ve sarmayı denedim "", ama bir nedenden dolayı çalışmıyor.

Her neyse ... ilk defa argüman alan bir İşleme programı yazdım. Java'nın aksine, bağımsız değişkenleri kullanarak bildirmeniz gerekmez String[]args, ancak değişken argsotomatik olarak bağımsız değişkenlere başlatılır.

Bu dosyayı adlı sketch_name.pdebir klasörün altına koyun sketch_name(evet, klasör ve çizim için aynı ad). Şöyle çağırın:

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

peynir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.