Crazy 8s Code Golf


34

intervalの間のすべての整数を印刷(a, b)し、シーケンスの8の倍数をランダム(均一に分布し、他の文字に依存しない)、非数値、非空白、印刷可能なASCII文字に置き換えるプログラムを作成します。

すべての場合で0 <a <bと仮定します。

数字に1桁以上ある場合は、置換する文字数が一致していることを確認してください!

例:

(1, 16) -> 1 2 3 4 5 6 7 $ 9 10 11 12 13 14 15 n@

(115, 123) -> 115, 116, 117, 118, 119, :F<, 121, 122, 123

(1, 3) -> 1 2 3

非例:

(1, 16) -> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

(115, 123) -> 115 116 117 118 119 $ 121 122 123

これはコードゴルフなので、バイト単位の最短コードが勝ちです!

現在の勝者:

パイク(21バイト)by muddyfish

最も人気のある:

Python 2(119バイト)byデニス


11
私のゴルフ言語で実装するためにすべての非常に長いものを組み合わせた挑戦をすることをおめでとう
ブルー

1
@muddyfish私はそれが挑戦であることを意味します;)
GracefulLemming

何かが欠けているかどうかはわかりませんが、ランダムな文字は一意である必要がありますか?入力された場合たとえば、16、16は、出力は可能性がAA?そうでない場合は、数字が85桁を超える場合はどうでしょう(正しくカウントしたと仮定して)。
FryAmTheEggman 16

@FryAmTheEggman各文字はほとんどがユニークである必要がありますが、「」と「」ランダムにOKですが、確率は非常に低いので、それがすべての場合に起こるはずのその連続して選択された場合
GracefulLemming

@FryAmTheEggmanと他の例のケース16、16は0または2つのランダムな文字を返しますが、aが常にb未満であるため、そのケースを心配する必要はありません
GracefulLemming

回答:


4

パイク、22 21バイト

h1:Fi8%!I`lV~Kl7T>Hs0

ここで試してみてください!

次の形式で入力を受け取ります:higherlower

h1:                   -  range(lower, higher+1, 1)
   F                  - for i in ^:
    i8%               -    i % 8 
       !              -   not ^
        I             -  if ^:
         `l           -    len(str(i))
           V          -   repeat V ^ times
            ~K        -        printable_ascii
              l7      -       ^.strip()
                T>    -      ^[10:]
                  H   -     random.choice(^)
                   s0 -    sum(^)

リストはすべて良いです!
グレースフル

これは興味深いです。8n、8nがエラーの原因となる最初のケースive
GracefulLemming

私の悪い私は出力を読み違える
GracefulLemming

11

Python 2、126バイト

オンラインでお試しください!

import random,string
def f(a,b):
 while b/a:print[a,eval('random.choice(string.printable[10:-6])+'*len(`a`)+"''")][a%8<1];a+=1

Flp.TkcとEasterlyIrkのすべての支援に感謝します!


2
b/a代わりに使用できますが、最後にa<=b必要はありません;。またimport random,string、数バイトを節約します。tio.run/nexus/...
デニス・

@Dennis、ありがとう、7バイトを取りました!
ヘザー


6

zsh、100 98バイト

for i in {$1..$2};{((i%8))&&<<<$i||<<<`yes 'shuf -e {!..~}|grep "[^0-9]"|head -c1'|head -$#i|zsh`}

2つの入力引数はコマンドライン引数として渡され、数値は別々の行に出力されます。

