Підрахунок у біективної основи 62


20

Завдання полягає в генерації всіх рядків від 'a' до '999', включаючи символи верхнього регістру, наприклад:

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

і так далі (заповнення прогалин), необов'язково починаючи з порожнього рядка.

Вхід:

  • Кількість послідовних символів, які програма повинна надрукувати.

Вихід:

  • Масив, що містить кожен рядок АБО один рядок на рядок

Роз'яснення:

  • Порядок не має значення, ви можете спочатку надрукувати великі або малі літери, якщо хочете.

  • Вихід може повернути будь-який тип перелічуваного, не повинен бути спеціально масивом, хоча я сумніваюся, що друк усіх комбінацій не буде найпростішим способом.

  • Вхідні дані 3надрукували б весь рядок від 'a'(або '') до « '999'вводу 5до '99999'і так далі».


Що ви маєте на увазі, вивівши масив?
Фредерік

Отже, лише букви та цифри? Яким замовленням ви користуєтесь? У ASCII числами спочатку надходять цифри, потім великі літери, малі
Луїс Мендо

Перелік, що містить усі значення, тобто ['a', 'b', 'c' ..]. Ви повинні або побачити вихід у кожному рядку через STDOUT, або мати можливість призначити його через a = (function return).
Саймон Лендрі

1
@ edc65 Як я розумію, вхід - це максимальна кількість символів, які потрібно об'єднати. Отже, для введення 4 ви переходите від aдо 9999, для 5 - aдо 99999і так далі.
Олексій А.

3
Добре, дякую за очищення. Це врятувало багато байтів. :) Я думаю, що поточний заголовок трохи заплутаний, оскільки вам здається, що вам потрібна біективна база 62.
Денніс

Відповіді:


13

Желе , 7 байт

ØWṖṗR;/

Це монадичне посилання, яке приймає ціле число як вхідне і повертає масив рядків.

Спробуйте в Інтернеті!

Як це працює

Ø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
Коли ви писали власну мову для кодегольфа, чи не могли ви просто роздвоїти її, змінити її та використати рішення на 1 байт?
Флоріан Вендельборн

9
Ні. У нас є суворі правила щодо допустимих мов програмування. Одне з них полягає в тому, що працюючий перекладач повинен існувати до того, як виклик був опублікований. Я можу зараз додати вбудований для цього завдання, але міг би використовувати його лише у майбутніх завданнях.
Денніс

8
Як це смішно? Якби це було дозволено, кожен виклик був би вирішений 1 байтом
Зібелас

7
@UncleZeiv Кодова сторінка Jelly пов'язана в заголовку допису
edc65

7
@UncleZeiv Насправді це лише один набір символів, який є кодовою сторінкою Jelly.
isaacg

8

Haskell, 65 байт

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

Приклад використання: k 3-> ["a","b","c",....,"997","998","999"].

Як це працює

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

Пітон, 86 байт

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

Виводить список непустих рядків. Рекурсивно попереджує кожен буквено-цифровий символ до кожного виводу для n-1і порожнього рядка.


5

JavaScript (Firefox 30-57), 108 байт

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

Збережено 3 байти за допомогою toUpperCase. Обчислення 62 символів потребує додаткових 10 байт.


4
Я не можу змусити ваш код працювати, каже, що функція f не визначена.
Саймон Лендрі

1
@SimonLandry Whoops, я забув f=на початку. (Я завжди забуваю це зробити для рекурсивних відповідей.)
Ніл

Не працює з вищезгаданих причин.
CalculatorFeline

@CatsAreFluffy Я зазначаю f=, що будь-які подальші проблеми пов'язані з тим, як ви намагаєтесь викликати це.
Ніл

4

Кориця гумка, 15 байт

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

