Verrücktes 8s Code Golf


34

Erstellen Sie ein Programm, das alle ganzen Zahlen einschließlich eines Intervalls druckt (a, b)und ein Vielfaches von 8 in der Folge durch zufällige (gleichmäßig verteilte, von anderen Zeichen unabhängige), nicht numerische, nicht mit Leerzeichen versehene, druckbare ASCII-Zeichen ersetzt.

Nehmen Sie in allen Fällen 0 <a <b an.

Wenn die Zahl mehr als eine Ziffer hat, stellen Sie sicher, dass die Anzahl der Zeichen in der Ersetzung übereinstimmt!

Beispiele:

(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

Nicht-Beispiele:

(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

Das ist Code Golf, also gewinnt der kürzeste Code in Bytes!

Aktueller Gewinner:

Pyke (21 Bytes) von Schlammfischen

Am beliebtesten:

Python 2 (119 Bytes) von Dennis


11
Herzlichen Glückwunsch zu einer Herausforderung, die all die superlangen Dinge vereint, die ich in meiner Golfsprache umsetzen möchte
Blue

1
@ Schlammfisch Ich meine, es ist eine Herausforderung;)
GracefulLemming

Ich bin nicht sicher, ob mir etwas fehlt, aber sollten die zufälligen Zeichen eindeutig sein oder nicht? Wenn zum Beispiel die Eingabe 16, 16 war, könnte die Ausgabe dann aa sein ? Wenn dies nicht der Fall ist, was ist, wenn die Zahl mehr als 85 Stellen hat (vorausgesetzt, ich habe richtig gezählt)?
FryAmTheEggman

@FryAmTheEggman Jeder Charakter sollte meistens einzigartig sein, aber wenn "a" und "a" nacheinander zufällig ausgewählt werden, ist das in Ordnung, aber es sollte nicht in allen Fällen passieren, weil die Wahrscheinlichkeit so gering ist
GracefulLemming

@FryAmTheEggman und der Fall 16, 16 in den anderen Beispielen geben entweder 0 oder 2 zufällige Zeichen zurück, aber machen Sie sich keine Sorgen über diesen Fall, da a immer weniger als b ist
GracefulLemming

Antworten:


4

Pyke, 22 21 Bytes

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

Probieren Sie es hier aus!

Nimmt die Eingabe in der Form: 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(^)

Listen sind alle gut!
GracefulLemming

Das ist interessant, ive der erste Fall gesehen , wo 8n, 8n einen Fehler verursacht
GracefulLemming

Mein schlechtes Ich habe die Ausgabe falsch gelesen
GracefulLemming

11

Python 2, 126 Bytes

Probieren Sie es 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

Vielen Dank an Flp.Tkc und EasterlyIrk für all ihre Hilfe!


2
Sie können b/astatt verwenden a<=bund Sie brauchen die ;am Ende nicht. Auch import random,stringspart ein paar Bytes. tio.run/nexus/…
Dennis

@Dennis, danke, das hat 7 Bytes gekostet!
Heather


6

zsh, 100 98 Bytes

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

Die beiden Eingabeargumente werden als Befehlszeilenargumente übergeben und die Zahlen in separaten Zeilen ausgegeben.

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

Darf ich fragen , warum Sie die Zahlen ausgibt , das sind um 8 teilbar?
GracefulLemming

1
@Caleb Hoppla, das war ein Tippfehler. Es sollte lauten " nicht teilbar durch 8."
Türklinke

5

Mathematica, 96 Bytes

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

Erläuterung

Für Eingänge mund n:

Range@##

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

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

Wenden Sie für alle Zahlen, die durch 8 teilbar sind (nennen Sie das a), diese Ersetzungsregel an:

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

Ruft eine Liste aller druckbaren ASCII-Zeichen mit Ausnahme der Ziffern ab.

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

Wählen Sie pseudozufällig Floor[Log10[a] + 1]Zeichen aus der Liste aus, um Duplikate zuzulassen.

<>""

Verbinde die Charaktere.


ein anderer Ansatz für 96 Bytes mitFromCharacterCode (r=Range)@##/.a_?(8∣#&):>FromCharacterCode[Join[33~r~47,58~r~127]~RandomChoice~⌊Log10@a+1⌋]<>""&
Jaeyong gesungen

5

R, 73 Bytes

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

Liest die Eingabe von stdin und ersetzt die durch teilbaren Zahlen durch 8eine einheitlich ausgewählte Stichprobe von ASCII-Zeichen im Bereich 32...47, 58...126. Um die zufällige Stichprobe zu zeichnen, benötigen wir einen Vektor von Zeichen, der leider intToUtf8()eine Zeichenfolge anstelle eines Vektors zurückgibt, sodass wir ihn auch über den Bereich mit vektorisieren müssen sapply.


5

Python 2, 126 Bytes

(man outgolf nicht einfach Dennis)

Da ich viel an der Antwort von Heather gearbeitet habe, dachte ich, ich würde auch meine eigenen Lösungen posten.

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

Dies ist eine Funktion, die zwei Argumente akzeptiert und direkt an druckt STDOUT.

127 Bytes

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

Dies ist eine unbenannte anonyme Funktion, die Sie verwenden, einer Variablen zuweisen (z. B. f) und dann mit aufrufen können f(a, b). Dies gibt die Ausgabe als Liste zurück.


Das ist falsch. Die zufällig ausgewählten Zeichen dürfen keine Ziffern enthalten.
Dennis

@ Tennis in Ordnung, zurück zu meiner Spleißidee: P Danke für die Köpfe nach oben
FlipTack

Python 2 scheint ein beliebter Anwärter zu sein, ich liebe es!
GracefulLemming

4

Pip , 28 Bytes

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

Nimmt die Zahlen als Befehlszeilenargumente und druckt eine durch Zeilenumbrüche getrennte Liste der Ergebnisse. Probieren Sie es online!

Erläuterung:

                              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>

Diese verdammten Einbauten mit 23-Byte-Namen ...


1
Die Ersatzzeichen sollten nicht numerisch sein
LarsW

@ LarsW Irgendwie habe ich das verpasst, danke
ETHproductions

3

MATL , 26 Bytes

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

Probieren Sie es online!

Erläuterung

&:        % 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 cool! Gute Antwort. +1
Heather

@ Heather Danke! Ich habe das Gefühl, es könnte kürzer gemacht werden ...
Luis Mendo

3

Pyth , 24 Bytes

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

Probieren Sie es online!

Erläuterung:

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 ,6476 Bytes

EDITS:

  • Es wurde das Problem "8 8" behoben, bei dem numerische Zeichen aus einer Reihe von zufälligen Zeichen (+12 Byte) ausgeschlossen wurden

Golf gespielt

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

Prüfung

>./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önnten Sie geben, ist ein kurzer Spaziergang durch? Ich bin auch neugierig zu sehen, was crazy8 8 8ergeben würde
GracefulLemming

@Caleb, tatsächlich wird es nur Ausgang ein wie für 8 8, sieht aus wie ich habe es ein wenig über golfed, jetzt an einer Lösung arbeiten. Es werden auch keine Ziffern aus dem zufälligen Zeichenfolgensatz herausgefiltert (das habe ich auch verpasst).
Zeppelin

2

Perl 6 , 60 Bytes

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

Erläuterung:

  • { map { }, $^a .. $^b }: Ein Lambda, das zwei Argumente akzeptiert, die Liste der Ganzzahlen in diesem Bereich generiert und diese mit der folgenden Transformation für jedes Element zurückgibt:
  • $_ % 8 ?? $_ !!: Wenn das Element nicht durch 8 teilbar ist, geben Sie es unverändert weiter. Andernfalls...
  • S:g/./{ }/: ... Ersetzen Sie jedes Zeichen der Zeichenfolgendarstellung durch den von diesem Ausdruck generierten Wert:
  • grep(/\D/, "!" .. "~").pick: Generieren Sie den Zeichenbereich zwischen !und ~(in Unicode-Reihenfolge), filtern Sie die Ziffern heraus und wählen Sie eines der verbleibenden Zeichen nach dem Zufallsprinzip aus.

1

PHP, 163 Bytes

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

Erläuterung:

  • $n = range(48,57) Dies sind die ASCII-Codes für Zahlen, die sich in der Mitte von Sonderzeichen (32-47) und anderen Zeichen (58-126) befinden.
  • $c = array_diff(range(32,126), $n)Schließen Sie mithilfe des $nArrays numerische Zeichen aus und erstellen Sie ein Array akzeptabler ASCII-Zeichen.
  • foreach(range($a,$b) as $v)Durchlaufen Sie den Wertebereich von $abis $b(einschließlich) als $ v innerhalb der Schleife.
  • if($v % 8 != 0) { echo $v; }Teste mit dem Mod-Operator, ob $ v gleichmäßig durch 8 teilbar ist %.
  • else { for($i = 0; $i < strlen($v); $i++) { ... }} Wenn dies nicht gleichmäßig durch 8 teilbar ist, wiederholen Sie die Schleife so oft, bis die Anzahl der Ziffern erreicht ist, und drucken Sie die Zeichen aus (im nächsten Schritt).
  • echo chr($c[array_rand($c)])Drucken Sie ein einzelnes Zeichen aus dem zulässigen Feld der ASCII-Werte in $c. array_randGibt einen Index im Array zurück, daher müssen wir den tatsächlichen Wert an diesem Index mit ermitteln $c[random_key].

Ich könnte dies wahrscheinlich verkleinern, indem ich es $canders erstelle , und die Schleife zum Drucken der ASCII-Zeichen fühlt sich klobig an, so dass ich weiter darüber nachdenken werde, wie ich das verkürzen kann.


1
Vielen Dank, Jake! Freut mich von dir zu hören! Werfen Sie einen Blick auf meine neue Herausforderung Random Pixel Poking, wenn Sie auch Zeit haben!
GracefulLemming

1

postgresql9.6 251 Zeichen

sehr langer Code, aber postgresql macht es auch.

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

formatiertes SQL ist hier:

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 Bytes

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

Laufen mit -EFlagge:

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

Das ist ganz einfach:
- <>..<>Erstellt eine Liste der Nummern zwischen den 2 Eingangsnummern. Und mapiteriert dann darüber:
- $_%8||...: Die ...werden nur ausgeführt, wenn $_es sich um ein Vielfaches von 8 handelt.
- s%.%xxx%ge: Ersetzen Sie jedes Zeichen durch xxx.
- do{$_=chr rand 126}until/[!-\/:-~]/Wähle ein zufälliges Zeichen (von 0 bis 126), bis wir ein zufriedenstellendes erhalten /[!-\/:-~]/, d. h. eine, die druckbar ist und keine Ziffer ist.
- say: drucke es aus.


1

C (GCC) , 129 119 Bytes

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

Probieren Sie es online!

129 → 119 Verwenden Sie den %94+33Trick von 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
}

