Nấc một chuỗi


16

Thách thức của bạn là viết một chương trình hoặc chức năng nấc một chuỗi. Nó sẽ lấy một chuỗi làm đầu vào (thông qua bất kỳ phương thức tiêu chuẩn nào), sau đó làm theo các bước sau:

  1. Tạo một (không nhất thiết phải thống nhất) số nguyên ngẫu nhiên n trong khoảng từ 1 đến 10, bao gồm.
  2. Đợi n giây.
  3. In ký tự n ban đầu / tiếp theo của đầu vào hoặc phần còn lại của đầu vào nếu có ít hơn n ký tự.
  4. Nếu có đầu vào còn lại để in, quay lại bước 1.

Quy tắc

  • Đầu vào sẽ luôn là một chuỗi không trống chỉ chứa các ký tự ASCII (32-126).
  • Thời gian chờ không phải chính xác là n giây, nhưng nó phải nằm trong 10% của n .
  • Bạn có thể in một dòng mới sau mỗi lần một phần văn bản được in.

Thí dụ

Một không gian ở đây đại diện cho 1 giây. Nếu đầu vào là Hiccupinator!, một đầu ra có thể là:

   Hic     cupin a          tor!

Chấm điểm

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng .


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Dennis

Chúng ta có thể sử dụng không gian cho các ngôn ngữ không hỗ trợ chờ đợi / không có khái niệm về thời gian không?
FliiFe

Tôi cá là bất kỳ ngôn ngữ nào cũng có cách sử dụng thời gian mà không tạo ra đầu ra, @FliiFe!
Omar

Câu trả lời:


9

Cào, 16 khối + 6 byte

Mã

Giả sử đầu vào đã được xác định là danh sách các ký tự ( ["H","e","l","l","o"," ","W","o","r","l","d"])


Điều này có thể được đánh golf xuống trong bất kỳ cách nào?
OldBunny2800

Đây không phải là một phương pháp cho điểm hợp lệ. Xem bài viết meta .
mbomb007

Bạn có sẵn sàng sửa nó dựa trên sự đồng thuận của cộng đồng không?
OldBunny2800

1
Tôi không có Scratch. Đó là trách nhiệm của bạn, vì bạn đã đăng câu trả lời. ScratchBlocks2 thậm chí còn đi kèm với một trình tạo để tạo mã văn bản từ một dự án.
mbomb007

5

Pushy , 20 17 16 hoặc 13 byte

Tùy thuộc vào những gì được phép, có hai giải pháp.

16 byte:

@$LT1U&Wm:v;O"cI

Đưa ra các đối số trên dòng lệnh : $ pushy hiccup.pshy 'hiccupinator'. Bản in này có dòng mới sau mỗi 'tiếng nấc'. Đây là sự cố:

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

Trong khi mã hóa câu trả lời trên, tôi đã đưa ra giải pháp ngắn hơn đáng kể này:

N@$L1TU&Wm:'.

Mặc dù nó làm một điều tương tự, nhưng nó in trực tiếp ra khỏi chuỗi thay vì xây dựng một chuỗi mới, với ít byte hơn. Điều này đòi hỏiN ở phần đầu của chương trình để ngăn chặn các dòng mới, hoặc nếu không thì mỗi nhân vật sẽ ở trên một dòng mới.

Tuy nhiên, trong khi thử nghiệm, tôi nhận thấy một lỗi - stdout là bộ đệm dòng, vì vậy chương trình sẽ đợi toàn bộ chiều dài và sau đó hiển thị chuỗi bị trục trặc.

Tôi đã sửa lỗi này trong cam kết mới nhất bằng cách thêm một đơn giản.flush() - về mặt kỹ thuật không thêm tính năng mới vào ngôn ngữ, chỉ sửa một lỗi, nhưng tôi hiểu nếu bạn không tính đến câu trả lời này :)

Sự cố trông như thế này:

        % 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

Quy ước tại PPCG là các ngôn ngữ được xác định bởi việc triển khai (lỗi và tất cả). Vì cam kết hoãn thử thách, phần đó không có tính cạnh tranh
Luis Mendo

@LuisMendo ok, cảm ơn bạn đã làm rõ :)
FlipTack

Câu trả lời hay BTW :-)
Luis Mendo

4

Javascript (ES6) 91 89 byte

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

đã lưu 2 byte nhờ @zeppelin

Lạm dụng dung sai 10% trong thời gian chờ bằng cách đợi n<<10 === 1024*nmili giây.

Vì bạn nói rằng thời gian chờ cần trong vòng 10% n , tôi quyết định lưu một byte và chờ 999 mili giây thay vì 1 giây.

Tôi không cần độ sệt 999 mili giây nữa nhờ @ETH sản phẩm


1
Hmm, không chắc chắn nếu Ngày mới ()% 10 được tính cho "ngẫu nhiên" theo bất kỳ biện pháp nào.
zeppelin

@zeppelin Điểm công bằng, theo định nghĩa tiêu chuẩn, nó không được tính. ( meta.codegolf.stackexchange.com/a/1325/56071 ). Tôi sẽ thay đổi nó cho phù hợp.
Lmis

Bạn cũng có thể lưu một cặp byte, bằng cách xóa "| 0"
zeppelin

2
Bạn biết đấy, bạn cũng có thể biểu thị 1000 trong ba byte : 1e3;-)
ETHproductions

