Golf Crazy 8s


34

Tạo một chương trình in tất cả các số bao gồm một khoảng giữa các khoảng (a, b)và thay thế bội số của 8 trong chuỗi bằng ngẫu nhiên (phân bố đồng đều, độc lập với các ký tự khác), các ký tự ASCII không in số, không khoảng trắng, có thể in.

Giả sử 0 <a <b trong mọi trường hợp.

Nếu số có nhiều hơn 1 chữ số, hãy đảm bảo số lượng ký tự trong các thay thế khớp!

Ví dụ:

(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

Không ví dụ:

(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

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

Người chiến thắng hiện tại:

Pyke (21 byte) bởi bùn

Phổ biến nhất:

Python 2 (119 byte) của Dennis


11
Chúc mừng bạn đã thực hiện một thử thách kết hợp tất cả những điều siêu dài để thực hiện trong ngôn ngữ chơi gôn của tôi
Blue

1
@muddyfish ý tôi là đó là một thử thách;)
GracefulLemming

Tôi không chắc mình có thiếu thứ gì không, nhưng các ký tự ngẫu nhiên có phải là duy nhất hay không? Ví dụ: nếu đầu vào là 16, 16 thì đầu ra có thể là aa không? Nếu đây không phải là trường hợp, thì nếu số có hơn 85 chữ số (giả sử tôi đã đếm đúng) thì sao?
FryAmTheEggman

@FryAmTheEggman mỗi nhân vật nên là duy nhất, nhưng nếu "a" và "a" được chọn ngẫu nhiên liên tiếp thì không sao, nhưng điều đó không nên xảy ra trong mọi trường hợp vì xác suất rất thấp
GracefulLemming

@FryAmTheEggman và trường hợp 16, 16 trong các ví dụ khác trả về 0 hoặc 2 ký tự ngẫu nhiên nhưng đừng lo lắng về trường hợp đó vì sẽ luôn luôn ít hơn b
GracefulLemming

Câu trả lời:


4

Pyke, 22 21 byte

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

Hãy thử nó ở đây!

Có đầu vào ở dạng : 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(^)

Danh sách đều tốt!
GracefulLemming

Điều này thật thú vị, trường hợp đầu tiên tôi thấy trong đó 8n, 8n gây ra lỗi
GracefulLemming

xấu của tôi, tôi đã đọc sai kết quả đầu ra
GracefulLemming

11

Python 2, 126 byte

Hãy thử trực tuyến!

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

Rất cám ơn Flp.Tkc và EasterlyIrk vì tất cả sự giúp đỡ của họ!


2
Bạn có thể sử dụng b/athay vì a<=bvà bạn không cần ;cuối cùng. Cũng import random,stringtiết kiệm một vài byte. tio.run/nexus/ Kẻ
Dennis

@Dennis, cảm ơn bạn, đã lấy ra 7 byte!
thạch


6

zsh, 100 98 byte

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

Hai đối số đầu vào được truyền dưới dạng đối số dòng lệnh và các số được xuất ra trên các dòng riêng biệt.

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

Tôi có thể hỏi lý do tại sao bạn đang cung cấp những con số mà chia hết cho 8?
GracefulLemming

1
@Caleb Rất tiếc, đó là một lỗi đánh máy. Nó có nghĩa là đọc " không chia hết cho 8."
Doorknob

5

Toán học, 96 byte

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

Giải trình

Đối với đầu vào mn:

Range@##

Tạo {m, m + 1, m + 2, ... , n}

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

Đối với tất cả các số chia hết cho 8 (gọi đó a), áp dụng quy tắc thay thế này:

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

Lấy danh sách tất cả các ký tự ASCII có thể in, ngoại trừ các chữ số.

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

Giả ngẫu nhiên chọn các Floor[Log10[a] + 1]ký tự từ danh sách, cho phép trùng lặp.

<>""

Tham gia các nhân vật.


một cách tiếp cận khác cho 96 byte bằng cách sử dụngFromCharacterCode (r=Range)@##/.a_?(8∣#&):>FromCharacterCode[Join[33~r~47,58~r~127]~RandomChoice~⌊Log10@a+1⌋]<>""&
jaeyong hát

5

R, 73 byte

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

Đọc đầu vào từ stdin và thay thế các số chia hết bằng 8một mẫu ký tự ascii được chọn thống nhất trong phạm vi 32...47, 58...126. Để vẽ mẫu ngẫu nhiên, chúng ta cần một vectơ ký tự, không may intToUtf8()trả về một chuỗi chứ không phải vectơ nên chúng ta cũng phải vectơ nó trên phạm vi sử dụng sapply.


5

Python 2, 126 byte

(một người không chỉ đơn giản là vượt qua Dennis)

Thấy tôi đã làm rất nhiều việc cho câu trả lời của thạch, tôi nghĩ tôi cũng sẽ đăng giải pháp của riêng mình.

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

Đây là một hàm có hai đối số và in trực tiếp 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)]