for i in {$1..$2};{   # loop through the range
((i%8))&&             # if the number is not divisible by 8 (i % 8 != 0),
<<<$i||               # output it
<<<`                  # otherwise, output the following:
yes '                 # using `yes' as a golfy loop
shuf -e {\!..\~}      # shuffle the range of printable ASCII (minus space)
|grep "[^0-9]"        # get rid of numbers
|head -c1'            # take the first character
|head -$#i            # obtain a string with that code repeated len(i) times... 
|zsh                  # ... and eval it
`}

なぜ8で割り切れる数値を出力しているのでしょうか?
グレースフル

1
@Caleb Whoops、それはタイプミスでした。「8で割り切れない」という意味でした。
ドアノブ

5

Mathematica、96バイト

Range@##/.a_?(8∣#&):>Join[33~(c=CharacterRange)~47,58~c~127]~RandomChoice~⌊Log10@a+1⌋<>""&

説明

入力mおよびn

Range@##

生成する {m, m + 1, m + 2, ... , n}

/.a_?(8∣#&):>

8で割り切れるすべての数値(それを呼び出すa)に対して、次の置換規則を適用します。

Join[33~(c=CharacterRange)~47,58~c~127]

数字を除くすべての印刷可能なASCII文字のリストを取得します。

... ~RandomChoice~⌊Log10@a+1⌋

Floor[Log10[a] + 1]リストから文字を擬似ランダムに選択して、重複を許可します。

<>""

キャラクターを結合します。


次を使用した96バイトの別のアプローチFromCharacterCode (r=Range)@##/.a_?(8∣#&):>FromCharacterCode[Join[33~r~47,58~r~127]~RandomChoice~⌊Log10@a+1⌋]<>""&
jaeyongが

5

R、73バイト

i=scan();x=i[1]:i[2];x[!x%%8]=sample(sapply(c(32:46,58:126),intToUtf8));x

stdinから入力を読み取り、8で割り切れる数値を、範囲内の一様に選択されたASCII文字のサンプルで置き換えます32...47, 58...126。ランダムサンプルを描画するには、文字のベクトルが必要です。残念ながら、ベクトルでintToUtf8()はなく1つの文字列を返すため、を使用して範囲全体でベクトル化する必要がありますsapply


5

Python 2、126バイト

(1つは単純にゴルフデニスを超えていません)

ヘザーの答えについて多くの仕事をしていたのを見て、私も自分の解決策を投稿すると思いました。

import random,string
def f(a,b):
 while b/a:print[a,eval('random.choice(string.printable[10:-6])+'*len(`a`)+"''")][a%8<1];a+=1

これは、2つの引数を取り、直接に出力する関数STDOUTです。

127バイト

import random,string
lambda a,b:[[x,eval('random.choice(string.printable[10:-6])+'*len(`x`)+`''`)][x%8<1]for x in range(a,b+1)]

これは名前のない匿名関数です-を使用して変数(などf)に割り当て、で呼び出しますf(a, b)。これは出力をリストとして返します。


これは間違っています。ランダムに選択された文字に数字が含まれていない場合があります。
デニス

Pヘッドアップしてくれてありがとう:私のスプライシングの考えに@Dennis大丈夫、バック
FlipTack

Python 2は人気のある候補のようです、大好きです!
グレースフルレミング

4

ピップ、28バイト

Fia,b+1Pi%8?i{RC@>PA@`\D`}Mi

コマンドライン引数として数値を受け取り、改行で区切られた結果のリストを出力します。オンラインでお試しください!

説明:

                              a,b are cmdline args; PA is string of all printable ASCII
Fia,b+1                       For i in range(a, b+1):
       P                       Print this:
        i%8?i                  If i%8 is truthy (nonzero), i; otherwise:
             {           }Mi   Map this function to the digits of i:
                @>PA           All but the first character of PA (removes space)
                    @`\D`      Find all regex matches of \D (nondigits)
              RC               Random choice from that list of characters
                               The map operation returns a list, which is concatenated
                               before printing

4

JavaScript(ES6)、114バイト

f=(x,y)=>(x+"").replace(/./g,d=>x%8?d:String.fromCharCode((q=Math.random()*84)+(q>15?43:33)))+(x<y?[,f(x+1,y)]:"")

O.textContent = f(1,200)
<pre id=O>

23バイトの名前を持つそれらのくまのビルトイン....


1
交換用の文字が非数値でなければなりません
LarsW

@LarsWどういうわけか、感謝することを逃した
ETHproductions

3

MATL、26バイト

&:"@8\?@}6Y24Y2X-Xz@VnT&Zr

オンラインでお試しください!

説明

&:        % Input a and b (implicit). Push range [a a+1 ... b]
"         % For each k in that range
  @       %   Push k
  8\      %   Modulo 8
  ?       %   If non-zero
    @     %     Push k
  }       %   Else
    6Y2   %     Push string of all printable ASCII chars
    4Y2   %     Push string '0123456789'
    X-    %     Set difference
    Xz    %     Remove space. Gives string of possible random chars
    @Vn   %     Push number of digits of k
    T&Zr  %     Random sample with replacement of that many chars from the string
          % End if, end for each, display (implicit)

すごいクール!いい答えだ。+1
ヘザー

@ヘザーありがとう!私はそれが...短くすることができ感じている
ルイスMendo

3

Pyth、24バイト

jm?%d8dsmO-r\~\ jkUT`d}F

