รหัส Crazy 8s Golf


34

สร้างโปรแกรมที่พิมพ์ตัวเลขทั้งหมดทั้งหมดรวมกันระหว่างช่วงเวลา(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

Non-ตัวอย่าง:

(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

นี่คือรหัสกอล์ฟดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ!

ผู้ชนะปัจจุบัน:

Pyke (21 ไบต์) โดย muddyfish

ที่นิยมมากที่สุด:

Python 2 (119 bytes) โดย Dennis


11
ขอแสดงความยินดีกับความท้าทายที่รวมเอาทุกสิ่งที่ยาวเป็นพิเศษเข้าไว้ด้วยกันในภาษากอล์ฟของฉัน
Blue

1
@muddyfish ฉันหมายความว่ามันเป็นสิ่งที่ท้าทาย;)
GracefulLemming

ฉันไม่แน่ใจว่าฉันขาดอะไรไปหรือเปล่า แต่ตัวละครแบบสุ่มควรจะมีเอกลักษณ์หรือไม่? ตัวอย่างเช่นถ้าอินพุตเป็น16, 16ดังนั้นเอาต์พุตจะเป็นaa ? หากไม่เป็นเช่นนั้นจะเกิดอะไรขึ้นถ้าจำนวนนั้นมีมากกว่า 85 หลัก (สมมติว่าฉันนับอย่างถูกต้อง)
FryAmTheEggman

@FryAmTheEggman อักขระแต่ละตัวควรมีลักษณะเฉพาะตัว แต่ถ้า "a" และ "a" ถูกสุ่มเลือกอย่างต่อเนื่องซึ่งก็โอเค แต่มันไม่ควรเกิดขึ้นในทุกกรณีเพราะความน่าจะเป็นต่ำ
GracefulLemming

@FryAmTheEggman และกรณีที่ 16, 16 ในตัวอย่างอื่น ๆ ส่งคืนอักขระ 0 หรือ 2 ตัว แต่ไม่ต้องกังวลเกี่ยวกับกรณีนั้นเพราะจะเสมอน้อยกว่า b
GracefulLemming

คำตอบ:


4

Pyke, 22 21 ไบต์

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

ลองที่นี่!

รับอินพุตในรูปแบบ: 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(^)

รายการทั้งหมดดี!
GracefulLemming

นี่เป็นกรณีที่น่าสนใจกรณีแรกที่ ive เห็นว่า 8n, 8n ทำให้เกิดข้อผิดพลาด
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

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

อาร์กิวเมนต์อินพุตสองตัวถูกส่งผ่านเป็นอาร์กิวเมนต์บรรทัดคำสั่งและตัวเลขจะถูกส่งออกเป็นบรรทัดแยกกัน

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?
GracefulLemming

1
@Caleb อ๊ะนั่นเป็นตัวพิมพ์ผิด มันหมายถึงการอ่าน " ไม่หารด้วย 8"
Doorknob

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 sung

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()ผลตอบแทนที่หนึ่งสายมากกว่าเวกเตอร์เพื่อให้เรายังต้อง vectorize sapplyมันมากกว่าช่วงใช้


5

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

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)แล้วโทรด้วย ส่งคืนเอาต์พุตเป็นรายการ


สิ่งนี้ไม่ถูกต้อง อักขระที่เลือกแบบสุ่มอาจไม่มีตัวเลข
เดนนิส

@Dennis ไม่เป็นไรกลับไปที่ความคิดประกบของฉัน: P ขอบคุณสำหรับหัวขึ้น
FlipTack

Python 2 ดูเหมือนจะเป็นคู่แข่งยอดนิยมฉันรักมัน!
GracefulLemming

4

Pip , 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
heather

@ ทุ่งหญ้าขอบคุณ! ฉันมีความรู้สึกว่ามันสั้นลงได้ ...
Luis 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

ทุบตี + APG ,64, 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 ที่จริงแล้วมันเพิ่งจะส่งออกเป็นไปตามที่เป็นอยู่สำหรับ 8 8 ดูเหมือนว่าฉันได้ไปเล่นกอล์ฟนิดหน่อยตอนนี้กำลังแก้ไขปัญหาอยู่ นอกจากนี้ยังไม่กรองตัวเลขออกจากชุดอักขระสตริงแบบสุ่ม (ฉันพลาดเช่นกัน)
Zeppelin

2

Perl 6 , 60 bytes

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

