Czkawka ciąg

16

Wyzwanie polega na napisaniu programu lub funkcji, która ma czkawkę. Powinien pobierać ciąg jako dane wejściowe (dowolną standardową metodą), a następnie wykonaj następujące kroki:

  1. Wygeneruj (niekoniecznie jednakowo) losową liczbę całkowitą n między 1 a 10 włącznie.
  2. Poczekaj n sekund.
  3. Wydrukuj początkowy / następny n znaków wejściowych lub resztę danych wejściowych, jeśli jest mniej niż n znaków.
  4. Jeśli pozostało wejście do wydrukowania, wróć do kroku 1.

Zasady

  • Dane wejściowe zawsze będą niepustym ciągiem zawierającym tylko znaki ASCII (32-126).
  • Czas oczekiwania nie musi wynosić dokładnie n sekund, ale musi wynosić 10% n .
  • Możesz wydrukować końcowy znak nowej linii za każdym razem, gdy drukowany jest fragment tekstu.

Przykład

Tutaj spacja reprezentuje 1 sekundę. Jeśli wejście jest Hiccupinator!, wyjście może być:

   Hic     cupin a          tor!

Punktacja

To jest , więc wygrywa najkrótszy kod w bajtach .

ETHprodukcje
źródło
Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
Dennis
Czy możemy używać spacji dla języków, które nie obsługują oczekiwania / nie mają pojęcia o czasie?
FliiFe
Założę się, że każdy język ma sposób na spędzenie czasu bez generowania wyników, @FliiFe!
Omar

Odpowiedzi:

9

Scratch, 16 bloków + 6 bajtów

Kod

Zakłada, że ​​dane wejściowe są już zdefiniowane jako lista znaków ( ["H","e","l","l","o"," ","W","o","r","l","d"])

OldBunny2800
źródło
Czy można to w jakikolwiek sposób pograć w golfa?
OldBunny2800,
To nie jest poprawna metoda punktacji. Zobacz meta post .
mbomb007,
Czy byłbyś skłonny to naprawić w oparciu o konsensus społeczności?
OldBunny2800,
1
Nie mam Scratcha. To twoja odpowiedzialność, skoro opublikowałeś odpowiedź. ScratchBlocks2 jest nawet wyposażony w generator do tworzenia kodu tekstowego z projektu.
mbomb007,
5

Pushy , 20 17 16 lub 13 bajtów

W zależności od tego, co jest dozwolone, istnieją dwa rozwiązania.

16 bajtów:

@$LT1U&Wm:v;O"cI

Dać argumenty w linii poleceń: $ pushy hiccup.pshy 'hiccupinator'. Drukuje się z końcowymi znakami nowej linii po każdym „czkawce”. Oto podział:

                      % Implicit: input on stack as charcodes
@                     % Reverse input, so chars are pulled from start
 $             I      % While there are items on stack:
   T1U                %   Push a random number, 1-10
      &W              %   Wait that many seconds
  L     m:            %   min(time waited, chars left) times do:
          v;          %     Pull a char from the input.
            O"c       %   Print & delete pulled chars

13 bajtów:

Podczas kodowania powyższej odpowiedzi wpadłem na to znacznie krótsze rozwiązanie:

N@$L1TU&Wm:'.

Chociaż robi to samo, drukuje bezpośrednio z ciągu, zamiast budować nowy, dla mniejszej liczby bajtów. Wymaga toN na początku programu, aby zapobiec końcowym znakom nowej linii, w przeciwnym razie każdy znak będzie na nowym wierszu.

Jednak podczas testowania zauważyłem błąd - stdout jest buforowany w linii, więc program poczeka na pełną długość, a następnie wyświetli czkawkę.

Naprawiłem to w ostatnim zatwierdzeniu , dodając prosty.flush() - to technicznie nie dodaje nowej funkcji do języka, tylko naprawia błąd, ale rozumiem, jeśli nie weźmiesz tej odpowiedzi pod uwagę :)

Podział wygląda następująco:

        % Implicit: input on stack as charcodes