Đây là một hàm ẩn danh chưa được đặt tên - để sử dụng, gán cho một biến (chẳng hạn như f), sau đó gọi với f(a, b). Điều này trả về đầu ra dưới dạng một danh sách.


Điều này là không chính xác. Các ký tự được chọn ngẫu nhiên có thể không chứa chữ số.
Dennis

@Dennis ổn rồi, quay lại với ý tưởng nối của tôi: P Cảm ơn vì đã ngẩng cao đầu
FlipTack

Python 2 dường như là ứng cử viên phổ biến, tôi thích nó!
GracefulLemming

4

Pip , 28 byte

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

Lấy các số làm đối số dòng lệnh và in danh sách kết quả được phân tách bằng dòng mới. Hãy thử trực tuyến!

Giải trình:

                              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>

Những cái được xây dựng với tên 23 byte ....


1
Các ký tự thay thế phải là số
LarsW

@LarsW Bằng cách nào đó đã bỏ lỡ điều đó, cảm ơn
ETHproductions

3

MATL , 26 byte

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

Hãy thử trực tuyến!

Giải trình

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

Thật tuyệt! Câu trả lời tốt đẹp. +1
thạch

@heather Cảm ơn! Tôi có cảm giác nó có thể được rút ngắn lại ...
Luis Mendo

3

Bình , 24 byte

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

Hãy thử trực tuyến!

Giải trình:

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

CHỈNH SỬA:

  • Đã sửa lỗi "8 8", loại trừ các ký tự số khỏi một tập hợp các ký tự ngẫu nhiên, +12 byte

Chơi gôn

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

Kiểm tra

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

Bạn có thể cho là một bước đi ngắn qua? Cũng tò mò muốn xem những gì crazy8 8 8sẽ mang lại
GracefulLemming

@Caleb, trên thực tế nó sẽ chỉ ra một như là, trong 8 8, trông giống như tôi đã quá golfed nó một chút, làm việc trên một sửa chữa ngay bây giờ. Nó cũng không lọc ra các chữ số từ bộ ký tự chuỗi ngẫu nhiên (tôi cũng đã bỏ qua điều đó).
zeppelin

2

Perl 6 , 60 byte

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

Giải trình:

  • { map { }, $^a .. $^b }: Một lambda có hai đối số, tạo danh sách các số nguyên trong phạm vi đó và trả về nó với phép biến đổi sau được áp dụng cho từng phần tử:
  • $_ % 8 ?? $_ !!: Nếu phần tử không chia hết cho 8, chuyển nó không thay đổi. Nếu không thì...
  • S:g/./{ }/: ... thay thế từng ký tự biểu diễn chuỗi của nó bằng giá trị được tạo bởi biểu thức này:
  • grep(/\D/, "!" .. "~").pick: Tạo phạm vi các ký tự giữa !~(theo thứ tự Unicode), lọc ra các chữ số và chọn ngẫu nhiên một trong các ký tự còn lại.

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

