Contando en base biyectiva 62

20

La tarea es generar todas las cadenas de 'a' a '999', incluidos los caracteres en mayúscula de la siguiente manera:

'a', 'b', 'c' ... 'y', 'z', 'A', 'B', 'C' ... 'Y', 'Z', '0', '1', 2' ... 
'8', '9', 'aa', 'ab', 'ac' ... 'az', 'aA', 'aB' ... 'aZ', 'a0' ... 'a9', 'ba'

y así sucesivamente (rellenando los espacios en blanco), opcionalmente comenzando con la cadena vacía.

Entrada:

  • La cantidad de caracteres consecutivos que el programa tiene que imprimir hasta.

Salida:

  • Una matriz que contiene cada cadena O una cadena por línea

Aclaraciones:

  • El orden no importa, puede imprimir letras mayúsculas o minúsculas primero si lo desea.

  • La salida puede devolver cualquier tipo de enumerable, no tiene que ser una matriz específicamente, aunque dudo que imprimir todas las combinaciones no sea la forma más fácil de hacerlo.

  • Una entrada de 3imprimiría toda la cadena desde 'a'(o '') hasta '999'una entrada de 5hasta, '99999'etc.

Simon Landry
fuente
¿Qué quieres decir con generar una matriz?
Frederick
¿Entonces solo letras y números? ¿Qué orden usas? En ASCII los números son lo primero, luego las mayúsculas, las minúsculas
Luis Mendo
Un enumerable que contiene todos los valores, es decir ['a', 'b', 'c' ..]. Debería ver la salida en cada línea a través de STDOUT o poder asignarla a través de a = (function return).
Simon Landry
1
@ edc65 Según tengo entendido, la entrada es el número máximo de caracteres para combinar. Entonces, para la entrada 4, vas de aa 9999, para 5 es aa 99999, y así sucesivamente.
Alex A.
3
Ok, gracias por aclarar eso. Eso ahorró muchos bytes. :) Creo que el título actual es un poco confuso ya que parece requerir una base biyectiva 62.
Dennis

Respuestas:

13

Jalea , 7 bytes

ØWṖṗR;/

Este es un enlace monádico que acepta un número entero como entrada y devuelve una matriz de cadenas.

Pruébalo en línea!

Cómo funciona

ØWṖṗR;/  Main link. Argument: n

ØW       Yield 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_'.
  Ṗ      Remove the last element (underscore).
    R    Range; yield [1, ..., n].
   ṗ     Cartesian product. For each k in the range, this yields the arrays of all
         strings of alphanumeric characters.
     ;/  Concatenate the arrays of strings of each length.
Dennis
fuente
1
Al escribir su propio idioma para codegolf, ¿no podría simplemente bifurcarlo, modificarlo y usar una solución de 1 byte?
Florian Wendelborn
99
No. Tenemos reglas estrictas para los lenguajes de programación admisibles, y una es que un intérprete de trabajo debe haber existido antes de que se publicara el desafío. Podría agregar una función integrada para esta tarea ahora, pero podría usarla solo en desafíos futuros.
Dennis
8
¿Cómo es eso ridículo? Si se permitiera, cada desafío se resolvería con 1 byte
Zibelas
77
@UncleZeiv la página de códigos Jelly está vinculada en el título de la publicación
edc65
77
@UncleZeiv Realmente solo hay un conjunto de caracteres que lo hace, que es la página de códigos Jelly.
isaacg
8

Haskell, 65 bytes