オンラインでお試しください!

説明:

jm?%d8dsmO-r\~\ jkUT`d}FQ  # Auto-fill variables
                      }FQ  # Splat inclusive range on the input
 m?%d8d                    # Map over each number, if it isn't divisible by 8 return it
       smO          `d     # for each other number, select a character at random for
                             each of it's digits and then flatten into one string
           r\~\            # Printable ASCII excluding space
          -     jkUT       # Setwise difference with numeric values (remove numbers)
j                          # Join with newlines

3

バッシュ+ apg64、76バイト

編集:

  • 「8 8」の問題を修正し、+ 12バイトのランダムな文字のセットから数字を除外しました

ゴルフ

seq $1 $2|sed "$[(7&(8-$1%8))+1]~8s/.*/a=&;apg -a1 -n1 -Mcsl -m\${#a} -x0/e"

テスト

>./crazy8 8 8
$

>./crazy8 115 123
115
116
117
118
119
As_
121
122
123

>./crazy8 1 16
1
2
3
4
5
6
7
"
9
10
11
12
13
14
15
x!

簡単に説明していただけますか?また、何を見てイム好奇心crazy8 8 8もたらすであろう
GracefulLemming

@Calebは、実際にはそれだけで出力は以下となり、Aとして、8 8のために、私は今、修正に取り組ん、それを少しオーバーgolfedてきたようなルックスです。また、ランダムな文字列文字セットから数字を除外しません(私も見逃しました)。
ツェッペリン

2

Perl 6、60バイト

{map {$_%8??$_!!S:g/./{grep(/\D/,"!".."~").pick}/},$^a..$^b}

説明:

  • { map { }, $^a .. $^b }:2つの引数を取り、その範囲内の整数のリストを生成し、次の変換を各要素に適用して返すラムダ:
  • $_ % 8 ?? $_ !!:要素が8で割り切れない場合、変更せずに渡します。さもないと...
  • S:g/./{ }/:...文字列表現の各文字を、この式で生成された値に置き換えます。
  • grep(/\D/, "!" .. "~").pick!との間の文字の範囲を~(Unicode順で)生成し、数字を除外し、残りの文字の1つをランダムに選択します。

1

PHP、163バイト

$n=range(48,57);$c=array_diff(range(32,126),$n);
foreach(range($a,$b) as $v){if($v%8!=0){echo $v;}
else{for($i=0;$i<strlen($v);$i++){echo chr($c[array_rand($c)]);}}}

説明:

  • $n = range(48,57) これらは、特殊文字(32-47)およびその他の文字(58-126)の中間にある数字のASCIIコードです。
  • $c = array_diff(range(32,126), $n) を使用して $n配列、数字を除外し、受け入れ可能なASCII文字の配列を作成します。
  • foreach(range($a,$b) as $v)$a〜の値の範囲でループ$b(両端を含む)、ループ内の$ Vとして。
  • if($v % 8 != 0) { echo $v; } mod演算子を使用して8で割り切れる$ vをテストします %ます。
  • else { for($i = 0; $i < strlen($v); $i++) { ... }} 8で割り切れない場合は、数字の桁数に十分な回数ループして、文字を印刷します(次のステップで)。
  • echo chr($c[array_rand($c)])のASCII値の受け入れ可能な配列から単一の文字を出力し$cます。array_randは配列内のインデックスを返すため、を使用してそのインデックスの実際の値を取得する必要があります$c[random_key]

おそらく$c別の方法で作成することでこれを小さくすることができ、ASCII文字を印刷するループは不格好に感じるので、これを短くする方法を検討し続けます。