Sie können 3 Bytes einsparen, wenn Sie zu einem Trennzeichen für Zeilenumbrüche wechseln ( putsanstelle von printf).
OOBalance

Es macht mehr Spaß, mit Ihrer Lösung zu spielen :-)
jxh

1

C 157115 Bytes

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

Probieren Sie es hier online aus . Danke an jxh für das Golfen mit 42 Bytes.

Ungolfed-Version:

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
}

Dieses Gespräch kann im Chat fortgesetzt werden .
DJMcMayhem

1

Java 10, 149 147 Bytes (Lambda-Funktion)

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

Probieren Sie es online aus.

Java 10, 227 225 Bytes (volles Programm)

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

Probieren Sie es online aus.

Erläuterung:

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

Bereich [0,127] entspricht nicht der Spezifikation: "Nicht numerisch, nicht Leerzeichen, druckbares ASCII"
OOBalance

@OOBalance Vielleicht ist mein Kommentar nicht sehr gut erklärt, aber das ist, wo die t<33|(t>47&t<59)|t>126;darüber ist. Grundsätzlich wurde eine Zufallszahl im Bereich generiert [0,127)und dann überprüft, ob diese gültig ist (also im Bereich [33..47,59..126]alle druckbaren nicht-stelligen ASCII-Zeichen). Wenn es ist: gut, füge es an. Wenn nicht: Erzeugen Sie erneut eine Zufallszahl im Bereich [0,127)und validieren Sie sie erneut, bis wir ein gültiges Zeichen gefunden haben.
Kevin Cruijssen

