Çılgın 8'li Kod Golf


34

Bir aralık arasındaki tüm sayıları tamamen basan (a, b)ve sıradaki 8'in katlarını yerine rastgele (düzgün dağılmış, diğer karakterlerden bağımsız olarak), sayısal olmayan, beyaz olmayan, yazdırılabilir ASCII karakterleriyle değiştiren bir program oluşturun.

Her durumda 0 <a <b farz edin.

Rakam 1 rakamdan fazlaysa, değiştirmedeki karakter sayısının eşleştiğinden emin olun!

Örnekler:

(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

Sigara Örnekler:

(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

Bu kod golf, yani bayt cinsinden en kısa kod kazanıyor!

Güncel Kazanan:

Çamur balığı tarafından Pyke (21 bytes)

En popüler:

Python 2 (119 bayt) Dennis tarafından


11
Golf dilimde uygulayacağım çok uzun şeyleri birleştiren bir meydan okuma yapmak
Blue

1
@muddyfish demek istediğim bu;)
GracefulLemming

Bir şeyi kaçırdığımdan emin değilim ama rastgele karakterler benzersiz mi olmalı yoksa değil mi? Örneğin, giriş 16, 16 ise, çıkış aa olabilir mi? Durum böyle değilse, sayının 85 rakamdan fazla olması durumunda (doğru saydığımı varsayarak)?
FryAmTheEggman

@FryAmTheEggman her karakter çoğunlukla benzersiz olmalıdır, ancak "a" ve "a" sırayla rasgele seçildiyse bu tamamdır, ancak olasılık çok düşük olduğu için her durumda gerçekleşmemelidir
GracefulLemming

@FryAmTheEggman ve diğer örneklerde bulunan 16, 16, ya 0 ya da 2 rasgele karakter döndürür, ancak bu durumda endişelenmeyin, çünkü her zaman kesinlikle b'den az olacaktır
GracefulLemming

Yanıtlar:


4

Pyke, 22 21 bayt

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

Burada dene!

Şeklinde girişi alır: 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(^)

Listelerin hepsi iyi!
Graceful

Bu ilginç, 8n, 8n'nin hataya neden olduğu ilk vaka işte
GracefulLemming

benim hatam çıktımı yanlış okudum
GracefulLemming

11

Python 2,126 bayt

Çevrimiçi deneyin!

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

Tüm yardımları için Flp.Tkc ve EasterlyIrk'a çok teşekkürler!


2
Bunun b/ayerine kullanabilirsiniz ve sonunda a<=bgerek yok ;. Ayrıca import random,stringbirkaç byte kaydeder. tio.run/nexus/…
Dennis,

@Dennis, teşekkür ederim, bu 7 byte çıkardı!
heather


6

zsh, 100 98 bayt

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

İki giriş argümanı komut satırı argümanları olarak iletilir ve sayılar ayrı satırlara verilir.

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

Neden 8 ile bölünebilen sayıları verdiğinizi sorabilir miyim ?
GracefulLemming

1
@Caleb Whoops, bu bir yazım hatası oldu. " 8 ile bölünmez değil " demek istiyordu.
Doorknob

5

Mathematica, 96 bayt

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

açıklama

Girişler mve n:

Range@##

üretmek {m, m + 1, m + 2, ... , n}

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

8 ile bölünebilen tüm numaralar için (bunu söyle a), bu değiştirme kuralını uygulayın:

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

Rakamlar hariç, yazdırılabilir ASCII karakterlerinin bir listesini alın.

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

Sözde rasgele Floor[Log10[a] + 1], listedeki karakterleri seçerek kopyalara izin verir.

<>""

Karakterleri birleştir.


kullanarak 96 bayt için başka bir yaklaşımFromCharacterCode (r=Range)@##/.a_?(8∣#&):>FromCharacterCode[Join[33~r~47,58~r~127]~RandomChoice~⌊Log10@a+1⌋]<>""&
jaeyong

5

R, 73 bayt

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

Stdin'den girdi okur ve değiştirilen 8aralıktaki tek tip seçilmiş ascii karakterleri ile bölünebilen sayıları değiştirir 32...47, 58...126. Rastgele örneği çizmek için bir karakter vektörüne ihtiyacımız vardır, ne yazık ki intToUtf8()bir vektör yerine bir dize döndürür , böylece onu kullanarak aralığın üzerinde de vektörelleştirmeliyiz sapply.


5

Python 2,126 bayt

(biri sadece Dennis'i aşmaz)

Heather'ın cevabı üzerinde çok çalıştığımı görünce kendi çözümlerini de gönderirim diye düşündüm.

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

Bu, iki argümanı alan ve doğrudan yazdıran bir işlevdir STDOUT.

127 bayt

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

Bu isimsiz bir isimsiz fonksiyondur - kullanmak, bir değişkene (örneğin f) atamak ve sonra çağırmak f(a, b). Bu çıktıyı liste olarak döndürür.


Bu yanlış. Rastgele seçilen karakterler rakam içermeyebilir.
Dennis,

@Dennis tamam, ekleme fikrime dönelim: P Heads up için teşekkürler
FlipTack

Python 2 popüler bir rakip gibi görünüyor, bayıldım!
Graceful

4

bip , 28 bayt

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

Sayıları komut satırı argümanları olarak alır ve yeni satırlarla ayrılmış bir sonuç listesi yazdırır. Çevrimiçi deneyin!

Açıklama:

                              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 bayt

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 bayt isimleri olan bu lanet olası ...


1
Değiştirilen karakterlerin sayısal olmaması gerekir
LarsW

@LarsW Her nasılsa, özledim, teşekkürler
ETHproductions

3

MATL , 26 bayt

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

Çevrimiçi deneyin!

açıklama

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

Vay havalı! Güzel cevap +1
heather

@heather Teşekkürler! Daha kısa sürede yapılabileceğini hissediyorum ...
Luis Mendo

3

Pyth , 24 bayt

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

Çevrimiçi deneyin!

Açıklama:

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 bayt

DÜZENLEMELER:

  • "8 8" sorunu düzeltildi, sayısal karakterleri +12 baytlık bir rasgele karakter grubundan hariç tut

golfed

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

Ölçek

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

Kısa bir yürüyüşe izin verebilir misiniz? Aynı zamanda ne crazy8 8 8vereceğini görmek de merak ediyorum
GracefulLemming

@Caleb, aslında o olacak sadece çıkış bir için, olduğu gibi 8 8, şimdi bir düzeltme üzerinde çalışıyoruz, bu biraz aşırı golfed gibiyim görünüyor. Ayrıca rasgele dize karakter kümesindeki basamakları da filtrelemez (Ben de bunu özledim).
zeplin

2

Perl 6 , 60 bayt

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

Açıklama:

  • { map { }, $^a .. $^b }: İki argüman alan bir lambda, o aralıktaki tam sayıların listesini oluşturur ve onu her bir öğeye uygulanan aşağıdaki dönüşümle döndürür:
  • $_ % 8 ?? $_ !!: Eleman 8 ile bölünemezse, üzerinde değişiklik yapmadan geçirin. Aksi takdirde...
  • S:g/./{ }/: ... dizgi gösteriminin her karakterini bu ifade tarafından üretilen değerle değiştir:
  • grep(/\D/, "!" .. "~").pick: !Ve ~(Unicode sırasına göre) karakter aralığını oluşturun, rakamları filtreleyin ve kalan karakterlerden birini rastgele seçin.

1

PHP, 163 bayt

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

Açıklama:

  • $n = range(48,57) Bunlar, özel karakterlerin (32-47) ve diğer karakterlerin (58-126) ortasında bulunan numaralar için ASCII kodlarıdır.
  • $c = array_diff(range(32,126), $n)$nDiziyi kullanarak, sayısal karakterleri hariç tutun ve kabul edilebilir ASCII karakterlerinden oluşan bir dizi oluşturun.
  • foreach(range($a,$b) as $v)Döngünün içinde $ v olarak, $aile $b(dahil) arasında değişen değer aralığında döngü.
  • if($v % 8 != 0) { echo $v; }Mod operatörünü kullanarak $ v için 8 ile eşit şekilde bölünebilir olup olmadığını test edin %.
  • else { for($i = 0; $i < strlen($v); $i++) { ... }} 8'e eşit şekilde bölünmüyorsa, sayıdaki hane sayısı için yeterince zaman geçirin ve karakterleri yazdırın (bir sonraki adımda).
  • echo chr($c[array_rand($c)])İçindeki kabul edilebilir ASCII değerleri dizisinden tek bir karakter yazdırın $c. array_randdizideki bir dizini döndürür, bu yüzden o dizindeki gerçek değeri kullanarak almalıyız $c[random_key].

Muhtemelen $cfarklı oluşturarak bunu daha da küçültebilirim ve ASCII karakterlerini basma döngüsü tıkayıcı hissettirir, böylece nasıl kısaltılacağına karar vereceğim.


1
Sağol Jake! Senden duyduğuma sevindim! Benim de zamanın varsa yeni meydan okuma Random Pixel Poking'e göz at!
Graceful

1

postgresql9.6 251 karakter

çok uzun kod ama postgresql da yapar.

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

biçimlendirilmiş sql burada:

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 bayt

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

-EBayrakla çalıştır :

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

Bu oldukça açıktır:
- <>..<>2 giriş numarası arasındaki sayıların bir listesini oluşturur. Ve sonra mapüzerinde yinelenir:
- $_%8||...: ...yalnızca $_8'in katı olması durumunda yürütülür .
- s%.%xxx%ge: Her karakteri ile değiştirin xxx.
- do{$_=chr rand 126}until/[!-\/:-~]/tatmin edici olanı alana kadar rastgele bir karakter seçin (kodlar 0 ila 126 arasında) /[!-\/:-~]/. yazdırılabilir ve rakam olmayan
- say: yazdırın.


1

C (gcc) , 129 119 bayt

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

Çevrimiçi deneyin!

129 → 119 Kullanım %94+33gelen hile 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
}

Yeni satır ayırıcıya değiştirirseniz ( putsbunun yerine printf) 3 bayt kaydedebilirsiniz .
OOBalance


1

C, 157 115 bayt

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

Burada çevrimiçi deneyin . 42 byte golf için jxh'e teşekkürler .

Ungolfed versiyonu:

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
}

