การกดปุ่มเอาต์พุต


14

ในภาษาการเขียนโปรแกรมใด ๆ ให้สร้างโปรแกรมที่รับอินพุตและเคลื่อนไหวข้อความที่พิมพ์บนแป้นพิมพ์

ความล่าช้าระหว่างอักขระแต่ละตัวควรแปรผันเพื่อจำลองการพิมพ์จริงบนแป้นพิมพ์ การหน่วงเวลาจะเป็น0.1, 0.1, 0.5, 0.1, 0.1, 0.5 ...วินาทีจนกว่าอักขระตัวสุดท้ายจะถูกพิมพ์ เอาต์พุตสุดท้ายจะถูกทิ้งไว้บนหน้าจอ

คุณต้องเขียนทับบรรทัดข้อความปัจจุบันที่คุณไม่สามารถพิมพ์ข้อความบนแถวใหม่

ตัวอย่างการป้อนข้อมูล "Hello, PPCG! Goodbye Earth!" ควรส่งผลให้เกิดภาพเคลื่อนไหวต่อไปนี้ (โปรดทราบว่าอัตราการสุ่มตัวอย่างของ gif-maker ต่ำดังนั้นผลลัพธ์ที่แท้จริงจะแตกต่างกันเล็กน้อย):

enter image description here

เนื่องจากนี่คือโค้ดกอล์ฟจำนวนไบต์ที่น้อยที่สุดจะเป็นผู้ชนะ


"คุณต้องเขียนทับบรรทัดข้อความปัจจุบันที่คุณไม่สามารถพิมพ์ข้อความในแถวใหม่ได้" - นี่หมายความว่าโปรแกรมจะต้องเคลียร์อินพุตและสร้างเอาต์พุตในที่นั้นหรือไม่? (หมายเหตุด้าน: ภาพเคลื่อนไหวของคุณดูเร็วกว่าที่ระบุ)
Jonathan Allan

เราสามารถสันนิษฐานได้ว่ามีอินพุตอยู่เสมอหรือไม่?
Metoniem

1
ความล่าช้าควรเป็นแบบสุ่มหรือรูปแบบการทำซ้ำที่ 0.1, 0.1, 0.5 หรือไม่
12Me21

2
ควรจะมีความล่าช้าก่อนที่จะพิมพ์ตัวอักษรตัวแรก?
user41805

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 ไบต์
Albert Renshaw

@AlbertRenshaw ขอบคุณสำหรับเคล็ดลับการปรับปรุง ฉันใช้มันในโซลูชันอื่น ๆ ของฉันด้วยเช่นกันไม่รู้ด้วยว่าทำไมฉันถึงลืมที่นี่
Abel Tom

@AbelTom ด้วยเหตุผลบางอย่าง1e5ไม่สามารถใช้งานได้บนอุปกรณ์ของฉัน
user41805

@KritixiLithos howcome? คุณอยู่บน Linux หรือไม่
Abel Tom

6

เยลลี่ 13 ไบต์

115D÷⁵ṁȮœS¥@"

นี่คือลิงค์ / ฟังก์ชั่น monadic เนื่องจากเอาต์พุตโดยปริยายมันไม่ทำงานเป็นโปรแกรมแบบเต็ม

การตรวจสอบ

มันทำงานอย่างไร

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

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>


ตัวอย่างข้อมูลดูเหมือนจะไม่ทำงาน
user41805

@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 ในฟิลด์แบบฟอร์มไม่ได้เรียกปุ่มต่อไปนี้ แต่กลับไปที่การส่งแบบฟอร์ม)
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 เร็ว ๆ นี้ ...


โดยไม่มีค่าเริ่มต้นการนับเป็น 500 ms ดังนั้นคุณสามารถบันทึกไบต์ที่นั่น อย่าลืมว่าคุณไม่ต้องการที่สองò!
James

แทนที่จะเป็นuคุณสามารถช่วยได้pไหม ไม่แน่ใจว่าสิ่งนั้นจะช่วยได้หรือไม่
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

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>


1
ด้วยเหตุผลบางอย่างความล่าช้าดูเหมือนจะปิด ความล่าช้าคือ 100ms, 100ms, 500ms คุณดูเหมือนจะมี 100ms ตลอดเวลา
Ismael Miguel

@ IsmaelMiguel ตาดี หลังจากดูแหล่งที่มาแล้วจะมีการเพิ่มแทนการคูณ ฉันอาจจะเก็บไว้เป็นอย่างนั้นแม้ว่าในกรณีที่ฉันต้องการเพราะฉันสามารถดูว่ามันอาจจะมีประโยชน์ ขอบคุณมากสำหรับสิ่งนั้น!
tkellehe

ไม่เป็นไร และฉันขอโทษที่จำนวนไบต์ของคุณเพิ่มขึ้น
Ismael Miguel

@IsmaelMiguel ก็ใช้ได้เพราะเมื่อฉันสร้างNoodelรุ่นถัดไปฉันสามารถสร้างโซลูชัน11 ไบต์ (เพราะพื้นฐานฉันต้องเพิ่ม) มันจะเห็นได้ชัด noncompeting แต่นี้เป็นภาษาใหม่และมีวิธียาวไปก่อนที่มันจะเป็นสิ่งที่ดีเป็นบางส่วนของภาษาการเล่นกอล์ฟบน :)
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);}}}

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วนซ้ำ (ขอบคุณMaliafo )

1
ฉันไม่ใช่โปรแกรมเมอร์ C # แต่คุณไม่สามารถทำสิ่งที่ต้องการSleep(i++ [...])บันทึกไบต์พิเศษใน for for loop ได้ไหม
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

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 Bytes

[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

ไม่สามารถหาวิธีที่จะทำให้งานสองอย่างสุดท้ายและวิธีแรกไม่ถูกต้องตามกฎใด ๆ


1
แบ่งออกเป็นร้อยเพื่อประหยัดสองไบต์ -sleep -m((1,1,5)[++$i%3]*100)
AdmBorkBork

@AdmBorkBork ฉลาดคนหนึ่ง - ขอบคุณ!
colsw



0

Rebol ขนาด 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
]


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

กำลังประมวลผล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]และใส่อาร์กิวเมนต์เข้าไป"" instead, but it does not work for some reason.

ต่อไป ... นี่เป็นครั้งแรกที่ฉันได้เขียนโปรแกรมประมวลผลที่ใช้อาร์กิวเมนต์ ไม่เหมือนกับ 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.