a#b=[a..b]
k n=mapM id.('a'#'z'++'A'#'Z'++'0'#'9'<$)=<<(1#)<$>1#n

Ejemplo de uso: k 3-> ["a","b","c",....,"997","998","999"].

Cómo funciona

a#b = [a..b]        -- helper function that builds a list from a to b


        (1#n)<$>    -- map the function (1#), i.e. "build the list from 1 up to" 
                1#n -- on the list from 1 to n

                    -- now we have [[1],[1,2],[1,2,3]]

              =<<   -- map over this list (and combine results in a single list)
  (        <$)      -- a function that makes length of input copies of
 'a'#'z'++ ... '9'  -- all characters we need

                    -- now we have [["a..9"],["a..9","a..9"],["a..9","a..9","a..9"]]

mapM id.            -- and make the cartesian product of each sublist 
nimi
fuente
5

Python, 86 bytes

f=lambda n:n*[1]and[x+chr(y)for x in['']+f(n-1)for y in range(128)if chr(y).isalnum()]

Emite una lista de cadenas no vacías. Precede recursivamente cada carácter alfanumérico a cada salida para una n-1cadena vacía.

xnor
fuente
5

JavaScript (Firefox 30-57), 108 bytes

f=n=>n?[for(s of['',...f(n-1)])for(c of(t='abcdefghijklmnopqrstuvwxyz')+t.toUpperCase()+'0123456789')s+c]:[]

Guardado 3 bytes usando toUpperCase. Calcular los 62 caracteres me lleva 10 bytes adicionales.

Neil
fuente
44
No puedo hacer que su código funcione, dice que la función f no está definida.
Simon Landry
1
@SimonLandry Vaya, olvidé el f=al principio. (Siempre me olvido de hacer eso por respuestas recursivas.)
Neil
No funciona por las razones anteriores.
CalculatorFeline
@CatsAreFluffy Puse el f=, cualquier otro problema se debe a la forma en que intenta llamarlo.
Neil
4

Chicle de canela, 15 bytes

0000000: 689b b718 05be a345 9c4b c283 d077 de    h......E.K...w.

No lo suficientemente corto, a pesar de que este es el tipo exacto de desafío para el que se hizo Cinnamon Gum :(

Comprimido al convertir de la base biyectiva 96 a la base 256. Pruébelo en línea. Las entradas mayores de 2 causarán problemas en TIO.

Explicación

Esto se descomprime a la expresión regular [a-zA-Z0-9]{1,%s}. El hmodo luego sustituye la entrada en %sy genera todas las cadenas que coinciden con la expresión regular.

un espagueti
fuente
4

Ruby, 82 bytes

Construye productos cartesianos del personaje configurado a la longitud dada. El conjunto de caracteres se genera al capturar todos los caracteres entre 0y zy al filtrar los caracteres que no son palabras y también _.

->n{a=(?0..?z).grep(/\w/)-[?_];r=[]
n.times{|i|r+=a.product(*[a]*i).map &:join};r}
Tinta de valor
fuente
4

05AB1E , 9 8 bytes

Código:

ƒžj¨Nã€,

Explicación:

ƒ          # For N in range(0, input + 1), do:
 žj        #   Push predefined literal [a-zA-Z0-9_]
   ¨       #   Remove the last character (the underscore)
    N      #   Push N
     ã     #   Take the Cartesian product, with N repetitions.
      €,   #   For each element in the array, print with a newline

Utiliza la codificación CP-1252 . Pruébalo en línea! .

Adnan
fuente
4

Python 2.7, 136134 bytes

Gracias a Maltysen y NonlinearFruit por guardar 2 bytes

from itertools import*;from string import*;f=lambda n:[''.join(a) for i in range(1,n+1) for a in product(ascii_letters+digits,repeat=i)]

Toma ascii_lettersy digitsdel módulo de cadena y usa el producto cartesiano como productde itertools para calcular todas las combinaciones.

Salida

out = f(3)

print out[:10]
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']

print out[100:110]
['aM', 'aN', 'aO', 'aP', 'aQ', 'aR', 'aS', 'aT', 'aU', 'aV']

print out[-10:]
['990', '991', '992', '993', '994', '995', '996', '997', '998', '999']
deustice
fuente
1
Puede eliminar los espacios entre paréntesis y letras.
Maltysen
Probar i in range(n)conrepeat=i+1
NonlinearFruit
+1 para la entrada negativa. ¿Está integrado en la rangefunción?
Kevin Cruijssen
3

Pyth - 13 12 bytes

1 bytes guardados gracias a @Jakube.

sm^s+rBG1UTh

Pruébelo en línea aquí .

s                    Add up the lists of different lengths  
 m          (Q)      Map implicitly over input
  ^     h(d)         Cartesian product of string to implicit lambda var + 1
   s                 Add up list
    ++               Concat up three things
     G               Alphabet
     rG1             Uppercase alphabet
     UT              All digits
Maltysen
fuente
¡Buena esa! ¿Quieres dar una explicación?
Simon Landry
¿Pensé que hay un comando para recorrer las cadenas en orden lexicográfico?
Leaky Nun
@KennyLau nvm, no hace números.
Maltysen
rBG1guardar un byte+GrG1
Jakube
@Jakube oh, ¿ Bifurcate funciona con argumentos? Gracias.
Maltysen
3

Python 2, 106 97 bytes

from string import*
f=lambda n,r=['']:n and r+f(n-1,[x+y for x in r for y in letters+digits])or r

Pruébalo en Ideone .

Dennis
fuente
Tenía casi la misma idea, pero unos pocos bytes más ...
Byte Commander
Wow 2 respuestas tuyas @Dennis, ¡lo estás matando! :)
Simon Landry
2

MATL , 12 bytes

:"3Y24Y2h@Z^

Esto toma un número como entrada.

Pruébalo en línea!

Explicación

:       % Implicitly take input, say N. Generate range [1 2... N]
"       % For each number in that range
  3Y2   %   Predefined literal: string with all letters, uppercase and lowercase
  4Y2   %   Predefined literal: string with all digits
  h     %   Concatenate horizontally
  @     %   Push number of characters corresponding to current iteration
  Z^    %   Cartesian power. Each result is a row 
        % End for each. Implicitly display
Luis Mendo
fuente
1

𝔼𝕊𝕄𝕚𝕟 , 21 caracteres / 27 bytes

ⒶïⓜᵖɱĬ⟦ᶛ+ᶐ+⩤9⨝],⧺_)ė)

