Crazy 8s Code Golf


34

Créez un programme qui imprime tous les nombres entiers inclus entre un intervalle (a, b)et remplace les multiples de 8 dans la séquence par des caractères ASCII imprimables aléatoires (uniformément répartis, indépendamment des autres caractères), non numériques, ni d'espaces, ni d'espaces.

Supposons que 0 <a <b dans tous les cas.

Si le nombre comporte plus d'un chiffre, assurez-vous que le nombre de caractères du remplacement correspond!

Exemples:

(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-exemples:

(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

C'est le code de golf, donc le code le plus court en octets gagne!

Gagnant actuel:

Pyke (21 bytes) de muddyfish

Le plus populaire:

Python 2 (119 bytes) par Dennis


11
Félicitations pour avoir lancé un défi qui combine toutes les choses très longues à mettre en œuvre dans mon langage golfique
Blue

1
@muddyfish je veux dire que c'est un défi;)
GracefulLemming

Je ne sais pas s'il me manque quelque chose, mais les caractères aléatoires doivent-ils être uniques ou non? Par exemple, si l'entrée était 16, 16 alors la sortie pourrait-elle être aa ? Si ce n'est pas le cas, qu'en est-il si le numéro a plus de 85 chiffres (en supposant que j'ai compté correctement)?
FryAmTheEggman

@FryAmTheEggman chaque personnage devrait être unique, mais si "a" et "a" sont sélectionnés de manière aléatoire, c'est correct, mais cela ne devrait pas arriver dans tous les cas car la probabilité est si faible
GracefulLemming

@FryAmTheEggman et le cas 16, 16 dans les autres exemples retournent soit 0 ou 2 caractères aléatoires, mais ne vous inquiétez pas pour ce cas car un sera toujours strictement inférieur à b
GracefulLemming

Réponses:


4

Pyke, 22 21 octets

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

Essayez-le ici!

Accepte une entrée sous la forme: 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(^)

Les listes sont toutes bonnes!
GracefulLemming

C'est intéressant, le premier cas que j'ai vu où 8n, 8n provoque une erreur
GracefulLemming

mon mauvais j'ai mal interprété la sortie
GracefulLemming

11

Python 2, 126 octets

Essayez-le en ligne!

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

Merci beaucoup à Flp.Tkc et EasterlyIrk pour leur aide!


2
Vous pouvez utiliser b/aau lieu de a<=bet vous n’avez pas besoin du tout ;à la fin. import random,stringEnregistre également quelques octets. tio.run/nexus/…
Dennis

@ Dennis, merci, cela a pris 7 octets!
Bruyère


6

zsh, 100 98 octets

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

Les deux arguments d'entrée sont passés en tant qu'arguments de ligne de commande et les nombres sont affichés sur des lignes séparées.

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

Puis - je demander pourquoi vous produisez les chiffres qui sont divisibles par 8?
GracefulLemming

1
@Caleb Whoops, c'était une faute de frappe. Il était censé se lire " non divisible par 8."
Poignée de porte

5

Mathematica, 96 octets

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

Explication

Pour les intrants met n:

Range@##

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

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

Pour tous les nombres divisibles par 8 (appelez-le a), appliquez cette règle de remplacement:

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

Obtenez une liste de tous les caractères ASCII imprimables, sauf les chiffres.

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

Choisissez de manière pseudo-aléatoire des Floor[Log10[a] + 1]caractères dans la liste, permettant ainsi les doublons.

<>""

Rejoignez les personnages.


une autre approche pour 96 octets utilisantFromCharacterCode (r=Range)@##/.a_?(8∣#&):>FromCharacterCode[Join[33~r~47,58~r~127]~RandomChoice~⌊Log10@a+1⌋]<>""&
jaeyong chanté le

5

R, 73 octets

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

Lit les entrées à partir de stdin et remplace les numéros divisibles par 8un échantillon choisi de manière uniforme de caractères ascii dans la plage 32...47, 58...126. Pour dessiner l’échantillon aléatoire, nous avons besoin d’un vecteur de caractères. Malheureusement, nous ne renvoyons intToUtf8()qu’une chaîne plutôt qu’un vecteur. Nous devons donc aussi le vectoriser sur toute la plage en utilisant sapply.


5

Python 2, 126 octets

(on ne fait pas simplement sortir le golfe Dennis)

Voyant que j'ai beaucoup travaillé sur la réponse de heather, j'ai pensé poster mes propres solutions également.

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

C'est une fonction qui prend deux arguments et est imprimée directement sur STDOUT.

127 octets

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

Il s'agit d'une fonction anonyme non nommée - à utiliser, attribuer à une variable (telle que f), puis appeler avec f(a, b). Cela renvoie la sortie sous forme de liste.


Ceci est une erreur. Les caractères sélectionnés au hasard ne doivent pas contenir de chiffres.
Dennis

@Dennis d'accord, retour à mon idée d'épissure: P Merci pour le heads-up
FlipTack

Python 2 semble être un concurrent populaire, je l'aime!
GracefulLemming

4

Pip , 28 octets

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

Prend les nombres en arguments de ligne de commande et imprime une liste de résultats séparés par une nouvelle ligne. Essayez-le en ligne!

Explication:

                              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 octets

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>

Ces maudits bâtis avec des noms de 23 octets ....


1
Les caractères de remplacement devraient être non numériques
LarsW

@LarsW Quelque part a manqué ça, merci
ETHproductions

3

MATL , 26 octets

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

Essayez-le en ligne!

Explication

&:        % 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! Bonne réponse. +1
bruyère

@ Merci Merci! J'ai l'impression qu'il pourrait être raccourci ...
Luis Mendo

3

Pyth , 24 octets

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

Essayez-le en ligne!

Explication:

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 octets

EDITS:

  • Correction du problème "8 8", exclure les caractères numériques d'un ensemble de caractères aléatoires, +12 octets

Golfé

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

Tester

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

Pourriez-vous donner une brève promenade? Aussi, je suis curieux de voir ce crazy8 8 8qui céderait
GracefulLemming

@Caleb, en fait il sera juste sortie d' un tout comme, pour 8 8, on dirait que je suis sur-golfed un peu, travailler sur un correctif maintenant. Il ne filtre pas non plus les chiffres de la chaîne de caractères aléatoire (je l’ai aussi oublié).
Zeppelin

2

Perl 6 , 60 octets

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

Explication:

  • { map { }, $^a .. $^b }: Un lambda qui prend deux arguments, génère la liste des entiers dans cette plage et la renvoie avec la transformation suivante appliquée à chaque élément:
  • $_ % 8 ?? $_ !!: Si l'élément n'est pas divisible par 8, transmettez-le inchangé. Autrement...
  • S:g/./{ }/: ... remplace chaque caractère de sa représentation sous forme de chaîne par la valeur générée par cette expression:
  • grep(/\D/, "!" .. "~").pick: Génère la plage de caractères entre !et ~(dans l’ordre Unicode), filtre les chiffres et sélectionne au hasard l’un des caractères restants.

1

PHP, 163 octets

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

Explication:

  • $n = range(48,57) Ce sont les codes ASCII des nombres, qui se trouvent au milieu des caractères spéciaux (32 à 47) et des autres caractères (58 à 126).
  • $c = array_diff(range(32,126), $n)En utilisant le $ntableau, excluez les caractères numériques et créez un tableau de caractères ASCII acceptables.
  • foreach(range($a,$b) as $v)Boucle sur la plage de valeurs allant de $aà $b(inclus), sous forme de $ v à l'intérieur de la boucle.
  • if($v % 8 != 0) { echo $v; } Teste que $ v est divisible par 8 ʻa l'aide de l'opérateur mod % .
  • else { for($i = 0; $i < strlen($v); $i++) { ... }} Si ce n’est pas divisible par 8, bouclez suffisamment de fois pour le nombre de chiffres et imprimez les caractères (à l’étape suivante).
  • echo chr($c[array_rand($c)])Imprimez un seul caractère du tableau acceptable de valeurs ASCII dans $c. array_randrenvoie un index dans le tableau, nous devons donc obtenir la valeur réelle à cet index $c[random_key].

Je pourrais probablement réduire cette taille en créant $cdifféremment, et la boucle pour imprimer les caractères ASCII me semble maladroite, je vais donc continuer à réfléchir à la façon de la raccourcir.


1
Merci Jake! Content d'avoir de tes nouvelles! Jetez un oeil à mon nouveau défi Random Pixel Poking si vous avez le temps aussi!
GracefulLemming

1

postgresql9.6 251 caractères

très long code mais postgresql le fait aussi.

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 formaté est ici:

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 octets

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

Courir avec le -Edrapeau:

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

C'est assez simple:
- <>..<>crée une liste des nombres entre les 2 numéros d'entrées. Et puis mapitère dessus:
- $_%8||...: ...ils ne sont exécutés que si $_est un multiple de 8.
- s%.%xxx%ge: remplace chaque caractère par xxx.
- do{$_=chr rand 126}until/[!-\/:-~]/choisissez un caractère aléatoire (des codes 0 à 126) jusqu'à ce que nous obtenions un caractère satisfaisant /[!-\/:-~]/, c'est-à-dire. un qui est imprimable et n'est pas un chiffre.
- say: l'imprimer.


1

C (gcc) , 129 119 octets

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

Essayez-le en ligne!

129 → 119 Utilisez l' %94+33astuce de 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
}

Vous pouvez économiser 3 octets si vous passez à un séparateur de nouvelle ligne ( putsau lieu de printf).
OOBalance

C'est plus amusant de jouer avec votre solution :-)
jxh

1

C, 157 115 octets

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

Essayez-le en ligne ici . Merci à jxh pour avoir joué au golf 42 octets.

Version non-golfée:

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
}

Cette conversation peut être poursuivie dans le chat .
DJMcMayhem

1

Java 10, 149 147 octets (fonction 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;}

Essayez-le en ligne.

Java 10, 227 225 octets (programme complet)

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

Essayez-le en ligne.

Explication:

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

La plage [0,127] n'est pas conforme à la spécification: "ASCII imprimable, non numérique,
ni d'

@OOBalance Peut-être que mon commentaire n'est pas très bien expliqué, mais c'est là- t<33|(t>47&t<59)|t>126;dessus que tout se passe. Fondamentalement, il génère un nombre aléatoire dans la plage [0,127), puis vérifie sa validité (donc dans la plage [33..47,59..126], tous les caractères ASCII imprimables non numériques). Si c'est le cas, ajoutez-le. Si ce n'est pas le cas: générez à nouveau un nombre aléatoire dans la plage [0,127)et validez-le jusqu'à ce que nous ayons trouvé un caractère valide.
Kevin Cruijssen

Non, je pense que votre commentaire est bon. My bad :)
OOBalance

