Contando na base bijetiva 62

20

A tarefa é gerar todas as seqüências de caracteres de 'a' a '999', incluindo caracteres em maiúsculas como:

'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'

e assim por diante (preenchendo as lacunas), começando opcionalmente pela sequência vazia.

Entrada:

  • A quantidade de caracteres consecutivos que o programa precisa imprimir.

Saída:

  • Uma matriz contendo cada sequência OU uma sequência por linha

Esclarecimentos:

  • O pedido não importa, você pode imprimir letras maiúsculas ou minúsculas primeiro, se desejar.

  • A saída pode retornar qualquer tipo de enumerável, não precisa ser uma matriz específica, embora eu duvide que imprimir todas as combinações não seja o caminho mais fácil.

  • Uma entrada de 3imprimiria toda a sequência de 'a'(ou '') para '999', uma entrada de 5até '99999'e assim por diante.

Simon Landry
fonte
O que você quer dizer com saída de uma matriz?
Frederick
Então, apenas letras e números? Que ordem você usa? Em números ASCII vêm primeiro, depois letras maiúsculas e minúsculas
Luis Mendo
Um enumerável contendo todos os valores, ou seja, ['a', 'b', 'c' ..]. Você deve ver a saída em cada linha via STDOUT ou poder atribuí-la via a = (function return).
Simon Landry
1
@ edc65 Pelo que entendi, a entrada é o número máximo de caracteres a serem combinados. Então, para a entrada 4, você passa de apara 9999, para 5 é apara 99999e assim por diante.
Alex A.
3
OK, obrigado por esclarecer isso. Isso economizou muitos bytes. :) Eu acho que o título atual é um pouco confuso, pois você parece exigir bijective base de 62.
Dennis

Respostas:

13

Geléia , 7 bytes

ØWṖṗR;/

Este é um link monádico que aceita um número inteiro como entrada e retorna uma matriz de seqüências de caracteres.

Experimente online!

Como 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
fonte
1
Ao escrever seu próprio idioma para o codegolf, você não pode simplesmente bifurcar, modificá-lo e usar uma solução de 1 byte?
Florian Wendelborn
9
Não. Temos regras estritas para linguagens de programação admissíveis, e uma é que um intérprete de trabalho precisa existir antes do lançamento do desafio. Eu poderia adicionar um built-in para esta tarefa agora, mas só poderia usá-lo em desafios futuros.
Dennis
8
Como isso é ridículo? Se fosse permitido, cada desafio seria resolvido com 1 byte
Zibelas
7
@UncleZeiv a página de código do Jelly está vinculada no título da postagem
edc65 4/16
7
@UncleZeiv Há realmente apenas um conjunto de caracteres que faz isso, que é a página de código do Jelly.
Isaacg
8

Haskell, 65 bytes

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

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

Como 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
fonte
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()]

Produz uma lista de cadeias não vazias. Anexa recursivamente cada caractere alfanumérico a cada saída n-1e sequência vazia.

xnor
fonte
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]:[]

Salva 3 bytes usando toUpperCase. A computação dos 62 caracteres leva 10 bytes extras.

Neil
fonte
4
Não consigo fazer o seu código funcionar, diz que a função f é indefinida.
Simon Landry
1
@ SimonLandry Opa, eu esqueci f=o começo. (Eu sempre esqueço de fazer isso por respostas recursiva.)
Neil
Não funciona pelos motivos acima.
CalculatorFeline
@CatsAreFluffy Eu coloquei f=, quaisquer problemas adicionais se devem à maneira como você está tentando chamá-lo.
Neil
4

Goma de canela, 15 bytes

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

Não é curto o suficiente, apesar de este ser o tipo exato de desafio que o Cinnamon Gum foi feito para :(

Comprimido convertendo da base bijetiva 96 para a base 256. Experimente online. Entradas maiores que 2 causarão problemas no TIO.

Explicação

Isso descompacta para a regex [a-zA-Z0-9]{1,%s}. O hmodo substitui a entrada %se gera todas as seqüências correspondentes ao regex.

um spaghetto
fonte
4

Ruby, 82 bytes

Constrói produtos cartesianos do caractere configurado para o comprimento especificado. O conjunto de caracteres é gerada por agarrando todos os caracteres entre 0e ze filtrar caracteres não-palavra e também _.

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

05AB1E , 9 8 bytes

Código:

ƒžj¨Nã€,

Explicação:

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

Usa a codificação CP-1252 . Experimente online! .

Adnan
fonte
4

Python 2.7, 136 134 bytes

Agradecimentos a Maltysen e NonlinearFruit por salvar 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)]

Pega ascii_letterse digitsno módulo string e usa o produto cartesiano a partir productde itertools para calcular todas as combinações.

