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.


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.

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 

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.


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.


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.


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}

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


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

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

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 .


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

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

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.


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.


1

APL, 38 37 bytes

{⊃{⍵,,⍺∘.,⍵}/⍵⍴⊂,¨⎕a,⎕d,⍨⎕ucs 96+⍳26}

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.


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.

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!


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!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.