1
> (1 + 0,099999 * 10) * 999> 1997 Đúng, nhưng bạn có thể thay thế * 999 bằng << 10, để khắc phục điều này: (1 + 0,099999 * 10) << 10 => 1024, (1 + 0.99999999 * 10) << 10 => 10240
zeppelin

4

Python 2, 93 92 byte

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

-1 byte nhờ Flp.Tkc

Tôi chắc chắn có một cách để rút ngắn random.randinttime.sleep, nhưng from random,time import*không hoạt động ...


1
from random,time import*không hoạt động vì Python không biết bạn muốn nhập thư viện từ mô-đun nào.
Erik the Outgolfer

Python 3 dài hơn một byte. Chèn một '(' giữa bản in và 'i' và ')' trước dấu ngoặc
george

1
Thích ứng điều này với minipy (Python 3): while v1:n=ri(1,10);_i("time").sleep(n);p(v1[:n]);v1=v1[n:];(Lấy đầu vào từ dòng lệnh args)
Esolanging Fruit

Bạn có thể viết ngắn hơn 1 byte này dưới dạng hàm đệ quy : import random,time, sau đó là def F(s):dòng mớiif s:n=random.randint(1,10);time.sleep(n);print s[:n];F(s[n:])
FlipTack

3

Perl 6 , 62 byte

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

Mở rộng

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

Mẻ, 131 byte

@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

Việc sử dụng set/pn=<nulsẽ mang lại hiệu ứng đẹp hơn ngoại trừ việc nó cắt không gian.


1

Bình thường, 16 byte

Wz.d_JhOT<zJ=>zJ

Bạn có thể thử trực tuyến , nhưng nó không hoạt động tốt vì trình thông dịch trực tuyến chỉ hiển thị đầu ra sau khi chương trình kết thúc.

Giải trình

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 byte

`10YrtY.ynhX<:&)wDt

Làm thế nào nó hoạt động

Hãy thử trực tuyến! Trình biên dịch trực tuyến sẽ dần dần tạo ra các đầu ra với các tạm dừng.

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

Một giải pháp trong BASIC. Hàm RANDOM () tạo ra một số trong khoảng từ 0 đến n-1, do đó chúng ta phải sử dụng RANDOM (11) để có được một số từ 0 đến 10.

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

Phiên mẫu, dòng đầu tiên là đầu vào, thứ hai đầu ra:

Hiccupinator!
Hiccupi       nato    r!

2
Nếu những gì bạn nói là đúng thì chức năng ngẫu nhiên của bạn sẽ là n=RANDOM(10)+1, dòng mã của bạn sẽ tạo ra một số từ 0-10, không phải 1-10
Bạch tuộc

1
@Octopus Không thành vấn đề, vì nó sẽ ngủ không có thời gian và không tạo ra đầu ra trong trường hợp đó.
Neil

Đã sửa lỗi chính tả trong lời giải thích của tôi.
Peter

1

Perl, 42 byte

Mã 41 byte + 1 cho -n.

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

Tôi đã buộc Perl phải xả đầu ra vì nó không hiển thị bất cứ thứ gì cho đến khi kết thúc, do đó thiết lập $|. Chúng tôi sử dụng $-để theo dõi số lượng ký tự printvì điều này không thể âm (vì vậy tôi có thể sử dụng --$-và nó sẽ bị giả khi trống) và nó cũng vậy floor, mặc dù tôi đang sử dụng sự trở lại củasleep cho điều này bây giờ, doesn rằng thực sự quan trọng

Sử dụng

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

0

Ruby, 56 byte

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

Một lambda đệ quy. Gọi như thế f["Hello, World!"].


0

> <> (Cá) 103 88 byte

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

Thông dịch viên trực tuyến được tìm thấy ở đây!

Nỗ lực đầu tiên tại vấn đề này (không chơi gôn).

Nó chờ một số vòng lặp nhất định (n) vì cá không có bộ đếm thời gian có thể truy cập được (Thực hiện theo tích tắc).

Chỉnh sửa 1: Đã di chuyển dòng cuối cùng lên trên cùng (2 ký tự cuối cùng và sử dụng lại các giá trị bắt đầu. (Lưu 15 byte).


0

Bash, 78 byte

Như chưa có ai đăng một giải pháp Bash, đây là một giải pháp. Đơn giản, nhưng đủ nhỏ.

Chơi gôn

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

Kiểm tra

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

0

PHP, 81 byte

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

sử dụng như:

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 byte

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

Yêu cầu đầu vào phải là một std::string

Ungolfed và cách sử dụng:

#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;nên tiết kiệm 5 byte từ tất cả những std::s
Alfie Goodacre

@Alfieoodacre lần thứ 5 std::chỉ nằm trong mã sử dụng, trong sân golf chỉ có 4
Karl Napf

Ah, nó giống hệt nhau!
Alfie Goodacre

0

C #, 205 byte

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

Tôi chắc chắn rằng điều này có thể bị phá hủy, tôi chưa thực sự tối ưu hóa nó.

Chưa chơi gôn:

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 byte

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

Chạy với php -r 'code' "string".


0

C, 149 byte, không được kiểm tra

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

để chạy, thêm

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

sau đó biên dịch và thực thi


0

Python 3, 99 ký tự

i=input()
import os,time
while len(i):n=1+ord(os.urandom(1))%10;time.sleep(n);print(i[:n]);i=i[n:]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.