คำอธิบาย:

  • { map { }, $^a .. $^b }: แลมบ์ดาที่รับอาร์กิวเมนต์สองตัวสร้างรายการจำนวนเต็มในช่วงนั้นและส่งคืนด้วยการแปลงต่อไปนี้ที่ใช้กับแต่ละองค์ประกอบ:
  • $_ % 8 ?? $_ !!: หากองค์ประกอบไม่หารด้วย 8 ให้ส่งผ่านโดยไม่เปลี่ยนแปลง มิฉะนั้น...
  • S:g/./{ }/: ... แทนที่อักขระแต่ละตัวของการแทนสตริงด้วยค่าที่สร้างโดยนิพจน์นี้:
  • grep(/\D/, "!" .. "~").pick: สร้างช่วงของอักขระระหว่าง!และ~(ตามลำดับ Unicode) กรองตัวเลขและสุ่มเลือกอักขระที่เหลืออย่างใดอย่างหนึ่ง

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) เหล่านี้คือรหัส ASCII สำหรับตัวเลขซึ่งอยู่ตรงกลางของอักขระพิเศษ (32-47) และอักขระอื่น ๆ (58-126)
  • $c = array_diff(range(32,126), $n)การใช้$nอาร์เรย์ไม่รวมอักขระตัวเลขและสร้างอาร์เรย์ของอักขระ ASCII ที่ยอมรับได้
  • foreach(range($a,$b) as $v)วนรอบช่วงของค่าจาก$aถึง$b(รวม) เป็น $ v ภายในลูป
  • if($v % 8 != 0) { echo $v; }ทดสอบราคา $ โวลต์เป็นอย่างเท่าเทียมกันหารด้วย 8 %ใช้ประกอบพอควร
  • else { for($i = 0; $i < strlen($v); $i++) { ... }} หากไม่สามารถหารได้อย่างสม่ำเสมอด้วย 8 ให้วนรอบเวลาที่เพียงพอสำหรับจำนวนตัวเลขในจำนวนและพิมพ์อักขระ (ในขั้นตอนถัดไป)
  • echo chr($c[array_rand($c)])พิมพ์ตัวอักษรตัวเดียวจาก array ที่ยอมรับของค่า ASCII $cใน ผลตอบแทนดัชนีในอาร์เรย์ดังนั้นเราจะต้องได้รับค่าจริงที่ดัชนีที่ใช้array_rand$c[random_key]

ฉันอาจทำให้ขนาดเล็กลงด้วยการสร้างที่$cแตกต่างกันและการวนรอบเพื่อพิมพ์ตัวอักษร ASCII รู้สึกอุ้ยอ้ายดังนั้นฉันจะไตร่ตรองวิธีการย่อให้สั้นลง


1
ขอบคุณเจค! ดีใจที่ได้ยินจากคุณ! ดูความท้าทายใหม่ของฉัน Random Pixel Poking ถ้าคุณมีเวลาด้วย!
GracefulLemming

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 ตัว และแล้วmapiterates มากกว่านั้น:
- $_%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 ใช้%94+33เคล็ดลับจากOOBalance

Ungolfed:

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
}

คุณสามารถบันทึกได้ 3 ไบต์หากคุณเปลี่ยนเป็นตัวคั่นบรรทัดใหม่ ( putsแทนprintf)
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("");}

ลองออนไลน์ได้ที่นี่ ขอบคุณjxhสำหรับการเล่นกอล์ฟขนาด 42 ไบต์

เวอร์ชันที่ไม่ถูกปรับแต่ง:

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

ช่วง [0,127] ไม่สอดคล้องกับข้อมูลจำเพาะ: "ไม่ใช่ตัวเลข, ไม่ใช่ whitespace, ASCII ที่พิมพ์ได้"
OOBalance

@OOBalance ความคิดเห็นของฉันอาจไม่ได้อธิบายอย่างดีนัก แต่นั่นคือที่t<33|(t>47&t<59)|t>126;สำหรับข้างบน โดยทั่วไปจะสร้างตัวเลขสุ่มในช่วง[0,127)จากนั้นตรวจสอบว่าถูกต้องหรือไม่ (ในช่วง[33..47,59..126]นั้นอักขระ ASCII ที่ไม่ใช่ตัวเลขที่พิมพ์ได้ทั้งหมด) ถ้าเป็น: ดีต่อท้าย ถ้าไม่ใช่: สร้างตัวเลขสุ่มในช่วง[0,127)อีกครั้งและตรวจสอบอีกครั้งจนกว่าเราจะพบอักขระที่ถูกต้อง
Kevin Cruijssen

ไม่ฉันคิดว่าความคิดเห็นของคุณดี My bad :)
OOBalance

1

APL (Dyalog Extended) , 32 ไบต์

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

ลองออนไลน์!

ขอบคุณAdámและdzaima อย่างมากสำหรับความช่วยเหลือ ครั้งแรกที่ใช้ 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

สกาลา , 198 ไบต์

รุ่นปรับปรุงการทำงานพร้อมสถานะไม่เปลี่ยนรูป (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}

ลองออนไลน์!

โซลูชันสไตล์การทำงานใน Scala (350 ไบต์) เพื่อความสนุกสนานของมัน

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}

