Tasti di uscita


14

In qualsiasi linguaggio di programmazione, creare un programma che accetta input e anima il testo digitato su una tastiera.

Il ritardo tra ciascun personaggio dovrebbe variare per simulare la vera digitazione su una tastiera. Il ritardo deve essere di 0.1, 0.1, 0.5, 0.1, 0.1, 0.5 ...secondi, fino alla stampa dell'ultimo carattere. L'output finale deve essere lasciato sullo schermo.

È necessario sovrascrivere la riga di testo corrente per cui non è possibile stampare il testo su nuove righe.

Esempio, l'input "Ciao, PPCG! Addio Terra!" dovrebbe comportare la seguente animazione (si noti che la frequenza di campionamento del creatore di GIF era bassa, quindi il risultato reale è leggermente diverso):

enter image description here

Dato che si tratta di code golf, vince il minor numero di byte.


"Devi sovrascrivere la riga di testo corrente e non puoi stampare il testo su nuove righe." - questo implica che il programma deve cancellare l'input e produrre output al suo posto? (Nota a margine: l'animazione sembra più veloce di quanto specificato.)
Jonathan Allan,

Possiamo presumere che ci sia sempre input?
Metoniem,

1
Il ritardo dovrebbe essere casuale o uno schema ripetitivo di 0,1, 0,1, 0,5?
Mee

2
Dovrebbe esserci un ritardo prima di stampare il primo carattere?
Kritixi Lithos,

1
È quel modello sì @ 12Me21
Metoniem

Risposte:


8

C 108 93 89 78 73 80 byte

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

Versione non golfata:

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

@Kritixi Lithos @Metoniem Grazie per il tuo contributo! salvato alcuni byte.

In qualche modo, int imi ha dato solo un errore di segmentazione durante l'esecuzione, quindi l'ho inizializzato con 0.


1
Sia che tu usi i miei miglioramenti o meno: i tuoi ritardi dovrebbero essere al contrario. se i%3il ritardo dovesse essere 5.
Metoniem

Sostituisci 100000con 1e5per radere 3 byte
Albert Renshaw,

@AlbertRenshaw Grazie per il suggerimento, aggiornato. L'ho usato in alcune delle mie altre soluzioni, non so perché ho dimenticato qui.
Abel Tom il

@AbelTom Per qualche motivo, 1e5non funziona sul mio dispositivo
Kritixi Lithos,

@KritixiLithos howcome? sei su Linux?
Abel Tom,

6

Gelatina , 13 byte

115D÷⁵ṁȮœS¥@"

Questo è un collegamento / funzione monadica. A causa dell'output implicito, non funziona come un programma completo.

Verifica

Come funziona

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 byte

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

Spiegazione:

Ho usato un po 'di tempo per rendere la fprintfversione più breve rispetto disp()a clc. La svolta è stata quando ho scoperto / ricordato che pausepuò prendere un vettore come argomento, nel qual caso sceglierà solo il primo valore. Ciò consente di escludere un contatore.

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

Il più breve che ho ottenuto è dispstato di 81 byte:

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

Puoi fare printfinvece di fprintf? Funziona su octave-online.net (ma è Octave e non Matlab)
Kritixi Lithos

4

JavaScript (ES6), 67 byte

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>


Lo snippet non sembra funzionare
Kritixi Lithos,

@KritixiLithos Yup, non sembra funzionare su Chrome :-(
Metoniem

funziona in firefox tho
Conor O'Brien il

2
Funziona per me in Chrome, ma la console diceBlocked form submission to '' because the form's frame is sandboxed and the 'allow-forms' permission is not set.
numbermaniac

@numbermaniac Ho modificato lo snippet per utilizzare un evento diverso. (Sono così vecchio che riesco davvero a ricordare quando si preme Invio in un campo modulo non ha attivato il seguente pulsante ma è andato direttamente al modulo di invio.)
Neil

4

V , 20 19 18 byte

1 byte salvato grazie a @DJMcMayhem

salvato 1 byte rimuovendolo òalla fine

òD1gÓulD1gÓulDgÓul

Terribilmente ungolfy, lo so, è proprio quel undo rigoroso che mi impedisce di usare loop nidificati.

Spiegazione

Il cursore inizia all'inizio del buffer, che è il primo carattere dell'input.

ò                      " 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 in arrivo ...


senza un conteggio predefinito per impostazione predefinita a 500 ms, quindi è possibile salvare un byte lì. Inoltre, ricorda che non è necessario il secondo ò!
James,

Invece di undo puoi semplicemente paste? Non sono sicuro se questo aiuti affatto
nmjcman101,

@DJMcMayhem Non so perché ho perso la 500 predefinita, grazie! Ma ho bisogno del secondo òperché altrimenti il ​​programma termina in anticipo a causa della newline implicita alla fine causando un errore di rottura.
Kritixi Lithos,

@ nmjcman101 Stavo anche pensando di usare le paste, ma purtroppo sposta il cursore alla fine della riga e per tornare indietro avrei bisogno di qualcosa del genere ``che aumenterebbe ulteriormente il mio personale addizionale
Kritixi Lithos,

4

MATL , 16 byte

"@&htDTT5hX@)&Xx

Provalo su MATL Online!

Spiegazione

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

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

Provalo:)