Giải trình:

  • $n = range(48,57) Đây là các mã ASCII cho các số nằm ở giữa các ký tự đặc biệt (32-47) và các ký tự khác (58-126).
  • $c = array_diff(range(32,126), $n) Sử dụng $n mảng, loại trừ các ký tự số và xây dựng một mảng các ký tự ASCII có thể chấp nhận.
  • foreach(range($a,$b) as $v)Lặp lại phạm vi giá trị từ $ađến$b (bao gồm), như $ v bên trong vòng lặp.
  • if($v % 8 != 0) { echo $v; } Kiểm tra $ v có chia hết cho 8 bằng toán tử mod không % .
  • else { for($i = 0; $i < strlen($v); $i++) { ... }} Nếu không chia hết cho 8, hãy lặp đủ số lần cho số chữ số trong số và in các ký tự (trong bước tiếp theo).
  • echo chr($c[array_rand($c)])In một ký tự từ mảng giá trị ASCII được chấp nhận trong $c. array_randtrả về một chỉ mục trong mảng, vì vậy chúng ta phải lấy giá trị thực tại chỉ mục đó bằng cách sử dụng $c[random_key].

Tôi có thể có thể làm cho nó nhỏ hơn bằng cách tạo $ckhác đi và vòng lặp để in các ký tự ASCII cảm thấy lộn xộn vì vậy tôi sẽ tiếp tục suy nghĩ làm thế nào để rút ngắn điều đó.


1
Cảm ơn Jake! Vui mừng khi nghe từ bạn! Hãy xem thử thách mới của tôi Random Pixel Poking nếu bạn cũng có thời gian!
GracefulLemming

1

postgresql9.6 251 ký tự

mã rất dài nhưng postgresql cũng làm điều đó.

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 định dạng là ở đây:

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

Chạy với -Ecờ:

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

Điều này khá dễ dàng:
- <>..<>tạo một danh sách các số giữa 2 số đầu vào. Và sau đó maplặp lại trên nó:
- $_%8||...: chỉ ...được thực hiện nếu $_là bội số của 8.
- s%.%xxx%ge: thay thế mọi ký tự bằng xxx.
- do{$_=chr rand 126}until/[!-\/:-~]/chọn một ký tự ngẫu nhiên (từ mã 0 đến 126) cho đến khi chúng ta có được một ký tự thỏa mãn /[!-\/:-~]/, nghĩa là. một trong đó có thể in và không phải là một chữ số.
- say: in nó.


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

Hãy thử trực tuyến!

129 → 119 Sử dụng %94+33 thủ thuật từ OOBalance

Ung dung:

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
}

Bạn có thể lưu 3 byte nếu bạn thay đổi thành dấu tách dòng mới ( putsthay vì printf).
OOBalance

Chơi với giải pháp của bạn sẽ thú vị hơn :-)
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("");}

Hãy thử trực tuyến tại đây . Cảm ơn jxh vì đã chơi golf 42 byte.

Phiên bản bị đánh cắp:

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
}

Cuộc trò chuyện này có thể được tiếp tục trong trò chuyện .
DJMcMayhem

1

Java 10, 149 147 byte (hàm 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;}

Hãy thử trực tuyến.

Java 10, 227 225 byte (chương trình đầy đủ)

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

Hãy thử trực tuyến.

Giải trình:

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

phạm vi [0,127] không phù hợp với thông số: "không phải là số, không phải khoảng trắng, có thể in ASCII"
OOBalance

@OOBalance Có thể nhận xét của tôi không được giải thích rõ ràng, nhưng đó là nơi t<33|(t>47&t<59)|t>126;dành cho nó. Về cơ bản, nó tạo ra một số ngẫu nhiên trong phạm vi [0,127), sau đó kiểm tra xem nó có hợp lệ không (vì vậy trong phạm vi [33..47,59..126], tất cả các ký tự ASCII không chữ số có thể in được). Nếu nó là: tốt, nối nó. Nếu không: tạo lại một số ngẫu nhiên trong phạm vi [0,127)và xác thực lại số đó cho đến khi chúng tôi tìm thấy một ký tự hợp lệ.
Kevin Cruijssen

Không, tôi nghĩ nhận xét của bạn là tốt. Xấu của tôi :)
OOBalance

1

APL (Dyalog mở rộng) , 32 byte

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

Hãy thử trực tuyến!

Rất cảm ơn Adámdzaima vì sự giúp đỡ của họ. Lần đầu tiên sử dụng Dyalog Extended!