Bu sohbete sohbette devam edilebilir .
DJMcMayhem

1

Java 10, 149 147 bayt (lambda işlevi)

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

Çevrimiçi deneyin.

Java 10, 227 225 bayt (tam program)

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

Çevrimiçi deneyin.

Açıklama:

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] aralığı spesifikasyonlara uymuyor: "sayısal olmayan, beyaz olmayan, yazdırılabilir ASCII"
OOBalance

@OOBalance Belki de yorumum çok iyi açıklanmadı, ama bunun için t<33|(t>47&t<59)|t>126;olduğu yer orası. Temel olarak aralıkta rastgele bir sayı oluşturdu [0,127), sonra geçerli olup olmadığını kontrol eder (aralıkta [33..47,59..126], yazdırılabilir tüm basamaksız ASCII karakterleri). Eğer öyleyse: iyi, ekleyin. Değilse: [0,127)tekrar aralıkta rastgele bir sayı oluşturun ve geçerli bir karakter bulana kadar tekrar doğrulayın.
Kevin Cruijssen

Hayır, yorumunuzun iyi olduğunu düşünüyorum. Benim kötü :)
OOBalance

1

APL (Dyalog Genişletilmiş) , 32 bayt

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

Çevrimiçi deneyin!

Adám ve dzaima'ya yardımları için çok teşekkürler . Dyalog Extended kullanarak ilk kez!