Come funziona

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

Snippet di codice a 19 byte che si estende all'infinito.

<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
Per qualche motivo, il ritardo sembra spento. Il ritardo è 100ms, 100ms, 500ms. Sembra che tu abbia sempre 100ms.
Ismael Miguel,

@IsmaelMiguel Buon occhio. Dopo aver guardato attraverso la fonte c'è un'aggiunta anziché una moltiplicazione. Potrei mantenerlo così, nel caso in cui ne avessi bisogno perché potevo vedere dove poteva essere utile. Grazie mille per quello!
tkellehe,

Prego. E mi dispiace che il conteggio dei byte sia aumentato.
Ismael Miguel,

@IsmaelMiguel, va bene perché quando realizzo la prossima versione di Noodel posso creare una soluzione a 11 byte (per motivi di base che devo aggiungere). Sarà ovviamente non competitivo, ma questa è una nuova lingua e ha ancora
molta

3

APL, 23 byte

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

Spiegazione:

               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 byte

Non c'è molto da spiegare. Prende solo una stringa (racchiusa in "") come argomento e stampa ogni carattere usando il modello di ritardo corretto. Dopo l'animazione termina con un OutOfRangeExceptionperché il ciclo non si interrompe dopo che è passato su tutti i personaggi. Dal momento che è un ciclo infinito, ciò significa anche che posso usare al int Mainposto di void Main;-)

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

Le modifiche

  • Salvato 1 byte spostando l'incremento iall'interno del Sleep()metodo anziché nel forciclo. (Grazie Maliafo )

1
Non sono un programmatore C #, ma non puoi fare qualcosa di simile Sleep(i++ [...])per salvare un byte extra nel ciclo for?
Maliafo,

@Maliafo Potresti avere ragione! Lo eseguirò per assicurarmi che funzioni ancora correttamente e quindi aggiornerò il mio post. Grazie!
Metoniem,

2

SmileBASIC, 61 byte

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

Penso che il calcolo del ritardo potrebbe essere molto più breve.


2

Clojure, 81 byte

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

Passa sopra la stringa di input zippata con un elenco infinito di [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 (+ utility), 32 byte

Nota, questo emetterà un segnale acustico nel processo, ma chi ha detto che gli invii non possono avere effetti sonori fantasiosi!

golfed

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

dimostrazione

enter image description here



1

Powershell, 66 65 63 byte

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

enter image description here

-1 rimosso spazio bianco non necessario dopo -m

-2 grazie ad AdmBorkBork - usato 1,1,5e* risultato finale 100invece di usare100,100,500

prende $argscome array di caratteri, scorre attraverso il sonno come specificato,Write-Host-N sospensione con l' argomento oNewline viene utilizzato per scrivere i caratteri sulla stessa riga.

Miglioramenti?

  • uso [0..99] invece di [char[]]salvare 1 byte, ma non funzionerà su stringhe oltre 100 caratteri.
  • uso 100,500 e [(++$i%3)-gt1]ma renderlo più breve in qualche modo.
  • combinalo in un'unica stringa e cancella tra le uscite, eliminando il lungo Write-Host

non riesco a trovare alcun modo per far funzionare gli ultimi due e il primo non è valido per nessuna regola particolare.


1
Rompere il centinaio per salvare due byte -sleep -m((1,1,5)[++$i%3]*100)
AdmBorkBork,

@AdmBorkBork smart one - grazie!
Colsw,

0

Perl, 63 byte

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

0

Python 3, 88 byte

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

0

Rebol, 65 byte

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 byte

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 byte grazie a @KritixiLithos per qualcosa che dimentico sempre ..

Spiegazione:

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

Uso:

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

1
Non l'ho provato, ma puoi fare qualcosa del genere a[0].split("")?
Kritixi Lithos,

@KritixiLithos Argg .. Lo dimentico sempre. Grazie.
Kevin Cruijssen,

A proposito, dovrei anche usare la splitmia risposta di elaborazione ...
Kritixi Lithos,

0

Elaborazione, 133 131 byte

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

Ho provato a fare args[0]e a concludere l'argomento"" , ma non funziona per qualche motivo.

Comunque ... questa è la prima volta che scrivo un programma di elaborazione che accetta argomenti. A differenza di Java, non è necessario dichiarare gli argomenti utilizzando String[]args, ma la variabile argsverrà automaticamente inizializzata agli argomenti.

Inseriscilo in un file chiamato sketch_name.pdein una cartella denominata sketch_name(sì, stesso nome per cartella e schizzo). Chiamalo come:

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

cheese

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.