Створіть шрифт з 6 символів з алфавіту з 15 символів


17

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

Ваше завдання - побити нас, що, без сумніву, не займе багато часу!

Оригінальний алгоритм використовував алфавіт 0-9A-E, але ми експериментували з іншими алфавітами. Тому існує три підзадачі.

  1. Створіть 6символьний рядок випадковим чином, вибираючи з довільного 15алфавіту символів жорсткого коду, як ABC123!@TPOI098. (Це лише приклад, і його можна налаштувати, не впливаючи на кількість байтів.)
  2. Створіть 6символьний рядок випадковим чином, вибираючи з 15алфавіту символів 0123456789ABCDE.
  3. Створіть 6символьний рядок випадковим чином, вибираючи з 15алфавіту символів на ваш вибір (друкувати символи, будь ласка).

Кожен персонаж повинен мати рівні шанси на вибір, а повторення повинно бути можливим.

Найкраще, що ми змогли керувати для кожного з підзадач:

  • "ABC123! @ TPOI098" - 24 bytes
  • "0123456789ABCDE" - 21 bytes
  • Спеціальний алфавіт - 13 bytes

Ваш бал - це сума байтів у рішенні кожного підзадачі. тобто наш бал наразі 58.

Ми намагалися використовувати серед інших CJam та Ruby. Оригінал був у C #. Використовуйте будь-яку мову, яка вам подобається, але нам буде цікаво бачити рішення саме на цих мовах


5
Щодо викликів, що складаються з багатьох частин. На жаль, я не маю гарного рішення в цьому випадку, оскільки ці три підзадачі є занадто схожими на нього, щоб мати сенс розділити їх на кілька проблем. Я також розглядав можливість запропонувати виняток із цієї політики для викликів у різних частинах, коли підзадачі є лише незначними варіантами однієї проблеми. (Хоча це все ще має проблему, що підрозділи можна взяти з інших відповідей.) Тож я не буду це забивати, і дивитись, що думає громада.
Мартін Ендер

"Ваш бал - це сума байтів ...", тому мій перший приклад нещасний. Я поправлюсь на інший потенційний приклад
James Webster

2
@MartinEnder Мої 2 копійки: я думаю, що це нормально і не буде VTC. Звичайно, я, як правило, вважаю, що завдання з одним цікавим завданням краще, але оскільки ці завдання дуже схожі, це набагато краще, ніж "поле для гольфу", яке говорить "виконати ці 8 випадкових непов'язаних завдань". Незважаючи на те, що між завданнями немає взаємодії, в моїх очах цей виклик не дуже відрізняється, ніж скажімо Golf у 16 ​​логічних воротах .
DJMcMayhem

Чи є обмеження часу або пам’яті? Чи повинні підзадачі бути незалежними чи їм дозволено ділитися кодом?
Денніс

2
Чи означає "генерувати рядок", що код має насправді генерувати значення рядка з відповідними символами в ньому, або виводиться шість знаків (не розділених пробілом чи новими рядками) прийнятними?
DLosc

Відповіді:


6

Желе , 38 байт

TryItOnline посилання A , B і C .

A :,ABC123!@£POI09822 байти

“ABC123!@£POI098”Wẋ6X€

(думаючи про стиснення, щоб зменшити цю)

B :,0123456789ABCDE8 байт:

ØHṖWẋ6X€

C :123456789ABCDEF(вибір), 8 байт:

ØHḊWẋ6X€

Як?

...Wẋ6X€ - common theme
   W     - wrap (string) in a list
    ẋ6   - repeat six times
      X€ - random choice from €ach

ØH...... - hexadecimal digit yield: "0123456789ABCDEF"

..Ṗ..... - pop: z[:-1] (B)

..Ḋ..... - dequeue: z[1:] (C)

8

CJam (23 + 14 + 10 = 47 байт)

Довільний алфавіт: 23 байти ( онлайн-демонстрація )

{"ABC123!@TPOI098"mR}6*

Шістнадцятковий алфавіт: 14 байт ( онлайн-демонстрація )