1
ジェイクありがとう!よろしくお願いします!時間があれば、私の新しいチャレンジRandom Pixel Pokingをご覧ください!
グレースフル

1

postgresql9.6 251文字

非常に長いコードですが、postgresqlも同様です。

do language plpgsql $$ begin for n in a..bloop raise info'%',case when 0=n%8then(select array_to_string(array(select*from(select chr(generate_series(33,126)))t where chr!~'\d'order by random()limit floor(log(n))+1),''))else n::text end;end loop;end;$$

フォーマットされたSQLはこちらです:

do language plpgsql $$
begin
for n in a..b loop
    raise info '%',
    case when 0 = n % 8 then (
        select array_to_string(array(select * from (
            select chr(generate_series(33, 126))
        ) t where chr !~ '\d' order by random() limit floor(log(n)) + 1), '')
    ) else n::text
    end;
end loop;
end;
$$

1

Perl、66バイト

map{$_%8||s%.%do{$_=chr rand 126}until/[!-\/:-~]/;$_%ge;say}<>..<>

-Eフラグ付きで実行:

perl -E 'map{$_%8||s%.%do{$_=chr rand 126}until/[!-\/:-~]/;$_%ge;say}<>..<>' <<< "8
16"

これは非常に単純です:
- <>..<>2つの入力の数との間の番号のリストを作成します。そして、mapその上に反復処理:
- $_%8||......場合にのみ実行されている$_8の倍数である
- s%.%xxx%ge:ですべての文字に置き換えますxxx
- do{$_=chr rand 126}until/[!-\/:-~]/を満たす文字が見つかるまで、ランダムな文字(コード0〜126)を選択します/[!-\/:-~]/。印刷可能であり、数字ではないもの。
- say:印刷します。


1

C(gcc)129 119バイト

s(a,r){a&&s(!isdigit(r=rand()%94+33)?putchar(r),a/10:a,0);}f(a,b){b>a&&f(a,b-1);b%8?printf("%d",b):s(b,0);printf(" ");}

オンラインでお試しください!

129→119 OOBalance%94+33トリックを使用する

ゴルフをしていない:

s(a,r){
    a&&                                  // Loop recursively on a!=0
    s(!isdigit(r=rand()%94+33)           // Test random selection
      ?putchar(r),a/10                   // Print and reduce a
      :a                                 // Retry random selection
      ,0);                               // Second arg, recurse
}
f(a,b){
    b>a&&                                // Loop recursively on b>a
    f(a,b-1);                            // Reduce b, recurse
    b%8?printf("%d",b)                   // Print non 8's
       :s(b,0);                          // Call s() for 8's
    printf(" ");                         // Space separator
}

putsではなくprintf)改行セパレーターに変更すると、3バイト節約できます。
OOBalance

ソリューションで遊ぶのはもっと楽しいです:-)
jxh

1

C、157 115バイト

f(a,b){b-a&&f(a,b-1);if(b%8)printf("%d",b);else for(;b;b/=10){while(isdigit(a=rand()%94+33));putchar(a);}puts("");}

こちらからオンラインでお試しください。ゴルフ42バイトのjxhに感謝します。

ゴルフされていないバージョン:

f(a, b) { // recursive function, parameters are implicitly int
    b-a && f(a, b-1); // recurse until a = b
    if(b % 8)            // if the number is a multiple of 8
        printf("%d", b); // simply print it
    else for(; b; b /= 10) { // while b > 0, lop off the last digit
        while(isdigit(a = rand() % 94 + 33)); // generate random characters in ASCII range [33, 127] until one is non-numeric
        putchar(a); // print the character
    }
    puts(""); // print a newline
}

この会話はチャット継続できます。
DJMcMayhem

1

Java 10、149 147バイト(ラムダ関数)

b->a->{var r="";for(;a<=b;r+=" ",a++)for(var c:(a+"").split("")){char t=0;for(;t<33|t>126|t>47&t<59;t*=Math.random())t=127;r+=a%8<1?t:c;}return r;}

オンラインでお試しください。

Java 10、227 225バイト(フルプログラム)

