Crazy 8s Code Golf


34

Cree un programa que imprima todos los números enteros inclusive entre un intervalo (a, b)y reemplace múltiplos de 8 en la secuencia con caracteres ASCII aleatorios (distribuidos uniformemente, independientes de otros caracteres), no numéricos, sin espacios en blanco e imprimibles.

Suponga 0 <a <b en todos los casos.

Si el número tiene más de 1 dígito, ¡asegúrese de que la cantidad de caracteres en el reemplazo coincida!

Ejemplos:

(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

No ejemplos:

(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

Este es el código de golf, por lo que gana el código más corto en bytes.

Ganador actual:

Pyke (21 bytes) por muddyfish

Más popular:

Python 2 (119 bytes) por Dennis


11
Felicidades por hacer un desafío que combina todas las cosas súper largas para implementar en mi lenguaje de golf
Azul

1
@muddyfish quiero decir que es un desafío;)
GracefulLemming

No estoy seguro de si me falta algo, pero ¿deberían los caracteres aleatorios ser únicos o no? Por ejemplo, si la entrada era 16, 16 , ¿podría la salida ser aa ? Si este no es el caso, ¿qué pasa si el número tiene más de 85 dígitos (suponiendo que haya contado correctamente)?
FryAmTheEggman

@FryAmTheEggman cada personaje debe ser único en su mayoría, pero si "a" y "a" se seleccionan aleatoriamente consecutivamente, está bien, pero no debería suceder en todos los casos porque la probabilidad es muy baja
GracefulLemming

@FryAmTheEggman y el caso 16, 16 en los otros ejemplos devuelve 0 o 2 caracteres aleatorios, pero no se preocupe por ese caso, ya que a siempre será estrictamente menor que b
GracefulLemming

Respuestas:


4

Pyke, 22 21 bytes

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

Pruébalo aquí!

Toma de entrada en la forma: 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(^)

¡Todas las listas son buenas!
GracefulLemming

Esto es interesante, el primer caso que he visto donde 8n, 8n causa un error
GracefulLemming

mi mal leí mal la salida
GracefulLemming

11

Python 2, 126 bytes

Pruébalo en línea!

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

¡Muchas gracias a Flp.Tkc y EasterlyIrk por toda su ayuda!


2
Puede usar en b/alugar de a<=by no necesita el ;al final. También import random,stringguarda algunos bytes. tio.run/nexus/…
Dennis

@ Dennis, gracias, ¡eso quitó 7 bytes!
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`}

Los dos argumentos de entrada se pasan como argumentos de línea de comando, y los números salen en líneas separadas.

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

¿Puedo preguntar por qué está generando los números que son divisibles por 8?
GracefulLemming

1
@Caleb Whoops, eso fue un error tipográfico. Estaba destinado a leer " no divisible por 8".
Pomo de la puerta

5

Mathematica, 96 bytes

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

Explicación

Para entradas my n:

Range@##

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

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

Para todos los números que son divisibles por 8 (llame a eso a), aplique esta regla de reemplazo:

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

Obtenga una lista de todos los caracteres ASCII imprimibles, excepto los dígitos.

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

Elija pseudoaleatoriamente Floor[Log10[a] + 1]personajes de la lista, permitiendo duplicados.

<>""

Únete a los personajes.


otro enfoque para 96 ​​bytes usandoFromCharacterCode (r=Range)@##/.a_?(8∣#&):>FromCharacterCode[Join[33~r~47,58~r~127]~RandomChoice~⌊Log10@a+1⌋]<>""&
jaeyong cantó

5

R, 73 bytes

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

Lee la entrada de stdin y reemplaza reemplaza los números divisibles por 8una muestra elegida uniformemente de caracteres ascii en el rango 32...47, 58...126. Para dibujar la muestra aleatoria necesitamos un vector de caracteres, desafortunadamente intToUtf8()devuelve una cadena en lugar de un vector, por lo que también tenemos que vectorizarla en el rango usando sapply.


5

Python 2, 126 bytes

(uno no simplemente supera a Dennis)

Al ver que trabajaba mucho en la respuesta de Heather, pensé en publicar mis propias soluciones también.

import random,string
def f(a,b):
 while b/a:print[a,eval('random.choice(string.printable[10:-6])+'*len(`a`)+"''")][a%8<1];a+=1

Esta es una función que toma dos argumentos e imprime directamente en 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)]

Esta es una función anónima sin nombre: para usar, asignar a una variable (como f) y luego llamar con f(a, b). Esto devuelve la salida como una lista.


Esto es incorrecto. Los caracteres seleccionados al azar pueden no contener dígitos.
Dennis

@Dennis bien, volviendo a mi idea de empalme: P Gracias por el
aviso

Python 2 parece ser un contendiente popular, ¡me encanta!
GracefulLemming

4

Pip , 28 bytes

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

Toma los números como argumentos de línea de comandos e imprime una lista de resultados separada por una nueva línea. Pruébalo en línea!

Explicación:

                              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 bytes

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>

Esos malditos complementos con nombres de 23 bytes ...


1
Los caracteres de reemplazo no deben ser numéricos
LarsW

@LarsW De alguna manera se lo perdió, gracias
ETHproductions

3

MATL , 26 bytes

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

Pruébalo en línea!

Explicación

&:        % 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 genial! Buena respuesta. +1
heather

@heather Gracias! Tengo la sensación de que podría acortarse ...
Luis Mendo

3

Pyth , 24 bytes

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

Pruébalo en línea!

Explicación:

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

EDICIONES:

  • Se corrigió el problema "8 8", excluir caracteres numéricos de un conjunto de caracteres aleatorios, +12 bytes

Golfed

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

Prueba

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

¿Podrías dar un breve paseo? También tengo curiosidad por ver qué crazy8 8 8produciría
GracefulLemming

@Caleb, en realidad solo generará un estado tal como está, para 8 8, parece que lo he exagerado un poco, trabajando en una solución ahora. Tampoco filtra los dígitos del conjunto de caracteres de cadena aleatoria (también me lo he perdido).
zeppelin

2

Perl 6 , 60 bytes

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

Explicación:

  • { map { }, $^a .. $^b }: Una lambda que toma dos argumentos, genera la lista de enteros en ese rango y la devuelve con la siguiente transformación aplicada a cada elemento:
  • $_ % 8 ?? $_ !!: Si el elemento no es divisible por 8, pásalo sin cambios. De otra manera...
  • S:g/./{ }/: ... reemplaza cada carácter de su representación de cadena con el valor generado por esta expresión:
  • grep(/\D/, "!" .. "~").pick: Genere el rango de caracteres entre !y ~(en orden Unicode), filtre los dígitos y elija aleatoriamente uno de los caracteres restantes.

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

Explicación:

  • $n = range(48,57) Estos son los códigos ASCII para números, que están en el medio de caracteres especiales (32-47) y otros caracteres (58-126).
  • $c = array_diff(range(32,126), $n)Utilizando la $nmatriz, excluya caracteres numéricos y cree una matriz de caracteres ASCII aceptables.
  • foreach(range($a,$b) as $v)Recorra el rango de valores desde $ahasta $b(inclusive), como $ v dentro del bucle.
  • if($v % 8 != 0) { echo $v; } Pruebe que $ v sea divisible por 8 con el operador mod % .
  • else { for($i = 0; $i < strlen($v); $i++) { ... }} Si no es divisible por 8, haga un bucle suficientes veces para el número de dígitos en el número e imprima los caracteres (en el siguiente paso).
  • echo chr($c[array_rand($c)])Imprima un solo carácter de la matriz aceptable de valores ASCII en $c. array_randdevuelve un índice en la matriz, por lo que debemos obtener el valor real en ese índice usando $c[random_key].

Probablemente podría hacer esto más pequeño creando de manera $cdiferente, y el ciclo para imprimir los caracteres ASCII se siente torpe, así que continuaré reflexionando sobre cómo acortar eso.


1
Gracias jake! ¡Me alegra oír de ti! Echa un vistazo a mi nuevo desafío Random Pixel Poking si también tienes tiempo.
GracefulLemming

1

postgresql9.6 251 caracteres

código muy largo pero postgresql también lo hace.

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 formateado está aquí:

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

Corre con -E bandera:

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

Esto es bastante sencillo:
- <>..<>crea una lista de los números entre el número de 2 entradas. Y luego mapitera sobre él:
- $_%8||...: ...se ejecutan solo si $_es un múltiplo de 8.
- s%.%xxx%ge: reemplaza cada carácter con xxx.
- do{$_=chr rand 126}until/[!-\/:-~]/Elija un carácter aleatorio (de los códigos 0 a 126) hasta obtener uno que satisfaga /[!-\/:-~]/, es decir. uno que se puede imprimir y no es un dígito.
- say: imprimirlo.


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

Pruébalo en línea!

129 → 119 Usa el %94+33truco de OOBalance

Sin golf:

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
}

Puede guardar 3 bytes si cambia a un separador de nueva línea (en putslugar de printf).
OOBalance

Es más divertido jugar con tu solución :-)
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("");}

Pruébelo en línea aquí . Gracias a jxh por jugar al golf 42 bytes.

Versión sin golf:

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
}

Esta conversación puede continuar en el chat .
DJMcMayhem

1

Java 10, 149 147 bytes (función 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;}

Pruébalo en línea.

Java 10, 227 225 bytes (programa completo)

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

Pruébalo en línea.

Explicación:

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

rango [0,127] no se ajusta a la especificación: "ASCII no numérico, sin espacios en blanco, imprimible"
OOBalance

@OOBalance Quizás mi comentario no esté muy bien explicado, pero ahí es donde t<33|(t>47&t<59)|t>126;está por encima. Básicamente generó un número aleatorio en el rango [0,127), luego verifica si es válido (por lo tanto, en el rango [33..47,59..126], todos los caracteres ASCII sin dígitos imprimibles). Si es: bueno, añádelo. Si no es así: genere un número aleatorio en el rango [0,127)nuevamente y valídelo nuevamente hasta que hayamos encontrado un carácter válido.
Kevin Cruijssen

No, creo que tu comentario está bien. My bad :)
OOBalance

1

APL (Dyalog Extended) , 32 bytes

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

Pruébalo en línea!

Muchas gracias a Adám y dzaima por su ayuda. Primera vez que usa Dyalog Extended!

Explicación:

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

Una versión funcional mejorada con estado inmutable (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}

Pruébalo en línea!

Una solución de estilo funcional en Scala (350 bytes) por diversión.

def r(a:Int, b:Int)={
    var l=(33 to 47).toList:::(58 to 126).toList
    l=Random.shuffle(l)
    var x=ListBuffer[String]()
    var k=0
    (a to b).toList.foreach{e=>{
         if(k==l.length){k=0
         l=Random.shuffle(l)}
         if (e.toInt%8==0){x+=l(k).toChar.toString
           k+=1}
         else{x+=e.toString
             k+=1}}}
    x}

Sugerencias para mejoras son bienvenidas.


1
Aquí en code golf se solo permitimos respuestas que al menos se han intentado jugar al golf. Esto significa nombres de variables de 1 carácter y eliminación de espacios android agregando un recuento de bytes a su respuesta
Azul

@muddyfish ok, jugué mi código, ¿cómo agrega Android el recuento de bytes?
firephil

Me parece bien en este momento
Azul

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

EDITAR:

Gracias @ Flp.Tkc por darte cuenta de que no había leído la tarea correctamente.

Gracias @Caleb por señalar que podría usar algunos para reducir el recuento de bytes.

Gracias @Dennis por señalar que no se pueden incluir números.

EDITAR 2:

La versión actual probablemente podría simplificarse más de lo que es.


0

PowerShell , 82 89 bytes

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

Pruébalo en línea!


1
58..127 no incluye los símbolos ASCII imprimibles en el rango inferior 33 (!) A 47 (/).
zeppelin

@zeppelin es cierto, no pensé que fuera un requisito, pero releyéndolo, supongo que debe serlo para que sea una distribución uniforme. ¡Actualizado!
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+@ 

Saltarse los números es un asunto costoso, aquí hay una versión que también puede seleccionar aleatoriamente 0-9por 20 bytes menos:

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

Salida de muestra para 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 

Explicación:

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

Toma la entrada como highest\nlowesty genera una lista.

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

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

Intentalo

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

Adelante (gforth) , 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 ;

Pruébalo en línea!

Explicación

Recorra de principio a fin, imprima el número si no es múltiplo de 8, de lo contrario obtenga el número de dígitos en el número e imprima tantos caracteres aleatorios seguidos de un espacio

Explicación del código

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

Sin golf

No suelo desentrañar mis soluciones, pero esta es tan larga / complicada que creo que es necesaria

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

Pruébalo en línea!

Sin golf:

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

Si, mi error. En cuanto a $x-= $x > 58 ?: 11; // subtract 11, if x is less than 58- ¿podría elaborar?
Jonathan Frech

@JonathanFrech en otras palabras, queremos un número que esté entre 33-47 o 58-127. Entonces elegimos un número que es 58 menos el tamaño del rango inferior. Si el número está por debajo de 58, solo se traduce al rango inferior restando la diferencia. Porque, por supuesto, no podemos mostrar números (ASCII char 48-57)
640 KB

El ternario es solo un atajo para hacerlo. Básicamente $ x> 58 se evalúa a 1, por lo que restamos eso u 11 de $ x. En el caso de que sea más alto, se compensa con los valores ASCII en la instrucción rand () que es uno más alto. Puede ver que esto genera una distribución uniformemente aleatoria (tan uniforme como es capaz de rand () de PHP): tio.run/…
640KB

Creo que sé aproximadamente lo que hace el operador de Elvis, solo creo que su comentario es engañoso.
Jonathan Frech

Creo que funciona así Subtract one from x. If x was less than or equal to 58, subtract a further ten from it., ¿no?
Jonathan Frech

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.