{FmrAbHb'0+}6*

Спеціальний алфавіт:, ABCDEFGHIJKLMNO10 байт ( демонстрація в Інтернеті )

{Fmr'A+}6*

Розсічення

Цікавим є шістнадцятковий:

{      e# Loop...
  Fmr  e#   Select a random number from 0 to 14
  AbHb e#   Convert to base 10 and then to base 17
       e#   (i.e. add 7 if the number is greater than 9)
  '0+  e#   Add character '0' (i.e. add 48 and convert from integer to character)
       e#   Note that 'A' - '0' = 17
}6*    e# ...six times

Шість знаків залишаються на стеку і друкуються автоматично.


2
AbHbгеніальний. Я думав про той загальний підхід, але _9>7*+був занадто довгим.
Мартін Ендер

6

Perl, 46 + 26 + 26 = 98 байт

Багато кредитів припадає на @Dom Hastings за економію 13 байт!

3 програми майже однакові, за винятком алфавіту, який змінюється.

  • Жорсткий алфавіт ( ABC123!@)POI098у цьому прикладі) -> 46 байт:

    say map{substr"ABC123!@)POI098",15*rand,1}1..6

  • Фіксований алфавіт 0123456789ABCDE-> 26 байт:

    printf"%X",rand 15for 1..6

  • Спеціальний алфавіт 0123456789ABCDEу цьому випадку -> 26 байт:

    printf"%X",rand 15for 1..6

Ви можете помістити їх у файл для запуску:

$ cat 6chr_strings.pl
say map{substr"ABC123!@)POI098",15*rand,1}1..6;
say "";
printf"%X",rand 15for 1..6;
say "";
printf"%X",rand 15for 1..6;
say "";
$ perl -M5.010 6chr_string.pl
CB8!8!
24D582
9ED58C

( say "";якраз тут, щоб покращити вихідний формат)


2
Гарні відповіді! У мене було майже те саме для першого і останнього, але ви можете зберегти байт, використовуючи say: say map{("ABC123!@)POI098"=~/./g)[rand 15]}1..6і say map{(A..O)[rand 15]}1..6. Для другого ви можете використовувати printf: printf"%X",rand 15for 1..6щоб заощадити 11 на всіх! Я впевнений, що Тон може порадити якусь таємничу магію, щоб заощадити більше!
Дом Гастінгс

1
Насправді з користувацьким алфавітом substrзберігається ще одне:say map{substr"ABC123!@)POI098",15*rand,1}1..6
Дом Гастінгс

1
@DomHastings Хм, справді, це приємно, добре зіграно! Дякую :-)
Дада

2
Мені подобається, що ви видалили примітку про простий код: D
Дом Гастінгс

@DomHastings з printf"%X", substr..randі map, це трохи менш очевидно, тому я дозволяю людям насолоджуватися перл магією без спойлерів! : D
Дада

4

R, 33 + 43 + 59 = 135 байт

Довільний жорстко закодований алфавіт (змінити рядок, щоб змінити алфавіт):

cat(sample(strsplit("ABC123!@TPOI098","")[[1]],6,1),sep="")

Алфавіт [0-9A-E]:

cat(sample(c(0:9,LETTERS[1:6]),6,1),sep="")

Визначений користувачем алфавіт від stdin:

cat(sample(scan(,''),6,1),sep="")

У всіх випадках друкується вихідне слово до stdout.


4

JavaScript (ES6), 167 166 164 163 байт

Збережено 1 байт завдяки Нілу
Збережено 2 байти завдяки ETHproductions
Збережено 1 байт завдяки premek.v

Твердий код: "ABC123!@TPOI098" (58 байт)

f=(n=6)=>n?"ABC123!@TPOI098"[Math.random()*15|0]+f(n-1):''

Виправлено: "0123456789ABCDE" ( 58 57 байт)

f=(n=6)=>n?f(n-1)+("ABCDE"[n=Math.random()*15|0]||n-5):''

Спеціальний: "()+.1=>?M[afhnt" ( 51 49 48 байт)

f=(n=6)=>n?(f+1)[Math.random()*15|0+5]+f(n-1):''

1
(n=6)=>n?f(n-1)+("ABCDE"[n=Math.random()*15|0]||n-5):''економить вам байт.
Ніл

1/8+Mathчудово :)
ETHproductions

Але .1+JSONкраще;)
ETHproductions

1
Або JSON+f( [object JSON](n=> " (JNOS[]bcejnot")
ETHproductions

@ETHproductions Гарний. :)
Арнольд

3

JavaScript (ES6), 184 байти

Спеціальний алфавіт: 66 байт

_=>"......".replace(/./g,c=>"ABC123!@TPOI098"[Math.random()*15|0])

0-9A-E: 63 байти

_=>"......".replace(/./g,c=>"ABCDE"[n=Math.random()*15|0]||n-5)

0-9a-e: 55 байт

_=>(Math.random()*11390625+1e8|0).toString(15).slice(1)

(Віднімайте 6 байт, якщо допустима випадковість на основі дати.)


Ви можете зберегти байт на останньому за допомогою **:_=>((Math.random()+1)*15**6|0).toString(15).slice(1)
ETHproductions