interface M{static void main(String[]A){var r="";for(var a=new Long(A[0]);a<=new Long(A[1]);r+=" ",a++)for(var c:(a+"").split("")){char t=0;for(;t<33|t>126|t>47&t<59;t*=Math.random())t=127;r+=a%8<1?t:c;}System.out.print(r);}}

オンラインでお試しください。

説明:

b->a->{          // Method with two integer parameters and String return-type
  var r="";      //  Result-String, starting empty
  for(;a<=b      //  Loop as long as `a` is smaller than or equal to `b`
      ;          //    After every iteration:
       r+=" ",   //     Append a space to the result-String
       a++)      //     And increase `a` by 1
    for(var c:(a+"").split("")){
                 //   Inner loop over the characters of the current number
      char t=0;  //    Random-char, starting at 0
      for(;t<33|t>126|t>47&t<59;
                 //    Loop until `t` is a non-digit printable ASCII char
          t*=Math.random())t=127;
                 //     Set `t` to a random character with a unicode in the range [0,127)
      r+=a%8<1?  //   If the current `a` is divisible by 8:
          t      //    Append the random character
         :       //   Else:
          c;}    //    Append the digit instead
  return r;}     //  Return the result

range [0,127] does not conform to spec: "non-numeric, non-whitespace, printable ASCII"
O.O.Balance

@OOBalanceおそらく私のコメントはあまり説明されていないかもしれませんが、それはそのt<33|(t>47&t<59)|t>126;上にあるのです。基本的に、範囲内[0,127)で乱数を生成し、それが有効かどうかをチェックします(範囲内では[33..47,59..126]、すべての印刷可能な非数字のASCII文字)。場合:良い、追加します。そうでない場合:範囲内で乱数を[0,127)再度生成し、有効な文字が見つかるまで再度検証します。
ケビンCruijssen

いいえ、あなたのコメントは素晴らしいと思います。私の悪い:)
OOBalance

1

APL(Dyalog Extended)、32バイト

{(?84¨⍕⍵)⊇⎕D~⍨'!''~'}¨@{0=8|⍵}…

オンラインでお試しください!

Adámdzaima多大な感謝を for their help. First time using Dyalog Extended!

説明:

{(?84¨⍕⍵)⊇⎕D~⍨'!''~'}¨@{0=8|⍵}…   Dyadic 2-train

                                  Tacit range: list of numbers from left arg 
                                   to right arg inclusive
{(?84¨⍕⍵)⊇⎕D~⍨'!''~'}¨@{0=8|⍵}    Monadic function applied to above          
                        {     }    Function definition
                           8|⍵     8 modulo every item in our range
                         0=        Transform list into a boolean vector, with
                                   1 where item was equal to zero, 0 otherwise
                      ¨@           Applies left function to each item selected
                                   by above
{                    }             Function definition
              '!''~'              Range of all printable ASCII chars
          D~⍨                     Remove numeric characters from above
 (    ⍕⍵)                          Convert function argument to string
                                   (e.g., 123 -> "123")
   84¨                             For each character, replace with number 84
                                   (number of non-numeric printable ASCII chars)
  ?                                Generate random number from 1-84 for each
                                   84 in list
                                  Index the ASCII char list with above random
                                   numbers

1

Scala, 198 bytes

An improved functional version with immutable state (03-04-2018)

  def S(a: Int, b: Int)={
    val c=(33 to 47)++(58 to 126)
    val r = (a to b).toStream.map {case x if x%8==0=>c(Random.nextInt(c.length)).toChar.toString
      case x => String.valueOf(x)}
    r}

Try it online!

A functional style solution in Scala (350 bytes) for the fun of it.

def r(a:Int, b:Int)={
    var l=(33 to 47).toList:::(58 to 126).toList
    l=Random.shuffle(l)
    var x=ListBuffer[String]()
    var k=0
    (a to b).toList.foreach{e=>{
         if(k==l.length){k=0
         l=Random.shuffle(l)}
         if (e.toInt%8==0){x+=l(k).toChar.toString
           k+=1}
         else{x+=e.toString
             k+=1}}}
    x}

Suggestions for improvements are welcomed.


1
Here on code golf se we only allow answers which have been at least attempted to be golfed. This means 1 character variable names and removal of spaces android adding a byte count to your answer
Blue

