Touches de sortie


14

Dans n'importe quel langage de programmation, créez un programme qui prend en entrée et anime le texte tapé sur un clavier.

Le délai entre chaque caractère doit être variable pour simuler la véritable frappe sur un clavier. Le délai est de 0.1, 0.1, 0.5, 0.1, 0.1, 0.5 ...quelques secondes, jusqu'à ce que le dernier caractère soit imprimé. Le résultat final doit être laissé sur l'écran.

Vous devez remplacer la ligne de texte actuelle, vous ne pouvez pas faire imprimer le texte sur de nouvelles lignes.

Exemple, l'entrée "Bonjour, PPCG! Au revoir la Terre!" devrait entraîner l'animation suivante (notez que le taux d'échantillonnage du générateur de gif était faible, donc le vrai résultat est légèrement différent):

enter image description here

Puisqu'il s'agit de golf de code, le plus petit nombre d'octets gagne.


"Vous devez remplacer la ligne de texte actuelle, vous ne pouvez pas faire imprimer le texte sur de nouvelles lignes." - cela implique-t-il que le programme doit effacer l'entrée et produire la sortie à sa place? (Note latérale: votre animation semble plus rapide que spécifiée.)
Jonathan Allan

Pouvons-nous supposer qu'il y a toujours une entrée?
Metoniem

1
Le retard est-il censé être aléatoire ou un motif répétitif de 0,1, 0,1, 0,5?
12Me21

2
Devrait-il y avoir un délai avant d'imprimer le premier caractère?
Kritixi Lithos

1
C'est ce modèle oui @ 12Me21
Metoniem

Réponses:


8

C 108 93 89 78 73 80 octets

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

Version non golfée:

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

@Kritixi Lithos @Metoniem Merci pour votre contribution! enregistré quelques octets.

D'une certaine manière, je viens de int ime donner une erreur de segmentation lors de l'exécution, donc je l'ai initialisée avec 0.


1
Que vous utilisiez mes améliorations ou non: vos retards devraient être inversés. si i%3le retard doit être de 5.
Metoniem

Remplacer 100000par 1e5pour raser 3 octets
Albert Renshaw

@AlbertRenshaw Merci pour le conseil, mis à jour. Je l'ai également utilisé dans certaines de mes autres solutions, je ne sais pas pourquoi j'ai oublié ici.
Abel Tom

@AbelTom Pour une raison quelconque, 1e5ne fonctionne pas sur mon appareil
Kritixi Lithos

@KritixiLithos howcome? êtes-vous sous Linux?
Abel Tom

6

Gelée , 13 octets

115D÷⁵ṁȮœS¥@"

Il s'agit d'un lien / fonction monadique. En raison de la sortie implicite, il ne fonctionne pas comme un programme complet.

Vérification

Comment ça fonctionne

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 octets

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

Explication:

J'ai utilisé un bon moment pour rendre la fprintfversion plus courte disp()qu'avec clc. La percée a été lorsque j'ai découvert / retenu que je pouvais pauseprendre un vecteur comme argument, auquel cas il choisirait simplement la première valeur. Cela permet de laisser de côté un comptoir.

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

Le plus court que j'ai pu utiliser dispétait de 81 octets:

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

Pouvez-vous faire à la printfplace de fprintf? Cela fonctionne sur octave-online.net (mais c'est Octave et non Matlab)
Kritixi Lithos

4

JavaScript (ES6), 67 octets

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>


L'extrait de
code

@KritixiLithos Yup, ne semble pas fonctionner sur Chrome :-(
Metoniem

fonctionne dans firefox tho
Conor O'Brien

2
Cela fonctionne pour moi dans Chrome, mais la console ditBlocked form submission to '' because the form's frame is sandboxed and the 'allow-forms' permission is not set.
numbermaniac

@numbermaniac J'ai modifié l'extrait de code pour utiliser un autre événement. (Je suis si vieux que je me souvienne que le fait d'appuyer sur Entrée dans un champ de formulaire n'a pas déclenché le bouton suivant mais est allé directement à la soumission du formulaire.)
Neil

4

V , 20 19 18 octets

1 octet enregistré grâce à @DJMcMayhem

enregistré 1 octet en supprimant òà la fin

òD1gÓulD1gÓulDgÓul

Terriblement impuissant, je sais, c'est juste que strict u ndo m'empêche d'utiliser des boucles imbriquées.

Explication

Le curseur démarre au début du tampon, qui est le premier caractère de l'entrée.

ò                      " 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 à venir bientôt ...


sans décompte par défaut à 500 ms, vous pouvez donc y enregistrer un octet. N'oubliez pas non plus que vous n'avez pas besoin de la seconde ò!
James

Au lieu de undo pouvez-vous simplement paste?
Je ne sais pas

@DJMcMayhem Je ne sais pas pourquoi j'ai raté le 500 par défaut, merci! Mais j'ai besoin de la seconde òparce que sinon le programme se termine tôt en raison de la nouvelle ligne implicite à la fin provoquant une erreur de rupture.
Kritixi Lithos

@ nmjcman101 Je pensais également à utiliser paste, mais hélas, cela déplace le curseur à la fin de la ligne et pour revenir en arrière, j'aurais besoin de quelque chose comme ``cela qui ne ferait qu'augmenter encore mon bytecount
Kritixi Lithos

4

MATL , 16 octets

"@&htDTT5hX@)&Xx

Essayez-le sur MATL Online!

Explication

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

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

Essayez-le :)


Comment ça fonctionne

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

Extrait de code de 19 octets qui boucle sans fin.

<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
Pour une raison quelconque, le retard semble éteint. Le retard est de 100 ms, 100 ms, 500 ms. Vous semblez avoir 100 ms tout le temps.
Ismael Miguel

@IsmaelMiguel Bon œil. Après avoir parcouru la source, il y a un ajout au lieu d'une multiplication. Je pourrais continuer ainsi, au cas où j'en aurais besoin, car je pourrais voir où cela pourrait être utile. Merci beaucoup pour ça!
tkellehe

Je vous en prie. Et je suis désolé que votre nombre d'octets ait augmenté.
Ismael Miguel

@IsmaelMiguel, c'est bien parce que quand je crée la prochaine version de Noodel, je peux faire une solution de 11 octets (à cause des bases que je dois ajouter). Ce ne sera évidemment pas compétitif, mais c'est une nouvelle langue et il y a encore beaucoup de chemin à parcourir avant d'être aussi bonne que certaines des meilleures langues de golf :)
tkellehe

3

APL, 23 octets

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

Explication:

               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 octets

Pas grand chose à expliquer. Il prend juste une chaîne (entourée de "") comme argument et imprime chaque caractère en utilisant le motif de retard correct. Après l'animation, elle se termine par un OutOfRangeExceptioncar la boucle ne s'arrête pas après avoir bouclé sur tous les personnages. Puisqu'il s'agit d'une boucle infinie, cela signifie également que je peux utiliser à la int Mainplace de void Main;-)

Golfé

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

Non golfé

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

Modifications

  • Enregistré 1 octet en déplaçant l'incrémentation à l' iintérieur de la Sleep()méthode plutôt que dans la forboucle. (Merci Maliafo )

1
Je ne suis pas un programmeur C #, mais ne pouvez-vous pas faire quelque chose comme Sleep(i++ [...])pour enregistrer un octet supplémentaire dans la boucle for?
Maliafo

@Maliafo Vous avez peut-être raison! Je vais l'exécuter pour m'assurer qu'il fonctionne toujours correctement, puis mettre à jour mon message. Merci!
Metoniem

2

SmileBASIC, 61 octets

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

Je pense que le calcul du retard pourrait être beaucoup plus court.


2

Clojure, 81 octets

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

Boucles sur la chaîne d'entrée zippée avec une liste infinie de [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 (+ utilitaires), 32 octets

Notez que cela émettra un bip dans le processus, mais qui a dit que les soumissions ne pouvaient pas avoir d'effets sonores fantaisistes!

Golfé

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

Démo

enter image description here



1

Powershell, 66 65 63 octets

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

enter image description here

-1 espace blanc inutile supprimé après -m

-2 grâce à AdmBorkBork - utilisé 1,1,5et *résultat final au 100lieu d'utiliser100,100,500

prend $argscomme un tableau de caractères, passe en veille comme spécifié, Write-Hostavec l' -Nargument oNewline est utilisé pour écrire les caractères sur la même ligne.

Des améliorations?

  • utiliser [0..99]au lieu de [char[]]pour enregistrer 1 octet, mais ne fonctionnera pas sur les chaînes de plus de 100 caractères.
  • utiliser 100,500et [(++$i%3)-gt1]mais le raccourcir en quelque sorte.
  • le combiner en une seule chaîne et effacer entre les sorties, éliminant le long Write-Host

ne trouve aucun moyen de faire fonctionner les deux derniers, et le premier n'est valide par aucune règle particulière.


1
Break out the hundred to save two bytes -- sleep -m((1,1,5)[++$i%3]*100)
AdmBorkBork

@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?
Kritixi Lithos

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

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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.