@ETHproductions Напевно, це зробить це ES7, а не ES6? (Також для мене це схоже на 3-байтну економію.)
Ніл

Так, і, схоже, зберігається 3 байти. Я, мабуть, включив f=у число байтів
ETHproductions

3

q, 42 байти

А

19 байт

6?"ABC123!@TPOI098"

Б

14 байт

6?15#.Q.n,.Q.A

С

9 байт

6?15#.Q.a

(використовує перші п'ятнадцять літер алфавіту)



2

CJam, 48 байт

Довільний алфавіт, 23 байти:

{"ABC123!@TPOI098"mR}6*

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

Шістнадцяткові цифри, 15 байт:

{A,'F,65>+mR}6*

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

Алфавіт ABCDEFGHIJKLMNO, 10 байт:

{Fmr'A+}6*

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


У мене була погана ідея. Якщо ми вважаємо U + FFFE символом, ~cзамість того , щоб 'A+повернути щось технічно для друку.
jimmy23013

Можливо, я помиляюся. Я не знайшов визначення символів Unicode для друку.
jimmy23013

2

Рубін 47 + 37 + 31 = 115

Жорсткий текст: "ABC123! @ TPOI098" (47)

(1..6).map{"5CABC123!@TPOI098".chars.sample}*''

Виправлено: "0123456789ABCDE" (37)

(1..6).map{[*0..9,*?A..?E].sample}*''

Звичай: "ABCDEFGHIJKLMNO" (31)

(1..6).map{[*?A..?O].sample}*''


1

Python 2, 70 + 70 + 64 = 204 байт

from random import*
s=""
exec"s+=choice('ABC123!@TPOI098');"*6
print s

from random import*
s=""
exec"s+=choice('0123456789ABCDE');"*6
print s

from random import*
s=""
exec"s+=chr(randint(65,80));"*6
print s

На жаль, другий приклад простіше з першим методом, ніж щось подібне choice([randint(48,57)),choice(65,69)])


Для чого ви використовуєте from random import*? Я думаю, ви можете використовувати import randomі random.choiceпринаймні в перших двох прикладах.
Роман Ґраф

import random random.choice27, але from random import* choice26, також import random as r r.choice27
Карл Напф

Що стосується шістнадцяткового випадку, ми можемо зробити трохи краще, використовуючи format(randrange(8**8),'X'), я думаю.
DSM

@DSM проблема полягає в тому, що їх не повинно бутиF
Карл Напф


1

J, 24 + 24 + 18 10 = 58 байт

8 байт збережено завдяки милям!

'ABC123!@TPOI098'{~?6#15
'0123456789ABCDE'{~?6#15
u:65+?6#15

Так, другий рядок не легко стислимий у J:

u:47+23#.inv 12670682677028904639x
u:47+;(+i.@])/"1&.>1 10;18 5
('ABCDE',~1":i.10)
(toupper,hfd?6#15)
'0123456789ABCDE'

Якщо шістнадцятковий алфавіт добре, тоді є ,hfd?6#159 байт, як зазначає @miles.

Так чи інакше, ?6#15це 6 випадкових чисел між 0 і 15; {~є взяття. u:перетворює числа в символи. Останній приклад кодуєABCDEFGHIJKLMNOP .

Бонус: загальний випадок

{~6?@##

{~6?@## приблизно:

{~6?@##  input: y
      #  length of y
  6  #   six copies of the length
   ?@    random numbers between 0 and the length
{~       taken from y

У другому випадку є вбудована назва, hfdяка перетворюється на h ex f rom d ecimal. Ви можете отримати 9-байтний розчин, використовуючи ,hfd?6#15. Останній випадок, просто щоб щось легко прочитати, він використовує алфавіт з 'A'10-байтового рішення u:65+?6#15, в цілому 24 + 9 + 10 = 45.
миль

@miles Я думаю, що для другого випадку потрібні великі літери. Щодо останнього випадку ... ха-ха, ой. Я повністю забув про векторне додавання.
Conor O'Brien

1

PHP, 46 + 36 + 35 = 117 байт

Жорсткий (46 байт)

for(;$i++<6;)echo"ABC123!@TPOI098"[rand()%15];

(47 байт)

for(;$i++<6;)echo"ABC123!@TPOI098"[rand(0,14)];

Шістнадцятковий (малий) (36 байт)

for(;$j++<6;)echo dechex(rand()%15);

У верхньому регістрі - 46 байт із твердо кодованою версією.

Спеціальний (AO) (35 байт)

for(;$k++<6;)echo chr(rand(65,79));

Я не думаю, що я можу прийняти вашу другу частину. ae - це не те саме, що AE
James Webster

0

Скала, 154 байти

Алфавіт із твердим кодом (54 байти):

Seq.fill(6)("ABC123!@TPOI098"((math.random*14).toInt))

Шестнадцятковий алфавіт (54 байти):

Seq.fill(6)("0123456789ABCDE"((math.random*14).toInt))

Спеціальний алфавіт ABCDEFGHIJKLMNO(47 байт):

Seq.fill(6)(('A'to'O')((math.random*14).toInt))

Пояснення:

Seq.fill(6)(               //build a sequence of 6 elements, where each element is...
  "ABC123!@TPOI098"(         //from the string
    (math.random*14).toInt   //take a random char
  )
)

'A'to'O' створює послідовність з 15 символів, від А до О


0

Піп , 42 байти

Алфавіт із твердим кодом, 22 байти:

L6ORC"ABC123!@TPOI098"

Шістнадцяткові цифри, 11 байт:

L6ORR15TB16

Перші 15 малих літер, 9 байт:

L6Oz@RR15

Пояснення

Всі три програми починаються з L6O : циклу 6 разів та виведення заданого вираження.

  • RC"...": Випадковий вибір персонажа з жорстко закодованого рядка
  • RR15TB16: RandRange (15), перетворений на Базу 16
  • z@RR15: алфавіт з малих літер z, індексований RandRange (15)

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



0

Джольф, 26 + 14 + 13 = 51 байт

Μ*S6d rG"ABC123!@TPOI098"E

Спеціальний алфавіт, 24 байти. Спробуйте тут!

Μ*S6d r lp^0wά

Алфавіт 0-9A-E, 14 байт. Спробуйте тут! lp^0wάє lp(0-Z) нарізаний ( l) від 0до 15( ).

Μ*S6d r lp^1ά

1-9A-F алфавіт, 13 байт. Спробуйте тут! lp^1άте саме, що вище, за винятком від 1до 16.


Загальний метод:

Μ*S6d r
M*S6d      map six newlines over this function:
      r    select random element from array.

Інші спроби (за допомогою стискання рядків):

Μ*S6d rGμpwΞ $AE

0

PowerShell v2 +, 45 + 44 + 37 = 126 байт

Фіксований алфавіт, 45 байт

-join(0..5|%{'ABC123!@TPOI098'[(Random)%15]})

Абетка майже шістнадцяткової, 44 байти

-join[char[]](0..5|%{Random(48..57+65..69)})

Спеціальний алфавіт (від A до O), 37 байт

-join[char[]](0..5|%{Random(65..79)})

Усі вони дотримуються одного і того ж шаблону - цикл від 0до 5, кожна ітерація вибирає Randomсимвол або значення ASCII, charпереводячи це як- масив, якщо необхідно, і-join об'єднуючи його в рядок. Ця рядок залишена на конвеєрі, а вихід неявний.


Приклади

PS C:\Tools\Scripts\golfing> -join(0..5|%{'ABC123!@TPOI098'[(Random)%15]})
32ATB3

PS C:\Tools\Scripts\golfing> -join(0..5|%{'ABC123!@TPOI098'[(Random)%15]})
III@B2

PS C:\Tools\Scripts\golfing> -join(0..5|%{'ABC123!@TPOI098'[(Random)%15]})
@302O@

PS C:\Tools\Scripts\golfing> -join[char[]](0..5|%{Random(48..57+65..69)})
74E117

PS C:\Tools\Scripts\golfing> -join[char[]](0..5|%{Random(48..57+65..69)})
09D7DD

PS C:\Tools\Scripts\golfing> -join[char[]](0..5|%{Random(65..79)})
COJDFI

PS C:\Tools\Scripts\golfing> -join[char[]](0..5|%{Random(65..79)})
EAKCNJ

-1

Пайк, 35 байт

Арбітражний алфавіт, 20 байт

6V"ABC123!@TPOI098"H

Спробуйте тут!

Шестнадцятковий алфавіт, 8 байт

6V~J15<H

Спробуйте тут!

~J15< - "0123456789abcdefghijklmno..."[:15]

Спеціальний алфавіт, 7 байт

6VG15<H

Спробуйте тут!

G15< - alphabet[:15]

Вибраний алфавіт: abcdefghijklmno

6V     - repeat 6 times:
  ...  -   get alphabet
     H -  choose_random(^)

Здається, виводиться 6 знаків, розділених новою лінією замість 6-знакової рядка.
Емінья

Питання не визначає формат виводу.
Блакитний

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