Гікавка струни


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

Scratch, 16 блоків + 6 байт

Code

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


Чи можна це полегшити в будь-який спосіб?
OldBunny2800

Це невірний метод балів. Дивіться мета-пост .
mbomb007

Чи готові ви виправити це на основі консенсусу громади?
OldBunny2800

1
У мене немає Scratch. Це ваша відповідальність, оскільки ви опублікували відповідь. 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

Гарна відповідь BTW :-)
Луїс Мендо

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 ). Я відповідно зміню його.
Лміс

Також можна зберегти пару байтів, видаливши "| 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 не знає, з якого модуля потрібно імпортувати бібліотеки.
Erik the Outgolfer

Python 3 - на один байт довший. Вставте '(' між print та 'i' та a ')' перед дужкою
george

1
Пристосування цього до мініпі (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:])
FlipTack

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

Рішення в BASIC. Функція 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
Восьминіг

1
@Octopus Це не має значення, оскільки він буде спати без часу і не дасть результату в цьому випадку.
Ніл

Виправлена ​​помилка в моєму поясненні.
Петро

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

Рубін, 56 байт

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

Рекурсивна лямбда. Телефонуйте як f["Hello, World!"].


0

> <> (Риба) 103 88 Байт

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

Тут знайдено онлайн-перекладача!

Перша спроба цієї проблеми (не гольф).

Він чекає певної кількості циклів (n), оскільки риба не має доступного таймера (Виконання у галочках).

Редагувати 1: останній рядок переміщено вгору (останні 2 символи та повторно використані початкові значення. (Економія 15 байт).


0

Баш, 78 байт

Оскільки ще ніхто не опублікував рішення Bash, ось одне. Прямий, але досить малий.

Гольф

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

Потрібен вхід, щоб бути a std::string

Безголівки та використання:

#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

Ах так це ідентично!
Alfie Goodacre

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

Я впевнений, що це може бути знищено, я зовсім не оптимізував це, як є.

Без гольфу:

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

Пітон 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.