N       % Set trailing newlines to False
@       % Reverse stack (so the charcodes are pulled off in order)
$       % While there are items left to print:
L       %    Push stack length
1TU     %    Push a random number 1-10
&W      %    Wait that amount of time
m:      %    min(time waited, chars left) times do:
'.      %      Pop and print last char
FlipTack
źródło
Konwencja w PPCG jest taka, że ​​języki są definiowane przez implementację (błędy i wszystkie). Ponieważ zatwierdzenie stanowi datę późniejszą niż wyzwanie, ta część nie stanowi konkurencji
Luis Mendo
@LuisMendo ok, dziękuję za wyjaśnienie :)
FlipTack,
Dobra odpowiedź BTW :-)
Luis Mendo
4

JavaScript (ES6) 91 89 bajtów

f=s=>s&&setTimeout(_=>console.log(s.slice(0,n))|f(s.slice(n)),(n=1+Math.random()*10)<<10)

console.log(2 + f.toString().length); 
f('Hello sweet world!')                                       

zapisano 2 bajty dzięki @zeppelin

Nadużywa 10% tolerancji dla czasu oczekiwania, czekając n<<10 === 1024*nmilisekundy.

Ponieważ powiedziałeś, że czas oczekiwania musi wynosić 10% n , postanowiłem zapisać jeden bajt i poczekać 999 milisekund zamiast 1 sekundy.

Nie potrzebuję już 999 milisekund głupoty dzięki @ETHProductions

Lmis
źródło
1
Hmm, nie jestem pewien, czy nowa Data ()% 10 liczy się jako „losowa” według dowolnej miary.
zeppelin
@zeppelin Uczciwy punkt, zgodnie ze standardową definicją nie ma znaczenia. ( meta.codegolf.stackexchange.com/a/1325/56071 ). Zmienię to odpowiednio.
Lmis,
Możesz także zapisać parę bajtów, usuwając „| 0”
zeppelin,
2
Wiesz, możesz wyrazić 1000 również w trzech bajtach: 1e3;-)
ETHproductions
1
> (1 + 0,099999 * 10) * 999> 1997 Prawda, ale prawdopodobnie możesz zastąpić * 999 wartością << 10, aby obejść ten problem: (1 + 0,099999 * 10) << 10 => 1024, (1 + 0,99999999 * 10) << 10 => 10240
zeppelin,
4

Python 2, 93 92 bajty

import random,time
def F(s):
 if s:n=random.randint(1,10);time.sleep(n);print s[:n];F(s[n:])

-1 bajt dzięki Flp.Tkc

Jestem pewien, że istnieje sposób na skrócenie random.randinti time.sleep, ale from random,time import*nie działa ...

acrolith
źródło
1
from random,time import*nie działa, ponieważ Python nie wie, z którego modułu chcesz zaimportować biblioteki.
Erik the Outgolfer
Python 3 jest o jeden bajt dłużej. Wstawić „(” między drukiem a „i” i „)” przed nawiasem
George
1
Dostosowując to do minipy (Python 3): while v1:n=ri(1,10);_i("time").sleep(n);p(v1[:n]);v1=v1[n:];(pobiera dane z argumentów wiersza poleceń)
Esolanging Fruit 24.11.16
Możesz zapisać ten 1 bajt krótszy jako funkcję rekurencyjną import random,timedef F(s):if s:n=random.randint(1,10);time.sleep(n);print s[:n];F(s[n:])
:,
3

Perl 6 , 62 bajtów