Недостатньо короткий, незважаючи на те, що саме цей виклик Коричнева жуйка була зроблена для :(

Стислий шляхом перетворення з біективної бази 96 на базу 256. Спробуйте в Інтернеті. Введення більше 2 призведе до проблем TIO.

Пояснення

Це декомпресується до регексу [a-zA-Z0-9]{1,%s}. Потім hрежим заміщає вхід в %sі видає всі рядки, що відповідають регулярному вираженню.


4

Рубін, 82 байти

Конструює декартові вироби характеру, встановлені на задану довжину. Набір символів генерується за допомогою захоплення всіх символів між 0та zта фільтрації несловесних символів, а також _.

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

4

05AB1E , 9 8 байт

Код:

ƒžj¨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

Використовує кодування CP-1252 . Спробуйте в Інтернеті! .


4

Python 2.7, 136 134 байт

Завдяки Maltysen та NonlinearFruit за збереження 2-х байт

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

Бере ascii_lettersі digitsз рядкового модуля, і використовує декартовий продукт як productз itertools для обчислення всіх комбінацій.

Вихідні дані

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
ви можете видалити пробіли між дужками та літерами.
Малтісен

Спробуйте i in range(n)зrepeat=i+1
нелінійний

+1 для негативного введення. Це вбудовано у rangeфункцію?
Кевін Кройсейсен

3

Pyth - 13 12 байт

1 байт збережено завдяки @Jakube.

sm^s+rBG1UTh

Спробуйте його онлайн тут .

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

Хороший! Хочете надати пояснення?
Саймон Лендрі

Я думав, що є команда перебирати рядки в лексикографічному порядку?
Лина монашка

@KennyLau nvm, не робить чисел.
Малтісен

rBG1зберегти один байт+GrG1
Якубе

@Jakube о, Bifurcate працює з аргументами? Спасибі.
Мальтісен


2

MATL , 12 байт

:"3Y24Y2h@Z^

Це приймає число як вхід.

Спробуйте в Інтернеті!

Пояснення

:       % 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 символ / 27 байт

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

Try it here (Firefox only).

Ні. Ні. Ні.

Пояснення

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

Перший раз, коли я бачу цю мову і не можу знайти її за допомогою Google, будь ласка, додайте посилання на свою документацію та (або) вихідний код? :)
Саймон Лендрі

1
github.com/molarmanful/ESMin
Mama Fun Roll

Чи серйозно назва мови 4 місця?
Балінт

Ні, але ваш браузер може неправильно відобразити символи подвійного коду. У ASCII це називається ESMin.
Mama Fun Roll

1

Perl, 113 байт + пробіл

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

Використовуйте "perl -E" вище, аргумент - це число. Я, напевно, міг гідно не порахувати останню "сказку на карті" у підрахунку символів.


1

J, 50 байт

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

Половина байтів, 25 точніше, витрачається на створення потрібних літер та цифр.


1

APL, 38 37 байт

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

Я маю запитати, як можна обійтись, якщо вони не можуть ЗНАЙТИ? (⎕ucs 96+⍳26),⎕d=>⎕d,⍨⎕ucs 96+⍳26
Zacharý

Я можу запевнити, що я можу їхати на маршруті (не кажу про те, щоб "регулярно здійснювати ту саму подорож між роботою та домом", бо це нудно). Ви, здається, виявили, що покращити рішення інших людей можна легко. Особливо, якщо у вас немає штатної роботи. Тоді є справжнє життя, яке робить все ще складніше ...
lstefano

0

Утиліти Bash + GNU, 90

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

Введіть як параметр командного рядка. Вихід - це розділений пробілом список.

Працює для входів upt, включаючи 3. Вичерпання пам’яті з 4 - це eval printfзаймає весь набір з 63 n елементів розширення bash.


0

Bash + GNU утиліти, 66

Інший (і я думаю, трохи новельний) підхід до моєї іншої відповіді :

dc -e"64 $1^[d2 48^r-P1-d0<m]dsmx"|base64 -w8|sed s_^/*__\;/[+/]/d
  • dcвідлічує від 2 48 -1 до 2 48 -64 n і Pпозначає кожне отримане число як бітестріл (тобто базовий 256). Якщо вхід буде від 1 до 4 включно, це гарантовано рівно 6 байт на число.
  • base64 перетворює це на вихід base64 і, таким чином, 8 байт на цифру base64, по одному на рядок.
  • sedзнімає провідні /(base64 цифра 63), а потім видаляє будь-які рядки, що містять +або /(цифри base64 62 та 63). Це залишає необхідну послідовність.

0

R , 73 байти

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

yпочинається як порожній рядок, xяк базовий регістр 'a','b','c',...,'8','9'. outerприймає кожен із своїх вхідних аргументів і застосовує функціюpaste0 до кожної комбінації елементів у yі xяка об'єднує рядки. yзберігає результат, catдрукує його і повторюється через STDIN кількість разів.

Спробуйте в Інтернеті!


0

Jq 1,5 , 97 байт

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

Розширено

  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

Спробуйте в Інтернеті!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.