@muddyfish ok i golfed my code, how is android adding the byte count ?
firephil

It seems fine to me right now
Blue

0

Python 2, 180 Bytes

from random import*
def f(a,b):
 for i in range(a,b+1):
  if i%8<1:
   k,i=str(i),''
   for _ in k:i+=choice([chr(j)for j in range(33,48)]+[chr(j)for j in range(57,126)])
  print i

EDIT:

Thanks @Flp.Tkc for realising I hadn't read the task properly.

Thanks @Caleb for pointing out I could use a few to reduce the byte count.

Thanks @Dennis for pointing out about the fact that numbers can't be included.

EDIT 2:

The current version could probably be simplified more than it is.


0

PowerShell, 82 89 bytes

$a,$b=$args;$a..$b|%{($_,(-join[char[]](33..47+58..127|random -c "$_".Length)))[!($_%8)]}

Try it online!


1
58..127 does not include the printable ASCII symbols in the lower range 33 (!) to 47 (/).
zeppelin

@zeppelin true, I didn't think that was a requirement, but re-reading it, I suppose it must be if it's to be a uniform distribution. Updated!
briantist

0

QBIC, 79 bytes

::[a,b|~c%8=0|[_l!c$||_R33,116|~e>47 and e<58|e=e+z]Z=Z+chr$(e)]\Z=Z+!c$]Z=Z+@ 

Skipping the numbers is a costly affair, here's a version that might also randomly select 0-9 for 20 bytes less:

::[a,b|~c%8=0|[len(!c$)|Z=Z+chr$(_r33,126|)]\Z=Z+!c$]Z=Z+@ 

Sample output for 1, 89

1 2 3 4 5 6 7 U 9 10 11 12 13 14 15 M9 17 18 19 20 21 22 23 ^L 25 26 27 28 29 30 
31 <U 33 34 35 36 37 38 39 gH 41 42 43 44 45 46 47 aJ 49 50 51 52 53 54 55 1b 57 58 59 60 
61 62 63 ,C 65 66 67 68 69 70 71 ]; 73 74 75 76 77 78 79 [B 81 82 83 84 85 86 87 Ix 89 

Explanation:

::        Get inputs 'a' and 'b' from the command line
[a,b|     FOR(c=a; c<=b; c++)
~c%8=0|   IF c is cleanly divisible by 8 THEN
 _l!c$|   Take the length (_l) of the string representation (! ... $) of c 
[      |  FOR (d = 1; d<= length(c); d++)
_R33,116| Set e to a random value in the range 33 - 116 (all the printable ascii's - 10)
~e>47     IF e falls between 47
and e<58| and 58 (ASCII code for 0-9) THEN 
e=e+z     e = e + 10 (z == 10 in QBIC)
]         END IF
Z=Z+      Add to Z$
chr$(e)]  ASCII character e
\         ELSE if c is not cleanly divisible by 8
Z=Z+!c$   Add to Z the string representation of c
]         NEXT
Z=Z+@     Add a space to Z$ (@ is an implicitly delimited string literal with 1 significant space)

( Z$ is implicitly printed at end of program )

0

05AB1E, 17 bytes

ŸεD8ÖižQžhK¦.rsg£

Takes the input as highest\nlowest, and outputs a list.

Try it online or verify all test cases.

Explanation:

Ÿ                  # Create a list in the range [low (implicit) input, high (implicit) input]
 ε                 # Map each value to:
  D                #  Duplicate the value
   8Öi             #  If it's divisible by 8:
      žQ           #   Push all printable ASCII characters (" " through "~")
        žhK        #   Remove all digits
           ¦       #   Remove the first character (the space)
            .r     #   Randomly shuffle the remaining characters
              s    #   Swap to take the map value again
               g   #   Get its length
                £  #   And leave that many characters from the string
                   # (and implicitly output the resulting list after we're done mapping)

0

Japt, 20 bytes

;òV ®%8?Z:EÅk9ò)öZìl

Try it

;òV ®%8?Z:EÅk9ò)öZìl     :Implicit input of integers U & V
 òV                      :Range [U,V]
    ®                    :Map each Z
     %8                  :  Modulo 8
       ?Z:               :  If truthy, return Z, else
