文字列をしゃっくり


16

あなたの挑戦は、文字列をしゃっくりするプログラムや関数を書くことです。文字列を入力として(標準的な方法を介して)受け取り、次の手順を実行します。

  1. 1〜10の(必ずしも均一ではない)ランダムな整数nを生成します。
  2. n秒待ちます。
  3. 入力の最初/次のn文字を印刷します。n文字未満の場合は入力の残りを印刷します。
  4. 印刷する入力が残っている場合は、手順1に戻ります。

ルール

  • 入力は常に、ASCII文字(32-126)のみを含む空でない文字列になります。
  • 待機時間は正確にn秒である必要はありませんが、nの 10%以内でなければなりません。
  • テキストのセクションが印刷されるたびに、末尾の改行を印刷できます。

ここのスペースは1秒を表します。入力がのHiccupinator!場合、出力は次のようになります。

   Hic     cupin a          tor!

得点

これはなので、バイト単位の最短コードが勝ちます。


コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
デニス

待機をサポートしない/時間の概念がない言語にスペースを使用できますか?
FliiFe

どの言語でも、@ FliiFeを出力せずに時間を過ごす方法があると思います!
オマー

回答:


9

スクラッチ、16ブロック+ 6バイト

コード

入力がすでに文字のリスト(["H","e","l","l","o"," ","W","o","r","l","d"])として定義されていると仮定します


これはどうにかすることができますか?
OldBunny2800

これは有効なスコアリング方法ではありません。メタ投稿を参照してください
mbomb007 16

コミュニティのコンセンサスに基づいて修正してもよいですか?
OldBunny2800 16

1
スクラッチがありません。あなたが答えを投稿したので、それはあなたの責任です。ScratchBlocks2には、プロジェクトからテキストコードを作成するジェネレーターも付属しています。
mbomb007 16

5

Pushy20 17 16または13バイト

許可される内容に応じて、2つの解決策があります。

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

@zeppelinのおかげで2バイト節約

n<<10 === 1024*nミリ秒単位で待機することにより、待機時間の10%の許容範囲を乱用します。

待機時間はnの 10%以内である必要があると言われたので、1バイトではなく、1秒ではなく999ミリ秒待機することにしました。

@ETHProductionsのおかげで、999ミリ秒の愚かさはもう必要ありません


1
うーん、新しいDate()%10が何らかの方法で「ランダム」にカウントされるかどうかはわかりません。
ツェッペリン

@zeppelinフェアポイント、標準定義によるとカウントされません。(meta.codegolf.stackexchange.com/a/1325/56071)。それに応じて変更します。
Lmis

「| 0」あなたも除去することで、バイトのペアを保存することができます
ツェッペリン

2
あなたはあまりにも3バイトで1000年を表現することができ、知っている:1e3;-)
ETHproductions

1
>(1 + 0.099999 * 10)* 999> 1997 True、ただし、* 999を<< 10で置き換えると、この問題を回避できます:(1 + 0.099999 * 10)<< 10 => 1024、(1 + 0.99999999 * 10)<< 10 => 10240
zeppelin

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:])

Flp.Tkcのおかげで-1バイト

私は確かにそこに短縮する方法ですよrandom.randinttime.sleep、しかし、from random,time import*動作しません...


1
from random,time import*Pythonはライブラリのインポート元のモジュールを認識していないため、機能しません。
エリックアウトゴルファー

Python 3は1バイト長くなります。挿入ブラケットの前に「(」「I」とプリントの間と「)」
ジョージ・

1
これをminipyに適合させる(Python 3):(while v1:n=ri(1,10);_i("time").sleep(n);p(v1[:n]);v1=v1[n:];コマンドライン引数から入力を
取得

この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

サンプルセッション、1行目は入力、2行目は出力:

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(私が使用できるように、これは負にすることはできませんとして--$-、それが空のとき、それはfalsyこと敷居でしょう)、それはまたfloor、私はのリターン使っていることからも、ねsleep、今、そのdoesnのを、このために本当に重要ではありません。

使用法

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

Bash、78バイト

まだ誰もBashソリューションを投稿していないので、ここに1つあります。簡単でありながら十分に小さい。

ゴルフ

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

ゴルフをしないと使用法:

#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;それらstd::のすべてから5バイトを保存する必要があります
アルフィーGoodacre

5 @AlfieGoodacre std::一つgolfedであり、唯一使用コードのみ4
カールのNaPF

ああ、それは同じです!
アルフィー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

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:]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.