Nein, ich denke dein Kommentar ist in Ordnung. Mein schlechtes :)
OOBalance

1

APL (Dyalog Extended) , 32 Byte

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

Probieren Sie es online!

Vielen Dank an Adám und dzaima für ihre Hilfe. Zum ersten Mal mit Dyalog Extended!

Erläuterung:

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

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

1

Scala , 198 Bytes

Eine verbesserte Funktionsversion mit unveränderlichem Zustand (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}

Probieren Sie es online!

Eine funktionale Style-Lösung in Scala (350 Bytes) zum Spaß.

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}

Verbesserungsvorschläge sind willkommen.


1
Hier auf Code Golf Se erlauben wir nur Antworten, die zumindest versucht worden sind, Golf zu spielen. Dies bedeutet 1 Zeichen Variablennamen und das Entfernen von Leerzeichen android Hinzufügen einer Byteanzahl zu Ihrer Antwort
Blau

@muddyfish ok, ich habe meinen Code gespielt. Wie fügt Android die Byteanzahl hinzu?
Firephil

Im Moment scheint es mir in Ordnung zu sein
Blue

0

Python 2, 180 Bytes

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

BEARBEITEN:

Vielen Dank an @ Flp.Tkc für die Erkenntnis, dass ich die Aufgabe nicht richtig gelesen habe.

