Liczenie w bazie bijective 62


20

Zadanie polega na wygenerowaniu wszystkich ciągów od „a” do „999”, w tym wielkich liter, takich jak:

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

i tak dalej (wypełnianie luk), opcjonalnie zaczynając od pustego ciągu.

Wejście:

  • Ilość kolejnych znaków, do których program musi wydrukować.

Wynik:

  • Tablica zawierająca każdy ciąg LUB jeden ciąg w linii

Wyjaśnienia:

  • Kolejność nie ma znaczenia, jeśli chcesz, możesz najpierw wydrukować wielkie lub małe litery.

  • Dane wyjściowe mogą zwracać dowolny typ wyliczenia, nie musi to być konkretna tablica, chociaż wątpię, aby wydrukowanie wszystkich kombinacji nie było najłatwiejszym sposobem.

  • Dane wejściowe 3wypisują cały ciąg znaków od 'a'(lub '') do '999'danych wejściowych 5do '99999'i tak dalej.


Co masz na myśli mówiąc, że wyprowadzasz tablicę?
Frederick

Czyli tylko litery i cyfry? Jakiej kolejności używasz? W liczbach ASCII pojawiają się najpierw, a następnie wielkie litery, małe
Luis Mendo

Wyliczalny zawierający wszystkie wartości, tj. [„A”, „b”, „c” ..]. Powinieneś zobaczyć dane wyjściowe w każdej linii za pośrednictwem STDOUT lub być w stanie je przypisać a = (function return).
Simon Landry

1
@ edc65 Jak rozumiem, wejściem jest maksymalna liczba znaków do połączenia. Więc dla wejścia 4, idziesz od acelu 9999, dla 5 to ado 99999, i tak dalej.
Alex A.

3
OK, dziękuję za wyjaśnienie. To zaoszczędziło wiele bajtów. :) Myślę, że obecny tytuł jest nieco mylący, ponieważ wydaje się, że potrzebujesz bazy bijective 62.
Dennis

Odpowiedzi:


13

Galaretka , 7 bajtów

ØWṖṗR;/

Jest to łącze monadyczne, które przyjmuje liczbę całkowitą jako dane wejściowe i zwraca tablicę ciągów.

Wypróbuj online!

Jak to działa

Ø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
Pisząc własny język dla codegolf, nie możesz go po prostu rozwidlić, zmodyfikować i użyć rozwiązania 1-bajtowego?
Florian Wendelborn

9
Nie. Mamy surowe zasady dotyczące dopuszczalnych języków programowania, a jednym z nich jest to, że przed opublikowaniem wyzwania musi istnieć działający tłumacz. Mógłbym teraz dodać wbudowaną funkcję do tego zadania, ale mogłem jej używać tylko w przyszłych wyzwaniach.
Dennis

8
Jak to jest śmieszne? Gdyby było dozwolone, każde wyzwanie byłoby rozwiązane 1 bajtem
Zibelas

7
@UncleZeiv strona kodowa Jelly jest linkowana w tytule postu
edc65

7
@UncleZeiv Jest tak naprawdę tylko jeden zestaw znaków, który to robi, czyli strona kodowa Jelly.
isaacg

8

Haskell, 65 bajtów

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

Przykład użycia: k 3-> ["a","b","c",....,"997","998","999"].

Jak to działa

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 bajtów

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

Wyświetla listę niepustych ciągów. Rekurencyjnie dołącza każdy znak alfanumeryczny do każdego wyjścia n-1i pustego łańcucha.


5

JavaScript (Firefox 30-57), 108 bajtów

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

Zapisano 3 bajty, używając toUpperCase. Obliczenie 62 znaków zajmuje mi dodatkowe 10 bajtów.


4
Nie mogę uruchomić twojego kodu, mówi, że funkcja f jest niezdefiniowana.
Simon Landry

1
@ SimonLandry Ups, zapomniałem f=na początku. (Zawsze zapominam o tym, aby uzyskać rekurencyjne odpowiedzi).
Neil

Nie działa z powyższych powodów.
CalculatorFeline

@CatsAreFluffy Wstawiam f=, wszelkie dalsze problemy wynikają ze sposobu, w jaki próbujesz to nazwać.
Neil

4

Guma cynamonowa, 15 bajtów

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