1

APL (Dyalog Extended) , 32 octets

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

Essayez-le en ligne!

Un grand merci à Adám et dzaima pour leur aide. Première utilisation de Dyalog Extended!

Explication:

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

Une version fonctionnelle améliorée à l'état immuable (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}

Essayez-le en ligne!

Une solution de style fonctionnel en Scala (350 octets) pour le plaisir.

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}

Les suggestions d'amélioration sont les bienvenues.


1
Ici, sur code golf se, nous n'autorisons que les réponses qui ont au moins été essayées. Cela signifie 1 noms de variable de caractère et la suppression d'espaces android en ajoutant un nombre d'octets à votre réponse
Bleu

@muddyfish ok j'ai joué mon code, comment Android ajoute-t-il le nombre d'octets?
Firephil

Il me semble bien pour le moment
Bleu

0

Python 2, 180 octets

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

MODIFIER:

Merci @ Flp.Tkc d'avoir réalisé que je n'avais pas lu la tâche correctement.

Merci @Caleb pour avoir signalé que je pourrais utiliser quelques-uns pour réduire le nombre d'octets.

Merci à Dennis pour avoir souligné le fait que les chiffres ne peuvent pas être inclus.

EDIT 2:

La version actuelle pourrait probablement être simplifiée plus qu’elle ne l’est.