;         E              :  Printable ASCII
           Å             :  Slice off first character
            k            :  Remove
             9ò          :    Range [0,9]
               )         :  End remove
                 Zì      :  Digit array of Z
                   l     :  Length
               ö         :  Get that many random characters from the string

0

Forth (gforth), 128 bytes

include random.fs
: f 1+ swap do i 8 mod if i . else i 0 <# #s #> 0 do 83 random 33 + dup 47 > 10 * - emit loop ."  "then loop ;

Try it online!

Explanation

Loop from start to end, print number if not multiple of 8, otherwise get the number of digits in the number and print that many random characters followed by a space

Code Explanation

include random.fs          \ include/import the random module
: f                        \ start new word definition
  1+ swap                  \ add 1 to end number, because forth loops are [start, end), and swap order
  do                       \ start counted loop form start to end
    i 8 mod                \ get the remainder of dividing i (loop index) by 8
    if                     \ if true (not 0, therefore not multiple of 8)
      i .                  \ print the index
    else                   \ otherwise
      i 0                  \ convert index to double-length number
      <# #s #>             \ use formatted numeric output to convert number to a string
      0 do                 \ loop from 0 to (string-length - 1)
        84 random          \ get random number between 0 and 83
        33 +               \ add 33
        dup 47 >           \ check if result is larger than 47
        10 * -             \ if it is add 10 to result (results in number in range: 33-47,58-126)
        emit               \ output ascii char corresponding with number
      loop                 \ end inner loop
    ."  "then            \ output a space and then close the if/else
  loop                   \ end the outer loop
;                        \ end the word definition

UnGolfed

I don't usually ungolf my solutions, but this one is long/complicated enough that I think it's needed

include random.fs

\ get the length (in digits) of a number
: num-length 0 <# #s #> nip ;

\ check if a number is a multiple of another
: is-multiple mod 0= ;               

\ get a random printable non-digit ascii char           
: random-char 84 random 33 + dup 47 > 10 * - ;  

\ get a "random" string of printable ascii chars the same length as a number
: rand-str num-length 0 do random-char emit loop space ;

\ print numbers from a to b, replacing multiple of 8 with a random ascii string of the same length
: crazy-eights 1+ swap do i 8 is-multiple if i rand-str else i . then loop ;

0

PHP, 130 bytes

function($a,$b){for(;$a<=$b;$a++)echo$a%8?$a:(function($l){while($l--)echo chr(($x=rand(44,128))-($x>58?:11));})(strlen($a))," ";}

Try it online!

Ungolfed:

function c8( $a, $b ) { 
    for( ; $a<=$b; $a++ ) {                // loop between a -> b
        echo $a % 8 ? $a :                 // every 8, call anon func instead of value
            (function($l) {
                while( $l-- ) {            // repeat length of value
                    $x = rand( 44, 128 );  // range size is printable chars [33,47][58,127]
                    $x-= $x > 58 ?: 11;    // Subtract one from x. If x was less than or 
                                           // equal to 58, subtract a further ten from it
                                           // so that it now falls within the 33-47 range
                    echo chr( $x );        // echo ASCII value
                }
            })( strlen( $a ) )," ";
    }
}

Yes, my mistake. Regarding $x-= $x > 58 ?: 11; // subtract 11, if x is less than 58 -- could you elaborate?
Jonathan Frech

@JonathanFrech in other words we want a number that's between 33-47 or 58-127. So we pick a number that's 58 minus the size of the lower range. If the number is below 58 it's just translated down to the lower range by subtracting the difference. Because of course we can't display numbers (ASCII char 48-57)
640KB

The ternary is just a shortcut to doing it. Basically $x > 58 evaluates to 1, and so we either subtract that or 11 from $x. In the case where it's higher, it's offset by the ASCII values in the rand() statement being one higher. You can see that this generates a uniformly random (as uniform as PHP's rand() is capable of) distribution: tio.run/…
640KB

I think I know roughly what the Elvis operator does, I just think your comment is misleading.
Jonathan Frech

I would think it works like Subtract one from x. If x was less than or equal to 58, subtract a further ten from it., no?
Jonathan Frech

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