Икнуть строку


16

Ваша задача - написать программу или функцию, которая работает со строкой. Он должен принять строку в качестве входных данных (с помощью любого стандартного метода), затем выполните следующие действия:

  1. Генерирует (не обязательно равномерно) случайное целое число n от 1 до 10 включительно.
  2. Подождите n секунд.
  3. Выведите начальный / следующий n символов ввода или оставшуюся часть ввода, если число символов меньше n .
  4. Если для печати еще есть ввод, вернитесь к шагу 1.

правила

  • Входными данными всегда будет непустая строка, содержащая только символы ASCII (32-126).
  • Время ожидания не обязательно должно быть ровно n секунд, но оно должно быть в пределах 10% от n .
  • Вы можете печатать завершающий символ новой строки каждый раз, когда печатается часть текста.

пример

Пробел здесь представляет 1 секунду. Если ввод Hiccupinator!, вывод может быть:

   Hic     cupin a          tor!

счет

Это , поэтому выигрывает самый короткий код в байтах .


Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат .
Деннис

Можем ли мы использовать пробелы для языков, которые не поддерживают ожидание / не имеют понятия времени?
FliiFe

Могу поспорить, что на любом языке есть способ провести время без вывода результатов, @FliiFe!
Омар

Ответы:


9

Царапина, 16 блоков + 6 байт

Код

Предполагается, что ввод уже определен как список символов ( ["H","e","l","l","o"," ","W","o","r","l","d"])


Можно ли это как-то обыграть?
OldBunny2800

Это недопустимый метод оценки. Смотрите мета пост .
mbomb007

Хотели бы вы исправить это на основе консенсуса сообщества?
OldBunny2800

1
У меня нет царапин. Это ваша ответственность, так как вы опубликовали ответ. ScratchBlocks2 даже поставляется с генератором для создания текстового кода из проекта.
mbomb007

5

Напористый , 20 17 16 или 13 байт

В зависимости от того, что разрешено, есть два решения.

16 байтов:

@$LT1U&Wm:v;O"cI

Дайте аргументы в командной строке: $ pushy hiccup.pshy 'hiccupinator'. Это печатает с последующими символами новой строки после каждого «сбоя». Вот разбивка:

                      % 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 байт:

При кодировании приведенного выше ответа я придумал это значительно более короткое решение:

N@$L1TU&Wm:'.

Хотя он выполняет аналогичные действия, он печатает непосредственно со строки, а не создает новую строку для меньшего количества байтов. Это требует, чтобы Nв начале программы предотвращался завершающий перевод новой строки, иначе каждый символ был бы на новой строке.

Однако во время тестирования я заметил ошибку - stdoutона буферизована строкой, поэтому программа будет ждать полной длины, а затем отображать перебитую строку.

Я исправил это в последнем коммите , добавив простой .flush()- это технически не добавление новой функции в язык, а просто исправление ошибки, но я понимаю, если вы не примете этот ответ во внимание :)

Разбивка выглядит так:

        % 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

В PPCG существует соглашение о том, что языки определяются реализацией (ошибки и все). Поскольку коммит выходит на задание, эта часть неконкурентоспособна
Луис Мендо

@ LuisMendo хорошо, спасибо за разъяснения :)
FlipTack

Хороший ответ Кстати :-)
Луис Мендо

4

Javascript (ES6) 91 89 байт

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!')                                       

сэкономили 2 байта благодаря @zeppelin

Злоупотребляет 10% -ным допуском для времени ожидания, ожидая n<<10 === 1024*nмиллисекунды.

Поскольку вы сказали, что время ожидания должно быть в пределах 10% от n , я решил сэкономить один байт и ждать 999 миллисекунд, а не 1 секунду.

Мне больше не нужны глупости 999 миллисекунд благодаря @ETHProductions


1
Хм, не уверен, что новая Дата ()% 10 считается "случайным" по какой-либо мере.
Цеппелин

@zeppelin Справедливая точка зрения, согласно стандартному определению, она не считается. ( meta.codegolf.stackexchange.com/a/1325/56071 ). Я изменю это соответственно.
Lmis

Вы также можете сохранить пару байтов, удалив «| 0»
zeppelin

2
Вы знаете, вы также можете выразить 1000 в трех байтах: 1e3;-)
ETHproductions

1
> (1 + 0.099999 * 10) * 999> 1997 Верно, но вы, вероятно, можете заменить * 999 на << 10, чтобы обойти это: (1 + 0.099999 * 10) << 10 => 1024, (1 + 0.99999999 * 10) << 10 => 10240
Цеппелин