Giải trình:

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

Phiên bản chức năng được cải tiến với trạng thái bất biến (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}

Hãy thử trực tuyến!

Một giải pháp kiểu chức năng trong Scala (350 byte) cho sự thú vị của nó.

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}

Đề xuất cải tiến được hoan nghênh.


1
Ở đây trên mã golf se, chúng tôi chỉ cho phép các câu trả lời ít nhất đã được cố gắng để chơi gôn. Điều này có nghĩa là tên biến 1 ký tự và xóa khoảng trắng android thêm số byte vào câu trả lời của bạn
Blue

@muddyfish ok tôi đã chơi mã của mình, làm thế nào Android thêm số byte?
hỏa hoạn

Nó có vẻ tốt với tôi ngay bây giờ
Blue

0

Python 2, 180 byte

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

CHỈNH SỬA:

Cảm ơn @ Flp.Tkc vì đã nhận ra tôi đã không đọc đúng nhiệm vụ.

Cảm ơn @Caleb đã chỉ ra tôi có thể sử dụng một số để giảm số byte.

Cảm ơn @Dennis đã chỉ ra về thực tế là không bao gồm các số.

EDIT 2:

Phiên bản hiện tại có thể có thể được đơn giản hóa hơn nó.


0

PowerShell , 82 89 byte

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

Hãy thử trực tuyến!


1
58..127 không bao gồm các ký hiệu ASCII có thể in trong phạm vi thấp hơn 33 (!) Đến 47 (/).
zeppelin

@zeppelin đúng, tôi không nghĩ đó là một yêu cầu, nhưng đọc lại nó, tôi cho rằng nó phải là nếu nó là một bản phân phối thống nhất. Đã cập nhật!
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+@ 

Bỏ qua các con số là một vấn đề tốn kém, đây là một phiên bản có thể chọn ngẫu nhiên 0-9ít hơn 20 byte:

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

Đầu ra mẫu cho 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 

Giải trình:

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

Lấy đầu vào là highest\nlowestvà xuất ra một danh sách.

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

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

Thử nó

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

Hãy thử trực tuyến!

Giải trình

Lặp lại từ đầu đến cuối, in số nếu không phải là bội số của 8, nếu không thì lấy số chữ số trong số đó và in nhiều ký tự ngẫu nhiên theo sau là khoảng trắng

Giải thích mã

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

Vô duyên

Tôi thường không làm sáng tỏ các giải pháp của mình, nhưng giải pháp này đủ dài / phức tạp đến mức tôi nghĩ rằng nó cần thiết

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

Hãy thử trực tuyến!

Ung dung:

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

Vâng, sai lầm của tôi. Về $x-= $x > 58 ?: 11; // subtract 11, if x is less than 58- bạn có thể giải thích?
Jonathan Frech

@JonathanFrech nói cách khác, chúng tôi muốn một số trong khoảng từ 33-47 hoặc 58-127. Vì vậy, chúng tôi chọn một số 58 trừ đi kích thước của phạm vi thấp hơn. Nếu số dưới 58, nó chỉ được dịch xuống phạm vi thấp hơn bằng cách trừ đi sự khác biệt. Vì tất nhiên chúng tôi không thể hiển thị số (ASCII char 48-57)
640KB

Ternary chỉ là một phím tắt để làm điều đó. Về cơ bản $ x> 58 ước tính thành 1, và do đó, chúng tôi sẽ trừ hoặc 11 từ $ x. Trong trường hợp nó cao hơn, nó được bù bởi các giá trị ASCII trong câu lệnh rand () cao hơn một. Bạn có thể thấy rằng điều này tạo ra một bản phân phối ngẫu nhiên (đồng nhất như rand () có khả năng) của PHP
640KB

Tôi nghĩ rằng tôi biết đại khái những gì nhà điều hành Elvis làm, tôi chỉ nghĩ nhận xét của bạn là sai lệch.
Jonathan Frech

Tôi sẽ nghĩ rằng nó hoạt động như thế nào Subtract one from x. If x was less than or equal to 58, subtract a further ten from it., không?
Jonathan Frech

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.