ยินดีรับข้อเสนอแนะสำหรับการปรับปรุง


1
ที่นี่ในรหัสกอล์ฟเราอนุญาตเฉพาะคำตอบที่พยายามอย่างน้อยที่จะเล่นกอล์ฟ ซึ่งหมายความว่าชื่อตัวแปร 1 ตัวอักษรและการลบช่องว่าง android เพิ่มจำนวนไบต์ในคำตอบของคุณ
Blue

@muddyfish ok ฉัน golfed รหัสของฉัน Android จะเพิ่มจำนวนไบต์อย่างไร
firephil

มันดูเหมือนจะดีกับผมในขณะนี้
สีฟ้า

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

แก้ไข:

ขอบคุณ @ Flp.Tkc ที่ทราบว่าฉันอ่านงานไม่ถูกต้อง

ขอบคุณ @Caleb สำหรับการชี้ให้เห็นฉันสามารถใช้จำนวนน้อยเพื่อลดจำนวนไบต์

ขอบคุณ @Dennis ที่ชี้ให้เห็นถึงความจริงที่ว่าตัวเลขไม่สามารถรวมได้

แก้ไข 2:

เวอร์ชันปัจจุบันอาจมีความเรียบง่ายมากกว่าที่เป็นอยู่


0

PowerShell , 82 89 ไบต์

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

ลองออนไลน์!


1
58..127 ไม่รวมสัญลักษณ์ ASCII ที่พิมพ์ได้ในช่วงล่าง 33 (!) ถึง 47 (/)
เรือเหาะ

@zeppelin จริงฉันไม่คิดว่ามันเป็นข้อกำหนด แต่การอ่านมันอีกครั้งฉันคิดว่ามันต้องเป็นไปได้ถ้ามันจะเป็นการกระจายตัวแบบสม่ำเสมอ Updated!
ต้มตุ๋น

0

QBIC , 79 ไบต์

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

การข้ามตัวเลขเป็นเรื่องค่าใช้จ่ายนี่เป็นรุ่นที่อาจเลือกสุ่ม0-9น้อยกว่า 20 ไบต์ด้วย:

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

ตัวอย่างผลลัพธ์สำหรับ 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 

คำอธิบาย:

::        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ไบต์

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

รับอินพุตเป็นhighest\nlowestและเอาต์พุตรายการ

ลองออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

Ÿ                  # 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 ไบต์

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

ลองมัน

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

ออกมา (gforth) , 128 ไบต์

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 ;

ลองออนไลน์!

คำอธิบาย

วนซ้ำตั้งแต่ต้นจนจบพิมพ์หมายเลขหากไม่ใช่หลาย 8 หรือรับตัวเลขในจำนวนและพิมพ์ตัวอักษรสุ่มจำนวนมากตามด้วยช่องว่าง

รหัสคำอธิบาย

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

ปกติฉันไม่ได้แก้ปัญหาของตัวเอง แต่อันนี้ยาว / ซับซ้อนพอที่ฉันคิดว่ามันจำเป็น

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 ไบต์

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

ลองออนไลน์!

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

ใช่ความผิดพลาดของฉัน เกี่ยวกับ$x-= $x > 58 ?: 11; // subtract 11, if x is less than 58- คุณอธิบายได้ไหม?
Jonathan Frech

@JonathanFrech กล่าวอีกนัยหนึ่งเราต้องการตัวเลขที่อยู่ระหว่าง 33-47 หรือ 58-127 เราเลือกจำนวนที่ 58 ลบด้วยขนาดของช่วงล่าง หากตัวเลขต่ำกว่า 58 มันแค่แปลลงไปที่ช่วงล่างโดยการลบส่วนต่าง เนื่องจากแน่นอนเราไม่สามารถแสดงตัวเลข (ASCII ถ่าน 48-57)
640KB

ไตรภาคีเป็นเพียงทางลัดในการทำ โดยทั่วไป $ x> 58 ประเมินผลเป็น 1 และเราก็ลบมันออกหรือ 11 จาก $ x ในกรณีที่สูงกว่าจะชดเชยด้วยค่า ASCII ในคำสั่ง rand () ซึ่งสูงกว่าค่าหนึ่ง คุณจะเห็นว่าสิ่งนี้สร้างการกระจายแบบสุ่ม (เหมือนกันในรูปแบบของแรนด์ของ PHP ()): tio.run/…
640KB

ฉันคิดว่าฉันรู้คร่าวๆว่าผู้ดำเนินการ Elvis ทำอะไรฉันแค่คิดว่าความคิดเห็นของคุณทำให้เข้าใจผิด
Jonathan Frech

ฉันคิดว่ามันใช้งานได้Subtract one from x. If x was less than or equal to 58, subtract a further ten from it.ใช่ไหม
Jonathan Frech

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.