4

Python 2, 93 92 байта

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

-1 байт благодаря Flp.Tkc

Я уверен, что есть способ сократить random.randintи time.sleep, но from random,time import*не работает ...


1
from random,time import*не работает, потому что Python не знает, из какого модуля вы хотите импортировать библиотеки.
Эрик Outgolfer

Python 3 на один байт длиннее. Вставьте '(' между печатными буквами и 'i' и a ')' перед скобкой
Джордж

1
Адаптация к minipy (Python 3): while v1:n=ri(1,10);_i("time").sleep(n);p(v1[:n]);v1=v1[n:];(принимает данные из аргументов командной строки)
Esolanging Fruit

Вы можете написать это на 1 байт короче как рекурсивную функцию:, import random,timeзатем def F(s):if s:n=random.randint(1,10);time.sleep(n);print s[:n];F(s[n:])
перевод

3

Perl 6 , 62 байта

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

расширенный

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

1

Пакет, 131 байт

@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

Использование set/pn=<nulдало бы более хороший эффект за исключением того, что оно урезало пробелы.


1

Pyth, 16 байт

Wz.d_JhOT<zJ=>zJ

Вы можете попробовать это онлайн , но это не работает, так как онлайн-переводчик отображает результаты только после завершения программы.

объяснение

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

1

MATL , 19 байт

`10YrtY.ynhX<:&)wDt

Как это устроено

Попробуйте онлайн! Онлайн-компилятор постепенно выводит результаты с паузами.

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

1

BaCon , 93 байта

Решение в бейсике. Функция RANDOM () генерирует число от 0 до n-1, поэтому мы должны использовать RANDOM (11), чтобы получить число от 0 до 10 включительно.

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

Пример сеанса, первая строка - вход, вторая - выход:

Hiccupinator!
Hiccupi       nato    r!

2
Если то, что вы говорите, истинно, тогда ваша случайная функция должна быть n=RANDOM(10)+1, ваша строка кода сгенерирует число от 0-10 включительно, а не 1-10
Octopus

1
@ Осьминог Это не имеет значения, так как он не будет спать в течение какого-то времени и в этом случае ничего не даст.
Нил

Исправлена ​​опечатка в моем объяснении.
Питер

1

Perl, 42 байта

41 байт код + 1 для -n.

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

Мне пришлось заставить Perl сбрасывать вывод, так как он сначала ничего не показывал до конца, а значит и настройки $|. Мы используем $-для отслеживания количество символов, printпоскольку это не может быть отрицательным (так что я могу использовать, --$-и это будет ложно, когда он пуст), и это также floors, хотя, поскольку я использую возврат sleepдля этого сейчас, это не это не имеет значения.

использование

perl -ne '$|=$-=--$-||sleep 1+rand 10,print for/./g' <<< 'Hello, World!'
    Hell      o, Wor     ld!
# spaces showing delay!


0

> <> (Рыба) 103 88 байт

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

Онлайн переводчик найден здесь!

Первая попытка этой проблемы (не игра в гольф).

Он ожидает определенное количество циклов (n), поскольку у рыбы нет таймера, который доступен (выполнение в тиках).

Редактировать 1: переместил последнюю строку вверх (последние 2 символа и повторно использовал начальные значения. (Сохранение 15 байт).


0

Баш, 78 байт

Поскольку никто еще не опубликовал решение Bash, вот оно. Просто, но все же достаточно мало.

Golfed

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

Тестовое задание

>H "It's the Hiccupinator"
It's the
Hiccupi
n
ator

0

PHP, 81 байт

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

использовать как:

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

0

C ++ 14, 202 байта

#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):"");}

Требует ввода, чтобы быть std::string

Ungolfed и использование:

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

using namespace std;должен спасти 5 байтов от всех этих std::s
Alfie Goodacre

@AlfieGoodacre 5-й std::только в коде использования, в гольфовом только 4
Karl Napf

Ах, так это идентично!
Алфи Гудэйк

0

C #, 205 байтов

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

Я уверен, что это может быть уничтожено, я действительно не оптимизировал это вообще, как оно есть.

Un-golfed:

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

0

PHP, 74 байта

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

Беги с php -r 'code' "string".


0

C, 149 байт, не проверено

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

запустить, добавить

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

затем скомпилируйте и выполните


0

Python 3, 99 символов

i=input()
import os,time
while len(i):n=1+ord(os.urandom(1))%10;time.sleep(n);print(i[:n]);i=i[n:]
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.