{$_=$^a;while $_ {sleep my \t=(1..10).roll;put s/.**{0..t}//}}

Rozszerzony

{ # block lambda with parameter 「$a」

  $_ = $^a; # declare parameter, and store it in 「$_」
            # ( the input is read-only by default )

  while $_ {
    # generate random number and sleep for that many seconds
    sleep my \t=(1..10).roll;

    put
      s/              # substitution on 「$_」 ( returns matched text )
        . ** { 0..t } # match at most 「t」 characters
      //              # replace it with nothing
  }
}
Brad Gilbert b2gills
źródło
1

Partia, 131 bajtów

@set/ps=
:l
@set/an=%random%%%10+1
@timeout/t>nul %n%
@call echo(%%s:~0,%n%%%
@call set s=%%s:~%n%%%
@if not "%s%"==2" goto l

Użycie set/pn=<nuldałoby lepszy efekt, z wyjątkiem tego, że przycina spacje.

Neil
źródło
1

Pyth, 16 bajtów

Wz.d_JhOT<zJ=>zJ

Możesz spróbować online , ale to nie działa dobrze, ponieważ interpreter online wyświetla wynik dopiero po zakończeniu programu.

Wyjaśnienie

Wz         While z (the input) is not empty:
     hOT   Get a random number between 1-10 (inclusive)
    J      Set the variable J to that number
 .d_       Sleep for that number of seconds
 <zJ       Get and implicitly print the first J characters of the input
  >zJ      Get all characters of z at and after index J
 =         Set z to that string
wstaw nazwę_tutaj
źródło
1

MATL , 19 bajtów

`10YrtY.ynhX<:&)wDt

Jak to działa

Wypróbuj online! Kompilator online stopniowo generuje wyniki z przerwami.

`         % Do...while loop
  10Yr    %   Random integer from 1 to 10
  tY.     %   Duplicate. Pause that many seconds
  y       %   Duplicate the second-top element. This is the remaining string; or it
          %   takes the input implicitly in the first iteration
  n       %   Number of elements
  hX<     %   Minimum of the number of elements and the random number
  :       %   Range from 1 to that
  &)      %   Apply as index. Push the substring as given by the index and the
          %   remaining substring
  w       %   Swap
  D       %   Display
  t       %   Duplicate the remaining substring. This is used as loop condition:
          %   if non-empty execute next iteration
          % End loop implicitly
Luis Mendo
źródło
1

BaCon , 93 bajty

Rozwiązanie w języku BASIC. Funkcja RANDOM () generuje liczbę od 0 do n-1, dlatego musimy użyć RANDOM (11), aby uzyskać liczbę od 0 do 10 włącznie.

INPUT s$
WHILE LEN(s$)>0
n=RANDOM(11)
SLEEP n*1000
?LEFT$(s$,n),SPC$(n);
s$=MID$(s$,n+1)
WEND

Przykładowa sesja, pierwszy wiersz to wejście, a drugie wyjście:

Hiccupinator!
Hiccupi       nato    r!
Piotr
źródło
2
Jeśli to, co mówisz, jest prawdą, to powinna być twoja losowa funkcja n=RANDOM(10)+1, twoja linia kodu wygeneruje liczbę od 0-10 włącznie, a nie 1-10
Octopus
1
@Octopus To nie ma znaczenia, ponieważ będzie spać na krótko i nie wytworzy w tym przypadku żadnych wyników.
Neil,
Naprawiłem literówkę w moim objaśnieniu.
Peter
1

Perl, 42 bajty

41 bajtów kodu + 1 dla -n.

$|=$-=--$-||sleep 1+rand 10,print for/./g

Musiałem zmusić Perla do wypłukania wyjścia, ponieważ na początku nic nie pokazywało do końca, stąd ustawienie $|. Używamy $-do śledzenia liczby znaków, printponieważ nie może to być ujemne (więc mogę użyć --$-i będzie falsy, gdy będzie puste) i to również floor, chociaż ponieważ używam zwrotusleep dla tego, to nie to naprawdę ważne.

Stosowanie

perl -ne '$|=$-=--$-||sleep 1+rand 10,print for/./g' <<< 'Hello, World!'
    Hell      o, Wor     ld!
# spaces showing delay!
Dom Hastings
źródło
0

Rubinowy, 56 bajtów

f=->s{n=sleep rand 1..10;print s.slice!0,n;f[s]if s!=""}

Rekurencyjna lambda. Zadzwoń jak f["Hello, World!"].

Conor O'Brien
źródło
0

> <> (Ryby) 103 88 bajtów

5>:?vl1-?!v+40.    >~
   1x2v   
>^  0  |:!/>:?!v1-b2.
^-1}< <     |~!/:?!^1-i:1+?!;of3.

Znaleziono tłumacza online!

Pierwsza próba rozwiązania tego problemu (nie gra w golfa).

Oczekuje pewną liczbę pętli (n), ponieważ ryba nie ma dostępnego timera (Wykonanie w tikach).

Edycja 1: Przeniesiono ostatni wiersz na górę (ostatnie 2 znaki i ponownie wykorzystano wartości początkowe. (Oszczędność 15 bajtów).

Pelikan turkusowy
źródło
0

Bash, 78 bajtów

Ponieważ nikt jeszcze nie opublikował rozwiązania Bash, oto jedno. Proste, ale wystarczająco małe.

Grał w golfa

H() { N=$(($RANDOM%10+1));sleep $N;echo ${1:0:$N};S=${1:$N};[ "$S" ] && H $S;}

Test

>H "It's the Hiccupinator"
It's the
Hiccupi
n
ator
zepelin
źródło
0

PHP, 81 bajtów

for(;''<$s=&$argv[1];$s=$f($s,$n))echo($f=substr)($s,0,sleep($n=rand(1,10))?:$n);

użyj jak:

php -r "for(;''<$s=&$argv[1];$s=$f($s,$n))echo($f=substr)($s,0,sleep($n=rand(1,10))?:$n);" "Hiccupinator!"
użytkownik59178
źródło
0

C ++ 14, 202 bajty

#import<thread>
void f(auto c){if(c.size()<1)return;int n=(uintptr_t(&c)%99)/10+1;std::this_thread::sleep_for(std::chrono::seconds(n));std::cout<<c.substr(0,n)<<std::endl;f(n<c.size()?c.substr(n):"");}

Wymaga danych wejściowych std::string

Niegolfowane i użytkowanie:

#include<iostream>
#include<string>

#import <thread>

void f(auto c){
  if (c.size() < 1) return;
  int n=(uintptr_t(&c) % 99) / 10 + 1;
  std::this_thread::sleep_for(std::chrono::seconds(n));
  std::cout << c.substr(0,n) << std::endl;
  f(n < c.size() ? c.substr(n) : "");
}

int main(){
  std::string s="abcdefghijklmnopqrstuvwxyz";
  f(s);
}
Karl Napf
źródło
using namespace std;Należy zapisać 5 bajtów z wszystkich tych std::s
Alfie Goodacre
@AlfieGoodacre 5 std::jest tylko w kodzie użytkowania, w golfowym jest tylko 4
Karl Napf
Ach, więc jest identyczny!
Alfie Goodacre,
0

C #, 205 bajtów

void X(string s){Random r=new Random();int n=r.Next(1,11);while(n<s.Length){Console.WriteLine(s.Substring(0,n));s.Remove(0,n);n*=1000;System.Threading.Thread.Sleep(n);n=r.Next(1,11);}Console.WriteLine(s);}

Jestem pewien, że można to zniszczyć, ale tak naprawdę wcale go nie zoptymalizowałem.

Bez golfa:

void X(string s)
{
    Random r = new Random();
    int n = r.Next(1,11);
    while(n < s.Length)
    {
        Console.WriteLine(s.Substring(0,n));
        s.Remove(0,n);
        n *= 1000;
        System.Threading.Thread.Sleep(n);
        n = r.Next(1,11);
    }
    Console.WriteLine(s);
}
Alfie Goodacre
źródło
0

PHP, 74 bajty

for($s=$argv[1];$s[$p+=$n]>"";print substr($s,$p,$n))sleep($n=rand(1,10));

Uruchom z php -r 'code' "string".

Tytus
źródło
0

C, 149 bajtów, nie testowano

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int f(char *s){int n;while(*s){sleep(n=rand()%10+1);for(;*s&&n--;s++)printf("%.*s",1,s);}}

uruchomić, dodaj

int main(){f("Programming Puzzles & CodeGolf");}

następnie skompiluj i uruchom

Tytus
źródło
0

Python 3, 99 znaków

i=input()
import os,time
while len(i):n=1+ord(os.urandom(1))%10;time.sleep(n);print(i[:n]);i=i[n:]
vpzomtrrfrt
źródło