Bir ipte hıçkırık


16

Sizin meydan okuma, bir dize hıçkırık bir program veya işlev yazmaktır. Bir dizeyi girdi olarak almalıdır (herhangi bir standart yöntemle), ardından şu adımları izleyin:

  1. 1 ile 10 arasında ( tam olarak eşit olmayan) rasgele bir tamsayı n ( dahil) oluşturun.
  2. N saniye bekleyin .
  3. Girişin ilk / sonraki n karakterlerini veya n karakterden az varsa girişin geri kalanını yazdırın .
  4. Yazdırılacak sol giriş varsa, 1. adıma geri dönün.

kurallar

  • Giriş her zaman yalnızca ASCII karakterleri (32-126) içeren boş olmayan bir dize olacaktır.
  • Bekleme süresinin tam olarak n saniye olması gerekmez, ancak n'nin % 10'u içinde olmalıdır .
  • Bir metin bölümü her yazdırıldığında bir satırsonu yazdırabilirsiniz.

Misal

Buradaki bir boşluk 1 saniyeyi temsil eder. Giriş Hiccupinator!, bir çıkış olabilir:

   Hic     cupin a          tor!

puanlama

Bu , bu nedenle bayttaki en kısa kod kazanır .


Yorumlar uzun tartışmalar için değildir; bu görüşme sohbete taşındı .
Dennis

Beklemeyi desteklemeyen / zaman kavramı olmayan diller için boşluk kullanabilir miyiz?
FliiFe

Bahse girerim herhangi bir dil çıktı üretmeden vakit geçirmenin bir yolu vardır, @FliiFe!
Omar

Yanıtlar:


9

Çizik, 16 blok + 6 bayt

Code

Girdinin zaten bir karakter listesi ( ["H","e","l","l","o"," ","W","o","r","l","d"]) olarak tanımlandığını varsayar


Bu herhangi bir şekilde golf oynayabilir mi?
OldBunny2800

Bu geçerli bir puanlama yöntemi değil. Bkz. Meta yayın .
mbomb007

Topluluk konsensüsüne dayanarak düzeltmeye istekli misiniz?
OldBunny2800

1
Scratch'ım yok. Cevabı gönderdiğin için bu senin sorumluluğun. ScratchBlocks2 bile bir projeden metin kodu oluşturmak için bir jeneratör ile birlikte gelir.
mbomb007

5

Zorlayıcı , 20 17 16 veya 13 bayt

İzin verilenlere bağlı olarak iki çözüm vardır.

16 bayt:

@$LT1U&Wm:v;O"cI

Komut satırında argümanları verin: $ pushy hiccup.pshy 'hiccupinator'. Bu, her 'hıçkırıktan' sonra yeni satırlarla yazdırılır. İşte arıza:

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

Yukarıdaki cevabı kodlarken bu önemli ölçüde daha kısa çözümü buldum:

N@$L1TU&Wm:'.

Benzer bir şey yapsa da, daha az bayt için yeni bir dize oluşturmak yerine doğrudan dizeden yazdırır. Bu, Nyeni satır sonlarını önlemek için programın başlangıcını gerektirir , aksi takdirde her karakter yeni satırda olur.

Ancak, bunu test ederken bir hata fark ettim - stdoutsatır arabelleğe alınmış, bu yüzden program tam uzunlukta bekler ve sonra hiccuped dize görüntüler.

Ben basit bir ekleyerek son taahhütte bunu düzelttim .flush()- bu teknik olarak dile yeni bir özellik eklemiyor, sadece bir hatayı düzeltiyor, ama bu cevabı hesaba katmazsanız anlıyorum :)

Arıza şöyle görünür:

        % 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'deki sözleşme, dillerin uygulama tarafından tanımlandığıdır (hatalar ve hepsi). Taahhüt meydan okumayı ilan ettiğinden, bu bölüm rekabet
etmiyor

@LuisMendo tamam, açıklama için teşekkürler :)
FlipTack

Güzel cevap BTW :-)
Luis Mendo

4

Javascript (ES6) 91 89 Bayt

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 sayesinde 2 bayt tasarruf edildi

n<<10 === 1024*nMilisaniye bekleyerek bekleme süresi için% 10 toleransı kötüye kullanır .

Bekleme süresinin% 10 dahilinde olması gerektiğini söylediğinizden, n'nin söylediğiniz için, bir bayt kaydetmeye ve 1 saniye yerine 999 milisaniye beklemeye karar verdim.

@ETHProductions sayesinde artık 999 milisaniye silliliğe ihtiyacım yok


1
Hmm, yeni Date ()% 10 öğesinin herhangi bir önlemle "rasgele" sayılıp sayılmadığından emin değilim .
zeppelin

@zeppelin Adil nokta, standart tanıma göre sayılmaz. ( meta.codegolf.stackexchange.com/a/1325/56071 ). Ben buna göre değiştireceğim.
Lmis