0

PowerShell , 82 89 octets

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

Essayez-le en ligne!


1
58..127 n'inclut pas les symboles ASCII imprimables dans la plage inférieure de 33 (!) À 47 (/).
Zeppelin

@zeppelin vrai, je ne pensais pas que c'était une exigence, mais relisez-le, je suppose que ça doit l'être pour que la distribution soit uniforme. Mis à jour!
Briantist

0

QBIC , 79 octets

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

Sauter les chiffres est une affaire coûteuse, voici une version qui pourrait également sélectionner au hasard 0-9 20 octets de moins:

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

Exemple de sortie pour 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 

Explication:

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

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

Prend l'entrée en tant que highest\nlowestet génère une liste.

Essayez-le en ligne ou vérifiez tous les cas de test .

Explication:

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

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

L'essayer

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

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 ;

Essayez-le en ligne!

Explication

Boucle du début à la fin, numéro imprimé si non multiple de 8, sinon, indiquez le nombre de chiffres du nombre et imprimez le nombre de caractères aléatoires suivi d'un espace.

Explication du code

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

Non Golfé

En général, je ne rejoue pas mes solutions, mais celle-ci est assez longue / assez compliquée pour que je pense que c'est nécessaire.

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 octets

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

Essayez-le en ligne!

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

Oui, mon erreur. En ce qui concerne $x-= $x > 58 ?: 11; // subtract 11, if x is less than 58- pourriez-vous élaborer?
Jonathan Frech

@ JonathanFrech en d'autres termes, nous voulons un nombre compris entre 33-47 ou 58-127. Nous choisissons donc un nombre égal à 58 moins la taille de la plage inférieure. Si le nombre est inférieur à 58, il est simplement traduit dans la plage inférieure en soustrayant la différence. Bien sûr, nous ne pouvons pas afficher de chiffres (caractère ASCII 48-57)
640 Ko

Le ternaire n'est qu'un raccourci pour le faire. Fondamentalement, $ x> 58 est évalué à 1, et nous soustrayons cela ou 11 à $ x. Dans le cas où il est supérieur, il est compensé par une valeur supérieure des valeurs ASCII de l'instruction rand (). Vous pouvez voir que cela génère une distribution uniformément aléatoire (aussi uniforme que le rand () est capable de PHP): tio.run/…
640 Ko

Je pense savoir à peu près ce que fait l'opérateur Elvis. Je pense simplement que votre commentaire est trompeur.
Jonathan Frech

Je pense que cela fonctionne comme Subtract one from x. If x was less than or equal to 58, subtract a further ten from it., non?
Jonathan Frech

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.