Açıklama:

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

Değişmez duruma sahip geliştirilmiş bir işlevsel sürüm (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}

Çevrimiçi deneyin!

Scala'da (350 byte) eğlence için eğlenceli bir stil çözümü.

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}

İyileştirmeler için öneriler bekliyoruz.


1
Burada kod golf se sadece en azından golf oynamaya teşebbüs edilmiş cevapları veriyoruz. Bu, 1 karakter değişken adı ve boşlukların kaldırılması android cevabınıza bir bayt sayısı ekleyerek anlamına gelir
Blue

@muddyfish ok kodumu golf, android bayt sayısı nasıl ekliyor?
firephil

Şu anda bana iyi görünüyor
Blue

0

Python 2, 180 Bayt

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

DÜZENLE:

Görevi doğru okumamış olduğum için teşekkürler @ Flp.Tkc.

İşaretlediğiniz için teşekkürler @Caleb byte sayısını azaltmak için birkaç kullanabilirsiniz.

Sayıların dahil edilemeyeceği gerçeğine dikkat çektiğiniz için teşekkürler @Dennis.

EDIT 2:

Mevcut sürüm muhtemelen olduğundan daha basitleştirilebilir.


0

PowerShell , 82 89 bayt

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

Çevrimiçi deneyin!


1
58..127, 33 (!) İla 47 (/) alt aralığında yazdırılabilir ASCII sembollerini içermez.
zeplin