Try it here (Firefox only).

No No No

Explicación

ⒶïⓜᵖɱĬ⟦ᶛ+ᶐ+⩤9⨝],⧺_)ė) // implicit: 
Ⓐïⓜ                    // [...Array(input)].map(($,_)=>...)
    ᵖ                   // push to stack:
     ɱĬ⟦ᶛ+ᶐ+⩤9⨝],⧺_)   // list of n-digit numbers in [a-zA-Z0-9]-ary
                     ė) // formatted into a matrix (no spaces)
                        // implicit stack output, newline-separated
Mama Fun Roll
fuente
La primera vez que veo este idioma y no puedo encontrarlo usando Google, ¿me importa agregar un enlace a su documentación y (o) código fuente? :)
Simon Landry
1
github.com/molarmanful/ESMin
Mama Fun Roll
¿Es el nombre de la lengua en serio 4 espacios?
Bálint
No, pero es posible que su navegador no muestre correctamente los caracteres dobles. En ASCII, se llama ESMin.
Mama Fun Roll
1

Perl, 113 bytes + espacio en blanco

@r="";
for (1..shift) {
  @r = sub {
    map { $c=$_; map $c.$_, @{$_[1]} } @{$_[0]}
  }->(\@r, [0..9, "a".."z", "A".."Z"])
}
map say($_), @r

Use "perl -E" en lo anterior, con un argumento que es un número. Probablemente podría no haber contado decentemente el último "decir mapa" en el recuento de caracteres.

Ed.
fuente
1

J, 50 bytes

62&(('0123456789',~(,toupper)u:97+i.26){~#~#:i.@^)

La mitad de los bytes, 25 para ser exactos, se gastan generando las letras y dígitos necesarios.

millas
fuente
1

APL, 38 37 bytes

{⊃{⍵,,⍺∘.,⍵}/⍵⍴⊂,¨⎕a,⎕d,⍨⎕ucs 96+⍳26}
lstefano
fuente
Tengo que preguntar, ¿cómo puede uno moverse si no puede COMENZAR? (⎕ucs 96+⍳26),⎕d=>⎕d,⍨⎕ucs 96+⍳26
Zacharý
Les puedo asegurar que puedo viajar (no hablar de "hacer el mismo viaje regularmente entre el trabajo y el hogar", porque eso es aburrido). Parece que descubrió que puede ser fácil mejorar las soluciones de otras personas. Especialmente si no tienes un trabajo a tiempo completo. Luego está la vida real que hace que todo sea aún más difícil ...
lstefano
0

Bash + utilidades GNU, 90

printf -vs %$1s
eval printf '%s\\n' ${s// /{=,{a..z\},{A..Z\},{0..9\}\}}|sed s/^=*//\;/=/d

Entrada como parámetro de línea de comando. La salida es una lista separada por espacios en blanco.

Funciona para entradas upt e inclusive 3. Queda sin memoria con 4: eval printftoma un conjunto completo de 63 n elementos de la expansión bash.

Trauma digital
fuente
0

Bash + GNU utils, 66

Enfoque diferente (y creo que un poco novedoso) a mi otra respuesta :

dc -e"64 $1^[d2 48^r-P1-d0<m]dsmx"|base64 -w8|sed s_^/*__\;/[+/]/d
  • dcuna cuenta atrás de 2 48 -1-2 48 -64 n yP resuelve cada número resultante como bytestream (es decir, base 256). Si la entrada está entre 1 y 4 inclusive, se garantiza que sea exactamente 6 bytes por número.
  • base64 convierte esto en salida base64 y, por lo tanto, 8 bytes por dígito base64, uno por línea.
  • seddespoja de líder /(base64 dígitos 63), y luego elimina cualquier líneas que contienen +o /(base64 dígitos 62 y 63). Esto deja la secuencia requerida.
Trauma digital
fuente
0

R , 73 bytes

y='';x=c(letters,LETTERS,0:9);for(i in 1:scan())cat(y<-outer(y,x,paste0))

ycomienza como una cadena vacía, xcomo el caso base 'a','b','c',...,'8','9'. outertoma cada uno de sus argumentos de entrada y aplica la función paste0a cada combinación de elementos en yy xque concatena las cadenas. yguarda el resultado, lo catimprime y repite el número de veces que STDIN lo hace.

Pruébalo en línea!

Giuseppe
fuente
0

Jq 1.5 , 97 bytes

range(.)as$n|[[range(97;123),range(65;91),range(48;58)]|implode/""|combinations($n+1)]|map(add)[]

Expandido

  range(.) as $n           # for each n-digit sequence
| [
      [                    # build array of ordinals for
        range(97;123),     #   a-z
        range(65;91),      #   A-Z
        range(48;58)       #   0-9
      ]
    | implode/""           # make into array of strings
    | combinations($n+1)   # generate array of n-element combinations
  ]
| map(add)[]               # convert to sequence of strings

Pruébalo en línea!

jq170727
fuente