Vielen Dank an @Caleb für den Hinweis, dass ich ein paar verwenden könnte, um die Byteanzahl zu reduzieren.

Vielen Dank an @Dennis für den Hinweis, dass Zahlen nicht eingeschlossen werden können.

EDIT 2:

Die aktuelle Version könnte wahrscheinlich mehr vereinfacht werden als sie ist.


0

Power , 82 89 Bytes

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

Probieren Sie es online!


1
58..127 enthält keine druckbaren ASCII-Symbole im unteren Bereich von 33 (!) Bis 47 (/).
Zeppelin

@zeppelin stimmt, ich habe nicht gedacht, dass dies eine Anforderung ist, aber wenn ich es noch einmal lese, muss es wohl sein, wenn es eine gleichmäßige Verteilung sein soll. Aktualisiert!
Briantist

0

QBIC , 79 Bytes

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

Das Überspringen der Zahlen ist eine kostspielige Angelegenheit. Hier ist eine Version, die möglicherweise auch zufällig 0-920 Bytes weniger auswählt :

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

Beispielausgabe für 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 

Erläuterung:

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

( Z$ is implicitly printed at end of program )

0

05AB1E , 17 Bytes

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

Nimmt die Eingabe als highest\nlowestund gibt eine Liste aus.

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

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

0

Japt , 20 Bytes

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

Versuch es

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

Viertens (gviertens) , 128 Bytes

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

Probieren Sie es online!

Erläuterung

Schleife von Anfang bis Ende, drucke die Zahl, wenn nicht ein Vielfaches von 8, ansonsten erhalte die Anzahl der Ziffern in der Zahl und drucke so viele zufällige Zeichen, gefolgt von einem Leerzeichen

Code Erklärung

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

Normalerweise spiele ich meine Lösungen nicht ab, aber diese ist lang / kompliziert genug, dass ich denke, dass sie gebraucht werden

include random.fs

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

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

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

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

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

0

PHP , 130 Bytes

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

Probieren Sie es online!

Ungolfed:

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

Ja, mein Fehler. In Bezug auf $x-= $x > 58 ?: 11; // subtract 11, if x is less than 58- könnten Sie näher darauf eingehen?
Jonathan Frech

@ JonathanFrech mit anderen Worten, wir wollen eine Zahl zwischen 33-47 oder 58-127. Also wählen wir eine Zahl, die 58 minus der Größe des unteren Bereichs ist. Wenn die Zahl unter 58 liegt, wird sie durch Subtrahieren der Differenz in den unteren Bereich verschoben. Da wir natürlich keine Zahlen anzeigen können (ASCII-Zeichen 48-57)
640 KB

Der Ternär ist nur eine Abkürzung dafür. Grundsätzlich ergibt $ x> 58 1, und daher subtrahieren wir entweder diese oder 11 von $ x. In dem Fall, dass es höher ist, wird es versetzt, indem die ASCII-Werte in der rand () -Anweisung um eins höher sind. Sie können sehen, dass dies eine gleichmäßig zufällige (so einheitliche wie PHP's rand () fähige) Verteilung erzeugt: tio.run/…
640KB

Ich glaube, ich weiß ungefähr, was der Elvis-Operator tut. Ich denke, Ihr Kommentar ist irreführend.
Jonathan Frech

Ich würde denken, dass es funktioniert Subtract one from x. If x was less than or equal to 58, subtract a further ten from it., nein?
Jonathan Frech

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.