Niewystarczająco krótko, mimo że jest to dokładny rodzaj wyzwania, dla którego stworzono gumę cynamonową :(

Kompresowany przez konwersję z bazy bijective 96 na bazę 256. Wypróbuj online. Wejścia większe niż 2 spowodują problemy w TIO.

Wyjaśnienie

To dekompresuje do wyrażenia regularnego [a-zA-Z0-9]{1,%s}. hTryb następnie podstawia się do wejścia %si wyjścia wszystkie ciągi pasujące do wyrażenia regularnego.


4

Rubinowy, 82 bajty

Konstruuje produkty kartezjańskie o postaci ustawionej na podaną długość. Zestaw znaków jest generowany przez chwytając wszystkie znaki pomiędzy 0a zi filtrowanie znaków spoza słowo i również _.

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

4

05AB1E , 9 8 bajtów

Kod:

ƒžj¨Nã€,

Wyjaśnienie:

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

Wykorzystuje kodowanie CP-1252 . Wypróbuj online! .


4

Python 2.7, 136 134 bajtów

Dzięki Maltysen i NonlinearFruit za oszczędność 2 bajtów

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

Pobiera ascii_lettersiz digitsmodułu strunowego i używa produktu kartezjańskiego jak productz itertools do obliczenia wszystkich kombinacji.

Wynik

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
możesz usunąć spacje między nawiasami i literami.
Maltysen

Spróbuj i in range(n)zrepeat=i+1
NonlinearFruit

+1 dla wejścia ujemnego. Czy to jest wbudowane w rangefunkcję?
Kevin Cruijssen

3

Pyth - 13 12 bajtów

1 bajt zapisany dzięki @Jakube.

sm^s+rBG1UTh

Wypróbuj online tutaj .

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

Niezłe! Chcesz podać wyjaśnienie?
Simon Landry

Myślałem, że istnieje polecenie, aby iterować przez ciągi w porządku leksykograficznym?
Leaky Nun

@KennyLau nvm, nie robi liczb.
Maltysen

rBG1zaoszczędzić jeden bajt ponad+GrG1
Jakube

@Jakube, och, Bifurcate działa z argumentami? dzięki.
Maltysen

3

Python 2, 106 97 bajtów

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

Wypróbuj na Ideone .


Miał prawie ten sam pomysł, ale kilka bajtów dłużej ...
Bajt Dowódca

Wow 2 odpowiedzi od ciebie @Dennis, zabijasz to! :)
Simon Landry

2

MATL , 12 bajtów

:"3Y24Y2h@Z^

Pobiera to liczbę jako dane wejściowe.

Wypróbuj online!

Wyjaśnienie

:       % 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 znaków / 27 bajtów

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

Try it here (Firefox only).

Nie. Nie. Nie.

Wyjaśnienie

ⒶïⓜᵖɱĬ⟦ᶛ+ᶐ+⩤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

Po raz pierwszy widzę ten język i nie mogę go znaleźć za pomocą Google, czy chcesz dodać link do jego dokumentacji i (lub) kodu źródłowego? :)
Simon Landry

1
github.com/molarmanful/ESMin
Mama Fun Roll

Czy nazwa języka to poważnie 4 spacje?
Bálint

Nie, ale Twoja przeglądarka może nie wyświetlać poprawnie podwójnie uderzonych znaków. W ASCII nazywa się ESMin.
Mama Fun Roll

1

Perl, 113 bajtów + białe znaki

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

Użyj powyższej opcji „perl -E” z argumentem, który jest liczbą. Prawdopodobnie mógłbym przyznać, że nie policzyłem ostatniego „powiedzenia mapy” w liczbie znaków.


1

J, 50 bajtów

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

Połowa bajtów, a dokładniej 25, jest wydawana na generowanie potrzebnych liter i cyfr.


1

APL, 38 37 bajtów

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

I have to ask, how does one get around if they can't COMMUTE? (⎕ucs 96+⍳26),⎕d => ⎕d,⍨⎕ucs 96+⍳26
Zacharý

Zapewniam cię, że mogę dojeżdżać do pracy (nie mówiąc o „regularnym podróżowaniu między pracą a domem”, bo to nudne). Wydaje się, że odkryłeś, że można łatwo poprawić rozwiązania innych osób. Zwłaszcza jeśli nie masz pracy na pełny etat. Potem jest prawdziwe życie, które sprawia, że ​​wszystko jest jeszcze trudniejsze ...
Lstefano

0

Narzędzia Bash + GNU, 90

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

Wprowadź jako parametr wiersza polecenia. Dane wyjściowe to lista oddzielona spacjami.

Działa dla wejść upt i włącznie 3. Skończy się pamięć z 4 - eval printfzajmuje cały zestaw 63 n elementów rozszerzenia bash.


0

Bash + GNU utils, 66

Different (and I think slightly novel) approach to my other answer:

dc -e"64 $1^[d2 48^r-P1-d0<m]dsmx"|base64 -w8|sed s_^/*__\;/[+/]/d
  • dc counts down from 248-1 to 248-64n and Prints each resulting number as a bytestream (i.e. base 256). If the input is between 1 and 4 inclusive, this is guaranteed to be exactly 6 bytes per number.
  • base64 converts this to base64 output and thus 8 bytes per base64 digit, one per line.
  • sed strips off leading / (base64 digit 63), and then removes any lines containing + or / (base64 digits 62 and 63). This leaves the required sequence.

0

R, 73 bytes

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

y starts off as empty string, x as the base case 'a','b','c',...,'8','9'. outer takes each of its input arguments, and applies the function paste0 to each combination of elements in y and x which concatenates the strings. y saves the result, cat prints it, and it iterates through STDIN number of times of doing this.

Try it 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)[]

Expanded

  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

Try it online!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.