Crazy 8s Code Golf


34

Buat program yang mencetak semua bilangan bulat secara inklusif antara interval (a, b), dan mengganti kelipatan 8 dalam urutan dengan acak (terdistribusi secara seragam, tidak tergantung pada karakter lain), karakter ASCII non-numerik, non-spasi putih, dapat dicetak.

Asumsikan 0 <a <b dalam semua kasus.

Jika jumlahnya memiliki lebih dari 1 digit, pastikan jumlah karakter dalam pertandingan yang cocok!

Contoh:

(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

Non-Contoh:

(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

Ini kode golf, jadi kode terpendek dalam byte menang!

Pemenang saat ini:

Pyke (21 bytes) oleh muddyfish

Paling Populer:

Python 2 (119 byte) oleh Dennis


11
Selamat membuat tantangan yang menggabungkan semua hal super panjang untuk diimplementasikan dalam bahasa golf saya
Blue

1
@muddyfish maksud saya ini adalah tantangan;)
GracefulLemming

Saya tidak yakin apakah saya melewatkan sesuatu, tetapi haruskah karakter acak itu unik atau tidak? Misalnya jika inputnya 16, 16 maka mungkinkah outputnya aa ? Jika bukan ini masalahnya, bagaimana jika angkanya lebih dari 85 digit (dengan asumsi saya menghitung dengan benar)?
FryAmTheEggman

@FryAmTheEggman setiap karakter harus unik kebanyakan tetapi jika "a" dan "a" dipilih secara acak secara berurutan itu ok, tapi itu tidak boleh terjadi dalam semua kasus karena probabilitasnya sangat rendah
GracefulLemming

@FryAmTheEggman dan kasing 16, 16 di contoh lain baik mengembalikan 0 atau 2 karakter acak tetapi jangan khawatir tentang kasing karena akan selalu benar-benar ketat kurang dari b
GracefulLemming

Jawaban:


4

Pyke, 22 21 byte

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

Coba di sini!

Mengambil input dalam bentuk: higher,lower

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(^)

Daftar semuanya baik!
GracefulLemming

Ini menarik, ive kasus pertama terlihat di mana 8n, 8n menyebabkan kesalahan
GracefulLemming

salah saya, saya salah membaca output
GracefulLemming

11

Python 2, 126 byte

Cobalah online!

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

Terima kasih banyak kepada Flp.Tkc dan EasterlyIrk atas semua bantuan mereka!


2
Anda dapat menggunakan b/asebagai gantinya a<=bdan Anda tidak membutuhkannya ;di akhir. Juga import random,stringmenghemat beberapa byte. tio.run/nexus/…
Dennis

@ Dennis, terima kasih, yang lepas landas 7 byte!
heather


6

zsh, 100 98 byte

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

Dua argumen input dilewatkan sebagai argumen baris perintah, dan angka-angka tersebut dikeluarkan pada baris yang berbeda.

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
`}

Bolehkah saya bertanya mengapa Anda menghasilkan angka yang dapat dibagi 8?
GracefulLemming

1
@ Caleb Whoops, itu salah ketik. Itu dimaksudkan untuk membaca " tidak habis dibagi 8."
Gagang Pintu

5

Mathematica, 96 byte

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

Penjelasan

Untuk input mdan n:

Range@##

Menghasilkan {m, m + 1, m + 2, ... , n}

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

Untuk semua nomor yang dapat dibagi 8 (sebutkan itu a), terapkan aturan penggantian ini:

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

Dapatkan daftar semua karakter ASCII yang dapat dicetak, kecuali digit.

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

Pseudo-acak memilih Floor[Log10[a] + 1]karakter dari daftar, memungkinkan duplikat.

<>""

Bergabunglah dengan karakter.


pendekatan lain untuk 96 byte menggunakanFromCharacterCode (r=Range)@##/.a_?(8∣#&):>FromCharacterCode[Join[33~r~47,58~r~127]~RandomChoice~⌊Log10@a+1⌋]<>""&
jaeyong dinyanyikan

5

R, 73 byte

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

Membaca input dari stdin dan menggantikan angka yang dapat dibagi 8dengan sampel karakter ascii yang dipilih secara seragam dalam rentang 32...47, 58...126. Untuk menggambar sampel acak, kita membutuhkan vektor karakter, sayangnya intToUtf8()mengembalikan satu string daripada vektor sehingga kita juga harus membuat vektor pada rentang menggunakan sapply.


5

Python 2, 126 byte

(Seseorang tidak hanya mengalahkan Dennis)

Melihat saya melakukan banyak pekerjaan pada jawaban heather, saya pikir saya akan memposting solusi saya sendiri juga.

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

Ini adalah fungsi yang mengambil dua argumen dan mencetak langsung ke STDOUT.

127 byte

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

Ini adalah fungsi anonim tanpa nama - untuk menggunakan, menetapkan ke variabel (seperti f), dan kemudian memanggil dengan f(a, b). Ini mengembalikan output sebagai daftar.


Ini salah. Karakter yang dipilih secara acak mungkin tidak mengandung digit.
Dennis

@Dennis baik-baik saja, kembali ke ide splicing saya: P Terima kasih untuk kepala
FlipTack

Python 2 tampaknya menjadi pesaing populer, saya menyukainya!
GracefulLemming

4

Pip , 28 byte

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

Mengambil angka sebagai argumen baris perintah dan mencetak daftar hasil baris baru. Cobalah online!

Penjelasan:

                              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 byte

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>

Mereka sangat built-in dengan nama 23-byte ....


1
Karakter pengganti harus non-numerik
LarsW

@ LarsW Entah bagaimana melewatkannya, terima kasih
ETHproduk

3

MATL , 26 byte

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

Cobalah online!

Penjelasan

&:        % 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)

Wow Keren! Jawaban bagus. +1
heather

@ heather, terima kasih! Saya punya perasaan itu bisa dibuat lebih pendek ...
Luis Mendo

3

Pyth , 24 byte

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

Cobalah online!

Penjelasan:

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

Bash + apg ,64, 76 byte

EDIT:

  • Memperbaiki masalah "8 8", mengecualikan karakter numerik dari serangkaian karakter acak, +12 byte

Golf

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

Uji

>./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!

Bisakah Anda memberi jalan singkat? Saya juga penasaran untuk melihat apa yang crazy8 8 8akan dihasilkan
GracefulLemming

@Caleb, sebenarnya itu hanya akan keluaran sebuah seperti, selama 8 8, terlihat seperti saya sudah over-golfed sedikit, bekerja pada memperbaiki sekarang. Ini juga tidak memfilter digit dari set karakter string acak (saya juga melewatkannya).
zeppelin

2

Perl 6 , 60 byte

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

Penjelasan:

  • { map { }, $^a .. $^b }: Sebuah lambda yang mengambil dua argumen, menghasilkan daftar bilangan bulat dalam rentang itu, dan mengembalikannya dengan transformasi berikut yang diterapkan ke setiap elemen:
  • $_ % 8 ?? $_ !!: Jika elemen tidak habis dibagi 8, bagikan tidak berubah. Jika tidak...
  • S:g/./{ }/: ... ganti setiap karakter dari representasi stringnya dengan nilai yang dihasilkan oleh ungkapan ini:
  • grep(/\D/, "!" .. "~").pick: Hasilkan kisaran karakter antara !dan ~(dalam urutan Unicode), filter keluar angka, dan pilih salah satu karakter yang tersisa secara acak.

1

PHP, 163 byte

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

Penjelasan:

  • $n = range(48,57) Ini adalah kode ASCII untuk angka, yang berada di tengah karakter khusus (32-47) dan karakter lainnya (58-126).
  • $c = array_diff(range(32,126), $n)Dengan menggunakan $nlarik, kecualikan karakter numerik dan buat larik karakter ASCII yang dapat diterima.
  • foreach(range($a,$b) as $v)Ulangi rentang nilai dari $ahingga $b(inklusif), sebagai $ v di dalam loop.
  • if($v % 8 != 0) { echo $v; }Tes untuk $ v yang dapat habis dibagi dengan 8 menggunakan operator mod %.
  • else { for($i = 0; $i < strlen($v); $i++) { ... }} Jika tidak habis dibagi 8, berulang kali cukup untuk jumlah digit dalam angka dan cetak karakter (pada langkah berikutnya).
  • echo chr($c[array_rand($c)])Cetak satu karakter dari larik nilai ASCII yang dapat diterima di $c. array_randmengembalikan indeks dalam array, jadi kita harus mendapatkan nilai aktual menggunakan indeks itu $c[random_key].

Saya mungkin bisa membuat ini lebih kecil dengan membuat $cberbeda, dan loop untuk mencetak karakter ASCII terasa kikuk jadi saya akan terus merenungkan bagaimana mempersingkat itu.


1
Jake terima kasih! Senang mendengar dari Anda! Lihatlah tantangan baru saya Pixel Poking Acak jika Anda punya waktu juga!
GracefulLemming

1

postgresql9.6 251 karakter

kode yang sangat panjang tetapi postgresql juga melakukannya.

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 yang diformat ada di sini:

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 byte

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

Jalankan dengan -Ebendera:

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

Ini cukup mudah:
- <>..<>membuat daftar angka antara 2 input angka. Dan kemudian mapberalih di atasnya:
- $_%8||...: ...dijalankan hanya jika $_merupakan kelipatan dari 8.
- s%.%xxx%ge: ganti setiap karakter dengan xxx.
- do{$_=chr rand 126}until/[!-\/:-~]/pilih karakter acak (dari kode 0 hingga 126) sampai kita mendapatkan satu yang memuaskan /[!-\/:-~]/, yaitu. yang dapat dicetak dan bukan angka.
- say: cetak


1

C (gcc) , 129 119 byte

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

Cobalah online!

129 → 119 Gunakan %94+33trik dari OOBalance

Tidak Disatukan:

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
}

Anda dapat menyimpan 3 byte jika Anda mengubah ke pemisah baris baru ( putsbukan printf).
OOBalance

Lebih menyenangkan untuk bermain dengan solusi Anda :-)
jxh

1

C, 157 115 byte

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

Cobalah online sini . Berkat jxh untuk bermain golf 42 byte.

Versi tidak disatukan:

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
}

Percakapan ini dapat dilanjutkan dalam obrolan .
DJMcMayhem

1

Java 10, 149 147 byte (fungsi lambda)

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

Cobalah online.

Java 10, 227 225 byte (program penuh)

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

Cobalah online.

Penjelasan:

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] tidak sesuai dengan spek: "non-numeric, non-whitespace, printable ASCII"
OOBalance

@ Ketidaksesuaian Mungkin komentar saya tidak dijelaskan dengan baik, tetapi di situlah t<33|(t>47&t<59)|t>126;untuk di atasnya. Ini pada dasarnya menghasilkan angka acak dalam kisaran [0,127), kemudian memeriksa apakah itu valid (jadi dalam kisaran [33..47,59..126], semua karakter ASCII yang tidak dapat dicetak). Jika ya: bagus, tambahkan saja. Jika tidak: buat angka acak dalam rentang [0,127)lagi dan validasi lagi sampai kami menemukan karakter yang valid.
Kevin Cruijssen

Tidak, saya pikir komentar Anda baik-baik saja. Buruk :) :)
OOBalance

1

APL (Dyalog Extended) , 32 byte

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

Cobalah online!

Terima kasih banyak untuk Adám dan dzaima atas bantuan mereka. Pertama kali menggunakan Dyalog Extended!

Penjelasan:

{(?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 byte

Versi fungsional yang ditingkatkan dengan keadaan tidak berubah (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}

Cobalah online!

Solusi gaya fungsional di Scala (350 byte) untuk bersenang-senang.

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}

Saran untuk perbaikan disambut.


1
Di sini, di kode golf, kami hanya mengizinkan jawaban yang setidaknya telah dicoba untuk golf. Ini berarti 1 nama variabel karakter dan penghapusan spasi android menambahkan jumlah byte ke jawaban Anda
Biru

@muddyfish ok saya pindahkan kode saya, bagaimana cara android menambahkan jumlah byte?
firephil

Sepertinya baik-baik saja bagi saya sekarang
Biru

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:

Terima kasih @ Flp.Tkc karena menyadari saya belum membaca tugas dengan benar.

Terima kasih @ Caleb untuk menunjukkan saya bisa menggunakan beberapa untuk mengurangi jumlah byte.

Terima kasih @ Dennis untuk menunjukkan tentang fakta bahwa angka tidak dapat dimasukkan.

EDIT 2:

Versi saat ini mungkin bisa disederhanakan lebih dari itu.


0

PowerShell , 82 89 byte

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

Cobalah online!


1
58..127 tidak termasuk simbol ASCII yang dapat dicetak dalam kisaran lebih rendah 33 (!) Hingga 47 (/).
zeppelin

@ zeppelin benar, saya tidak berpikir itu adalah persyaratan, tetapi membacanya kembali, saya kira itu pasti jika itu menjadi distribusi yang seragam. Diperbarui!
briantist

0

QBIC , 79 byte

::[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+@ 

Melewatkan angka adalah urusan yang mahal, inilah versi yang mungkin juga secara acak memilih 0-9kurang dari 20 byte:

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

Output sampel untuk 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 

Penjelasan:

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

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

Mengambil input sebagai highest\nlowest, dan menampilkan daftar.

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

Ÿ                  # 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 byte

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

Cobalah

;ò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

Keempat (gforth) , 128 byte

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 ;

Cobalah online!

Penjelasan

Ulangi dari awal hingga akhir, cetak angka jika bukan kelipatan 8, jika tidak dapatkan jumlah digit dalam angka dan cetak banyak karakter acak diikuti oleh spasi

Penjelasan Kode

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

Tidak disatukan

Saya biasanya tidak ungolf solusi saya, tetapi ini panjang / cukup rumit yang saya pikir itu diperlukan

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 byte

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

Cobalah online!

Tidak Disatukan:

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

Ya, kesalahanku. Mengenai $x-= $x > 58 ?: 11; // subtract 11, if x is less than 58- bisakah Anda menguraikan?
Jonathan Frech

@JonathanFrech dengan kata lain kami menginginkan angka antara 33-47 atau 58-127. Jadi kami memilih angka yang 58 dikurangi ukuran kisaran yang lebih rendah. Jika angka di bawah 58 itu hanya diterjemahkan ke kisaran yang lebih rendah dengan mengurangi perbedaan. Karena tentu saja kami tidak dapat menampilkan angka (ASCII char 48-57)
640KB

Terner hanyalah jalan pintas untuk melakukannya. Pada dasarnya $ x> 58 dievaluasi menjadi 1, jadi kami mengurangi atau 11 dari $ x. Dalam kasus di mana lebih tinggi, itu diimbangi oleh nilai-nilai ASCII dalam pernyataan rand () menjadi lebih tinggi. Anda dapat melihat bahwa ini menghasilkan distribusi acak yang seragam (sama seragamnya dengan rand PHP): tio.run/…
640KB

Saya kira saya tahu kira-kira apa yang dilakukan operator Elvis, saya hanya berpikir komentar Anda menyesatkan.
Jonathan Frech

Saya akan berpikir itu berfungsi seperti Subtract one from x. If x was less than or equal to 58, subtract a further ten from it., bukan?
Jonathan Frech

0

Kotlin , 136 byte

{r:IntRange->var s=""
for(i in r){for(c in "$i"){var n=java.util.Random().nextInt(83)
if(n>14)n+=10
s+=if(i%8>0)c
else '!'+n}
s+=" "}
s}

Cobalah online!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.