"| 0" ı kaldırarak da bir çift bayt kaydedebilirsiniz
zeppelin

2
Bilirsiniz, 1000'i üç 1e3
baytta

1
> (1 + 0.099999 * 10) * 999> 1997 Doğru, ancak bu sorunu çözmek için * 999 değerini << 10 ile değiştirebilirsiniz: (1 + 0.099999 * 10) << 10 => 1024, (1 + 0.99999999 * 10) << 10 => 10240
zeplin

4

Python 2, 9392 bayt

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

Flp.Tkc sayesinde -1 bayt

Emin orada kısaltmak için bir yoldur değilim random.randintve time.sleepfakat from random,time import*çalışmıyor ...


1
from random,time import*Python kütüphaneleri hangi modülden almak istediğinizi bilmediği için çalışmıyor.
Outgolfer Erik

Python 3 bir bayt daha uzundur. Parantezin önüne baskı ile 'i' ve bir 'arasına' (') ekleyin
george

1
Bunu minipiye uyarlamak (Python 3): while v1:n=ri(1,10);_i("time").sleep(n);p(v1[:n]);v1=v1[n:];(Komut satırı argümanlarından girdi alır)
Esolanging Fruit

Bu 1 baytı daha kısa bir özyinelemeli işlev olarak yazabilirsiniz 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 bayt

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

Expanded

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

Toplu, 131 bayt

@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

Kullanımı set/pn=<nulboşlukları düzeltmesi dışında daha güzel bir etki yaratırdı.


1

Pyth, 16 bayt

Wz.d_JhOT<zJ=>zJ

Yapabilirsin çevrimiçi denemek , ancak program bittikten sonra, online tercüman sadece çıktısını görüntüler beri iyi çalışmaz.

açıklama

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 bayt

`10YrtY.ynhX<:&)wDt

Nasıl çalışır

Çevrimiçi deneyin! Online derleyici yavaş yavaş duraklamalarla çıktılar üretir.

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

BASIC'te bir çözüm. RANDOM () işlevi 0 ile n-1 arasında bir sayı üretir, bu nedenle 0 ile 10 arasında bir sayı elde etmek için RANDOM (11) kullanmamız gerekir.

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

Örnek oturum, ilk satır giriş, ikinci çıkış:

Hiccupinator!
Hiccupi       nato    r!

2
Eğer söylediğiniz doğruysa, rastgele fonksiyonunuz olmalıdır n=RANDOM(10)+1, kod satırınız 1-10 değil, 0-10 dahil bir sayı üretecektir
Octopus

1
@Optopus Önemli değil, çünkü hiçbir zaman uyumaz ve bu durumda çıktı üretmez.
Neil

Açıklamamdaki yazım hatası düzeltildi.
Peter

1

Perl, 42 bayt

İçin 41 bayt kodu + 1 -n.

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

Başlangıçta hiçbir şey göstermediği için Perl'i çıktıyı boşaltmaya zorlamak zorunda kaldım, bu yüzden ayar $|. $-Karakter sayısını izlemek için kullanıyoruz , printçünkü bu negatif olamaz (bu yüzden kullanabilirim --$-ve boş olduğunda falsy olacak) ve aynı zamanda floors, ancak bunun dönüşünü kullandığımdan beri sleep, bu değil gerçekten önemli değil.

kullanım

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

0

Yakut, 56 bayt

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

Özyinelemeli bir lambda. Gibi arayın f["Hello, World!"].


0

> <> (Balık) 103 88 Bayt

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

Çevrimiçi tercüman burada bulundu!

İlk sorun bu sorun (golf değil).

Balık erişilebilir bir zamanlayıcıya sahip olmadığından belirli bir sayıda döngü (n) bekler (Keneler halinde uygulama).

Düzenleme 1: Son satırı en üste taşıdı (son 2 karakter ve başlangıç ​​değerlerini yeniden kullandı. (15 baytlık tasarruf).


0

Bash, 78 bayt

Henüz kimse bir Bash çözümü göndermediğinden, işte bir tane. Basit, ama yeterince küçük.

golfed

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

Ölçek

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

0

PHP, 81 bayt

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

gibi kullanı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,220 bayt

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

Girişin bir std::string

Ungolfed ve kullanımı:

#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;tüm bu std::s 5 bayt kurtarmak gerekir
Alfie Goodacre

@AlfieGoodacre 5. std::kullanım kodunda sadece, golf olanda sadece 4 var
Karl Napf

Ah aynı!
Alfie Goodacre

0

C #, 205 bayt

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

Eminim bunun yok edilebileceği gibi, gerçekten durduğundan hiç optimize etmedim.

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 bayt

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

İle çalıştırın php -r 'code' "string".


0

C, 149 bayt, test edilmedi

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

koşmak, eklemek

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

sonra derle ve çalıştır


0

Python 3, 99 karakter

i=input()
import os,time
while len(i):n=1+ord(os.urandom(1))%10;time.sleep(n);print(i[:n]);i=i[n:]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.