@zeppelin true, bunun bir gereklilik olduğunu düşünmedim, ancak yeniden okudum, sanırım tekdüze bir dağılım olacaksa sanırım. Güncellenmiş!
Britanist

0

QBIC , 79 bayt

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

Sayıların atlanması pahalı bir iştir, işte rastgele 0-920 byte için daha az seçebilecek bir versiyon :

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

İçin örnek çıktı 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 

Açıklama:

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

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

Girişi farklı bir şekilde alır highest\nlowestve bir liste çıkarır.

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

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

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

Dene

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

İleri (gforth) , 128 bayt

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 ;

Çevrimiçi deneyin!

açıklama

Baştan sona kadar döngü yapın, 8'den fazla değilse sayıyı yazdırın, aksi takdirde sayıdaki hane sayısını alın ve ardından bir çok rasgele karakteri yazdırın

Kod Açıklaması

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

Genellikle çözümlerimi çözemiyorum, ama bu gerekli olduğunu düşündüğüm kadar uzun / karmaşık.

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 bayt

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

Çevrimiçi deneyin!

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

Evet, benim hatam. İle ilgili olarak $x-= $x > 58 ?: 11; // subtract 11, if x is less than 58- detaylandırır mısın?
Jonathan Frech

@JonathanFrech Başka bir deyişle, 33-47 veya 58-127 arasında bir sayı istiyoruz. Böylece 58 eksi alt aralığın büyüklüğünde bir sayı seçiyoruz. Sayı 58'in altındaysa, farkı çıkartarak sadece düşük aralığa çevrilir. Elbette sayıları gösteremiyoruz (ASCII karakter 48-57)
640KB

Üçlü, sadece bunu yapmak için bir kısayol. Temel olarak $ x> 58 1 olarak değerlendirilir ve bu yüzden onu ya da 11'i $ x'den çıkarırız. Daha yüksek olduğu durumlarda, rand () ifadesindeki ASCII değerleri bir yüksek olmakla dengelenir. Bunun eşit olarak rastgele (PHP'nin rand () yapabildiği kadar düzgün) dağıtım oluşturduğunu görebilirsiniz: tio.run/...
640KB

Sanırım Elvis operatörünün ne yaptığını kabaca biliyorum, sadece yorumunuzun yanıltıcı olduğunu düşünüyorum.
Jonathan Frech

Subtract one from x. If x was less than or equal to 58, subtract a further ten from it.Hayır gibi çalıştığını düşünürdüm.
Jonathan Frech

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.