Saída

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']
justiça
fonte
1
você pode remover os espaços entre parênteses e letras.
Maltysen
Tente i in range(n)comrepeat=i+1
NonlinearFruit
+1 para a entrada negativa. Isso está embutido na rangefunção?
Kevin Cruijssen 23/06
3

Pitão - 13 12 bytes

1 bytes salvos graças ao @Jakube.

sm^s+rBG1UTh

Experimente online aqui .

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
fonte
Agradável! Gostaria de fornecer uma explicação?
Simon Landry
Eu pensei que há um comando para percorrer as seqüências em ordem lexicográfica?
Freira vazando
@KennyLau nvm, não faz números.
Maltysen
rBG1salvar um byte sobre+GrG1
Jakube
@Jakube oh, Bifurcate funciona com argumentos? obrigado.
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

Experimente em Ideone .

Dennis
fonte
Tinha quase a mesma idéia, mas alguns bytes mais tempo ...
Byte Commander
Wow 2 respostas de você @Dennis, você está matando! :)
Simon Landry
2

MATL , 12 bytes

:"3Y24Y2h@Z^

Isso leva um número como entrada.

Experimente online!

Explicação

:       % 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
fonte
1

𝔼𝕊𝕄𝕚𝕟 , 21 chars / 27 bytes

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

Try it here (Firefox only).

Não. Não. Não.

Explicação

ⒶïⓜᵖɱĬ⟦ᶛ+ᶐ+⩤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
fonte
Na primeira vez que vejo esse idioma e não consigo encontrá-lo usando o Google, adicione um link à documentação e (ou) código-fonte? :)
Simon Landry
1
github.com/molarmanful/ESMin
Mama Fun Roll
O nome da língua é seriamente 4 espaços?
Bálint
Não, mas seu navegador pode não renderizar os caracteres de duplo bloqueio corretamente. Em ASCII, é chamado ESMin.
Mama Fun Roll
1

Perl, 113 bytes + espaço em branco

@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" acima, com um argumento que é um número. Provavelmente eu poderia decentemente não ter contado o último "mapa diz" na contagem de caracteres.

Ed.
fonte
1

J, 50 bytes

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

Metade dos bytes, 25 para ser exato, são gastos na geração das letras e dígitos necessários.

milhas
fonte
1

APL, 38 37 bytes

{⊃{⍵,,⍺∘.,⍵}/⍵⍴⊂,¨⎕a,⎕d,⍨⎕ucs 96+⍳26}
lstefano
fonte
Eu tenho que perguntar, como se locomover se eles não podem comutar? (⎕ucs 96+⍳26),⎕d=>⎕d,⍨⎕ucs 96+⍳26
Zacharý
Posso garantir que você pode se deslocar (sem falar em "fazer a mesma jornada regularmente entre trabalho e casa", porque isso é chato). Você parece ter descoberto que pode ser fácil melhorar as soluções de outras pessoas. Especialmente se você não tem um emprego em período integral. Depois, há a vida real que torna tudo ainda mais difícil ...
lstefano
0

Utilitários Bash + GNU, 90

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

Entrada como um parâmetro de linha de comando. Saída é uma lista separada por espaços em branco.

Funciona para entradas upt e incluindo 3. Fique sem memória com 4 - eval printfleva um conjunto inteiro de 63 n elementos da expansão do bash.

Trauma Digital
fonte
0

Utilitários Bash + GNU, 66

Abordagem diferente (e acho um pouco nova) para minha outra resposta :

dc -e"64 $1^[d2 48^r-P1-d0<m]dsmx"|base64 -w8|sed s_^/*__\;/[+/]/d
  • dccontagens para baixo a partir de 2 48 -1 a 2 48 -64 n e Prints cada número resultante, tal como um fluxo de bytes (ou seja, de base 256). Se a entrada estiver entre 1 e 4, inclusive, é garantido que sejam exatamente 6 bytes por número.
  • base64 converte isso em saída base64 e, portanto, 8 bytes por dígito base64, um por linha.
  • sedretira o início /(dígito base64 63) e remove as linhas que contêm +ou /(dígitos 62 e 63 da base64). Isso deixa a sequência necessária.
Trauma Digital
fonte
0

R , 73 bytes

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

ycomeça como uma string vazia, xcomo o caso base 'a','b','c',...,'8','9'. outerpega cada um de seus argumentos de entrada e aplica a função paste0a cada combinação de elementos ye xque concatena as seqüências de caracteres. ysalva o resultado, catimprime e itera através do número STDIN de vezes.

Experimente online!

Giuseppe
fonte
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

Experimente online!

jq170727
fonte