Теперь я знаю свои азбуку, ты не пойдешь со мной в гольф?


46

Напишите программу или функцию, которая выводит этот точный текст без учета регистра:

A, B, C, D, E, F, G,
H, I, J, K, L, M, N, O, P,
Q, R, S,
T, U, V,
W, X, Y, Z.

(На основе алфавитной песни, которую многие американские дети учат запоминать алфавит, хотя и редактируют для большей сжимаемости.)

Вывод должен выглядеть точно так же, как указано выше (опять же, без учета регистра), но может содержать завершающие пробелы в каждой строке и / или завершающие символы новой строки. Обратите внимание на период в конце.

Это код-гольф, поэтому выигрывает самый короткий код в байтах.


4
Для языков, основанных на регулярных выражениях, рассмотрим случай с шириной 0 .../(?=[HQTW])/
Волшебная урна осьминога

29
Я думал, что это было H, I, J, K, LMNO, P?
Восстановите Монику

7
Разве последняя строка не должна заканчиваться буквой «Y и Z»?
КМ.

@KM. Это обсуждалось в песочнице , и мы решили придерживаться этой версии, чтобы сделать задачу менее сложной.
ETHproductions

6
Гольф кажется скучным. Крикет лучше.
Манодж Кумар

Ответы:


15

Vim, 42 , 40 нажатий клавиш / байт

:h<_<cr>jjYZZP:s/./&, /g<cr>7f r<cr>9;.3;.3;.$ch.

Благодаря Линн и ее удивительному ответу vim за подсказку, чтобы взять алфавит из справки.

Спасибо RomanGräf за сохранение двух байтов!

Объяснение:

:h<_<cr>                                      " Open up vim-help
        jj                                    " Move down two lines
          Y                                   " Yank this line (containing the alphabet)
           ZZ                                 " Close this buffer
             P                                " Paste the line we just yanked
              :s/./&, /g<cr>                  " Replace every character with that character followed by a comma and a space
                            7f                " Find the seven space on this line
                               r<cr>          " And replace it with a newline
                                    9;        " Repeat the last search (space) 9 times
                                      .       " Repeat the last edit (replace with a newline)
                                       3;     " Third space
                                         .    " Replace with newline
                                          3;  " Third space
                                            . " Replace with newline

Затем мы перемещаем конец строки с помощью $, возвращаем символ назад chи вставляем точку.


2
Вы не должны конвертировать в верхний регистр. ФП сказал «этот точный текст, без учета регистра».
Роман Грэф

@ RomanGräf Спасибо за совет!
DJMcMayhem

Ха! Получить алфавит из справки vim - гениально! Знаете ли вы это или вы искали его для этого вызова?
Кристиан Рондо,

3
@christianRondeau Я не придумал это. Линн сделала в этом ответе
DJMcMayhem

@ RomanGräf +1 для использования не должен
FantaC

12

05AB1E , 16 байтов

Код

A',â79334S£»¨'.J

Объяснение:

A                  # Push the alphabet.
 ',â               # Cartesian product with ','.
    79334S         # Push [7, 9, 3, 3, 4].
          £        # Contigious substring, pushes the substrings [0:7], [7:7+9], 
                     [7+9:7+9+3], [7+9+3:7+9+3+3], [7+9+3+3:7+9+3+3+4].
           »       # Gridify, join the inner arrays with spaces and join those arrays
                     with newlines.
            ¨      # Remove the last character.
             '.J   # Append a '.'-character.

Использует кодировку CP-1252 . Попробуйте онлайн!



11

JavaScript (ES6), 66 65 байт

Бить @Neil было невозможно ... Вот почему я это сделал. :-)

f=(i=10)=>i>34?"z.":i.toString(++i)+","+` 
`[9568512>>i-9&1]+f(i)

Гольф 1 байт благодаря трюку от @LevelRiverSt . Использование String.fromCharCodeна 7 байт длиннее:

f=(i=65)=>i>89?"Z.":String.fromCharCode(i,44,i%86%83%80%71?32:10)+f(i+1)

Как это устроено

Это рекурсивно генерирует каждый символ алфавита от aдо y, используя .toString(). Запятая добавляется после каждой буквы, плюс символ новой строки, если 9568512>>i-9&1равен 1, или пробел в противном случае. Когда рекурсия доходит до 34, то есть до z, функция просто возвращается "z.".


Подождите, что, как это даже - объяснение, пожалуйста? : 3
Downgoat

10

Python 2,7, 67 66 63 байта

a=65;exec"print'%c'%a+',.'[a>89]+'\\n'[a%42%39%9^2:],;a+=1;"*26

Деннис сохранил байт.


Использование execвместо forдолжно сохранить байт.
Деннис

6

Желе , 19 18 байт

ØAp”,ṁ79334DR¤GṖ”.

Спасибо @Adnan за вывод 1 байта!

Попробуйте онлайн!

Как это устроено

ØAp”,ṁ79334DR¤GṖ”.  Main link. No arguments.

ØA                  Yield "ABCDEFGHIJKLMNOPQRSTUVWXYZ".
  p”,               Cartesian product with ','; append a comma to each letter.
             ¤      Combine the two links to the left into a niladic chain.
      79334D          Decimal; yield [7, 9, 3, 3, 4].
            R         Range; yield [[1, 2, 3, 4, 5, 6, 7], ..., [1, 2, 3, 4]].
     ṁ              Mold; reshape the array of letters with commata like the
                    generated 2D array.
              G     Grid; separate rows by spaces, columns by linefeeds.
               Ṗ    Pop; discard the last comma.
                ”.  Print the previous result and set the return value to '.'.
                     (implicit) Print the return value.

11
31 секунд? Черт ...
ETHproductions

5

JavaScript (ES6), 80 74 байта

_=>[...`ABCDEFGHIJKLMNOPQRSTUVWXYZ`].join`, `.replace(/[HQTW]/g,`
$&`)+`.`

Вероятно, можно сократить это с помощью atob / btoa, если вы сможете понять, как использовать кодировку ISO-8859-1. Изменить: Сохранено 6 байтов благодаря @RickHitchcock.


1
@RickHitchcock Да, я только что понял это после прочтения ответа PHP.
Нил

@RickHitchcock Вы хотели .join`, `? Положите обратную косую черту перед чертами. (Да, комментарий уценки отличается, вздох ...)
Нил


5

R, 83 71 байт

a=rbind(LETTERS[-26],","," ");a[3,7+3*c(0,3:5)]="\n";cat(a,"Z.",sep="")

Попробуйте онлайн!

Создает матрицу из 3 строк (одна с буквами, одна с запятыми, а другая с пробелом или переводом строки).

Редактировать : Спасибо, Billywob!


cat(a,sep="")сохраняет несколько байтов:a=rbind(LETTERS,","," ");a[3,7+3*c(0,3:5)]="\n";cat(a[,-26],"Z.",sep="")
Billywob

Спасибо! Это очень помогло! Использование [-26]on LETTERSнапрямую сохраняет еще один байт.
plannapus

4

CJam, 26 байт

'A79333Ab{{',S2$)}*N\}/'.@

Онлайн переводчик

'A                             Push 'A'
  79333Ab                      Push [7 9 3 3 3]
         {           }/        For each number n in the previous array...
          {      }*              Execute n times...
           ',S                     Push a comma and a space
              2$)                  Copy last letter and increment
                   N\            Place a newline under the letter on top
                       '.@     Push '.' and rotate

4

Brainfuck, 117 байт

+[++[-<]-[->->]<]+++[->++>+++>+>+<<<<<--<<->>>]>+[[-<<<<<+.>-.+>.>>>]>[[-<+>]>]<<[<]<.>>]<<-[---<<<+.>-.+>.>]<<<+.>+.

Каждая из первых четырех строк имеет завершающий пробел, и программа принимает 8-битные ячейки. Попробуйте онлайн!

(Обработка последней строки сложно ...)


4

Perl, 37 байт

Кредиты @Dom Hastings для этого решения (на 3 байта меньше моего, см. Ниже).

say+(map"$_, ".$/x/[GPSV]/,A..Y),"Z."

Запустить с -E(или -M5.010) флагом:

perl -E 'say+(map"$_, ".$/x/[GPSV]/,A..Y),"Z."'

Моя предыдущая версия, на 3 байта длиннее (всего 40 байтов):

perl -E '$_=join", ",A..Z;s/[HQTW]/\n$&/g;say"$_."'

1
Немного другой подход (все еще использует регулярное выражение ...) для 37 байтов:say+(map"$_, ".$/x/[GPSV]/,A..Y),"Z."
Dom Hastings

@DomHastings Хороший, молодец. И прекраснее иметь одно утверждение вместо трех! ;-)
Дада

4

JavaScript (ES6), 66 64 байта

_=>`ABCDEFG
HIJKLMNOP
QRS
TUV
WXY`.replace(/./g,"$&, ")+"Z."

Регулярное выражение соответствует символам, но не символу возврата каретки, поэтому, используя регулярное выражение замены, я могу добавить «,» к каждому символу.

Редактировать: удалено 2 символа благодаря ETHProductions


1
Я понятия не имею, почему другие игроки в гольф JS не пошли для этого решения сначала. Здесь есть голосование.
Mama Fun Roll

1
Черт, милый! Я думаю, что вы можете удалить паренсы в регулярном выражении, если вы измените $1на $&.
ETHproductions

3

Чеддер, 70 байт

->[65@"71,72@"80,"QRS","TUV","WXYZ"].map(@.chars.join(", ")).vfuse+'.'

Похоже, он не становится короче этого. Я сделал другие версии этого, которые используют довольно интересные методы, но это самый короткий

Попробуйте онлайн!

объяснение

->                        // Function with no arguments
  [                       // Array, each item represents a line
   65@"71,                // See below on what @" does
   72@"80,
   "QRS",
   "TUV",
   "WXYZ"
  ].map(                  // On each item...
    @.chars.join(", ")    // Join the characters on ", "
  ).vfuse                 // Vertical fuse or join by newlines
  + '.'                   // The period at the end

@"Оператор используется для генерации строки варьировались. Он генерирует строку, начиная с левого кода символа до правого кода символа.

Например, 65это код символа для Aи 90для Z. Выполнение 65 @" 90будет генерировать от A до Z или алфавит.


3

C, 112 102 81 байт

Благодаря cleblanc & LevelRiverSt!

i,c;main(){for(c=64;++c<91;)printf("%c%c%c",c,44+c/90*2,c=="‌​GPSVZ"[i]?++i,10:32)‌​;}

Хорошее решение. Вы можете сохранить несколько байтов, так как 44 на 1 меньше, чем ',' и 46 на 1 меньше, чем '.'
cleblanc

Нет необходимости объявлять int, и вы также можете сделать can d неявными int, это всего лишь 101 байтi,c,d;main(){for(c=65;c<91;++c){if(c-"GPSVZ"[i])d=32;else d=10,++i;printf("%c%c%c",c,c-90?44:46,d);}}
cleblanc

Вы можете получить этот подход до 82 байт: i,c;main(){for(c=64;++c<91;)printf("%c%c%c",c,44+c/90*2,c=="GPSVZ"[i]?++i,10:32);}. Обратите внимание, что между ?:троичным оператором можно вставить абсолютно все , даже несколько выражений, разделенных запятыми (оно вычисляется до последнего).
Level River St


3

Рубин, 56 54 байта

$><<(?A..?Y).map{|c|c+('GPSV'[c]?",
":", ")}.join+"Z."

Первая строка заканчивается буквальным переводом строки.

Изменить: сохранить два байта, заменив 'A'..'Y'на ?A..?Y.


3

Vim, 32 байта

26o<C-V><C-V>64,<Esc>r.V{g<C-A>8Jj9Jj3Jj.j4JcH<C-R>"

Оставляет пустую строку в конце, что было разрешено, но странно быть таким неуклюжим. Еще хуже, я заканчиваю в режиме вставки. Я видел, как некоторые другие люди делают это здесь, так что я думаю, что это разрешено? Это грязно.

  • 26o<C-V><C-V>64,<Esc>: Первый <C-V>буквально вставляет второй. То, что <C-V>64это оставляет в буфере, будет преобразовано в кодовые точки ASCII, а затем в буквы. Запятые уже в.
  • r.: Никогда не будет в конце снова, так что сделайте .сейчас.
  • V{g<C-A>: Использует визуальное приращение, чтобы превратить все 64s в кодовые точки ASCII заглавных букв.
  • 8Jj9Jj3Jj.j4J: Произвольная строка присоединяется. Первый 8Jвместо того, 7Jпотому что мы имеем дело с пустой строкой. Повторные 3Js имеют право на точечный повтор.
  • cH<C-R>"Люди обычно думают о i<C-R>вставке в режиме вставки, но это больше похоже на макрос в режиме вставки. Stuff like <C-V>65будет работать так, как если бы он был напечатан, и интерпретировался как десятичная точка кода. Это оставляет дополнительную (разрешенную) строку в конце и остается в режиме вставки.

4
если у вас есть проблема с политикой (или ее отсутствие), воспользуйтесь мета, а не ответом.
Mego

2

PowerShell v3 +, 60 78 67 байт

-join(65..90|%{[char]$_+'.,'[$_-le89]+" "+"`n"*($_-in71,80,83,86)})

ХОРОШО. На самом деле я прочитал, понял и следовал спецификации на этот раз. Promise. : D

Принимает массив 65..90и циклы над каждым элементом |%{...}. На каждой итерации мы создаем новую строку, используя конкатенацию, индексирование и умножение.

Сначала мы берем текущее число и приводим charего к ASCII-букве. Он объединяется с другим символом, основанным на индексации строки '.,'независимо от того, находимся мы 90или нет (т. Е. Для учета, Z.когда все остальные запятые). Это строка, объединенная с " "разделением пробелов буквами, и умножение строк на "`n"основе логического значения для определения того, является ли текущий элемент -inуказанным массивом (т. Е. Нужно ли нам объединять символ новой строки). Полученная строка остается на конвейере.

Эти строки инкапсулируются в паренах и -joinобъединяются в новую строку, которая затем также остается в конвейере и неявно Write-Outputв конце печатает результат. Поскольку у нас есть `nстрока, она автоматически преобразуется в новые строки после печати.

Требуется v3 + для -inоператора. Имеет пробел в каждой строке, что соответствует требованиям спецификации.

пример

PS C:\Tools\Scripts\golfing> .\now-i-know-my-abc.ps1
A, B, C, D, E, F, G, 
H, I, J, K, L, M, N, O, P, 
Q, R, S, 
T, U, V, 
W, X, Y, Z. 

1
Период в конце отсутствует.
вниз

Не должно ли быть запятая в конце первых четырех строк?
Нил

@Neil Хороший соус. Я собираюсь удалить это, пока я не смогу понять спецификацию.
AdmBorkBork

2

PHP, 62 байта

<?=preg_filter("# ([HQTW])#","\n$1",join(", ",range(A,Z)));?>.

только для сравнения 87 байт

<?="A, B, C, D, E, F, G,\nH, I, J, K, L, M, N, O, P,\nQ, R, S,\nT, U, V,\nW, X, Y, Z.";

Вы можете сохранить байт, используя фактическую новую строку вместо \n.
Алекс Ховански

Поскольку вам разрешено завершать пробелы в каждой строке, вы можете сохранить байт, удалив пробел из регулярного выражения. Также вы можете сохранить байт, используя ereg_replace (устарел и удален в 7.0), поскольку он позволяет пропустить разделители в регулярном выражении.
user59178

@ user59178 Я мог бы сохранить 3 байта, но я бы избежал этого. Да, место для пробега разрешено. Я мог бы написать как регулярное выражение "# (?=[HQTW])#"и сократить замену на те "\n"же байты и сделать это более понятным. Использование устаревшей функции может запутать новичков. И физический разрыв может быть неверно истолкован в других системах, кроме Unix. Вы можете опубликовать его как свой собственный sugesstion.
Йорг Хюльсерманн,

2

MATL, 38 29 байт

9 байтов сохранено благодаря @Luis!

1Y2X{', '&Zc46h1[CEII]I*11hY{

Попробуйте онлайн!

объяснение

1Y2     % Push the upper-case alphabet to the stack
X{      % Break the character array into a cell array (similar to a list)
        % where each element is a letter
', '&Zc % Combine back into a string with ', ' between each element
46h     % Append '.' (via ASCII code) to the end of the string
1       % Push the number 1
[CEII]  % Push the array: [7, 9, 3, 3]
I*      % Multiply this array by 3: [21, 27, 9, 9]  
llh     % Append an 11 to this array: [21, 27, 9, 9, 11] 
Y{      % Break our comma-separated list of characters into groups of this size
        % Implicitly display the result

2

R, 146 байт

L=LETTERS
f=function(x,y=""){paste(x,collapse=paste0(", ",y))}
cat(f(c(f(L[1:7]),f(L[8:16]),f(L[17:19]),f(L[20:22]),f(L[23:26])),"\n"),".",sep="")

Объяснение:

LETTERSпредопределено для заглавных букв. Функция для конкатенации вектора й на с дополнительным (используется для переноса строк). Кошка используется, поскольку это печатает как переводы строки. вызывается на буквы, чтобы сформировать строки, а затем снова на строки, чтобы сформировать весь вывод.
f,y
\nf

Вероятно, игра в гольф - мне не нравятся множественные звонки ...


3
Необработанный вывод имеет длину всего 77 байтов. Печать, которая напрямую может быть короче ...
Линн

@ Линн, я знаю, но здесь я вижу некоторые возможности игры в гольф.
pajonk

2

CJam, 31 байт

'[,65>", "*7933Ab{3*/(\:+}%N*'.

Объяснение:

'[,65>                             push uppercase alphabet
      ", "*                        ", " between all letters
           7933Ab                  push [7 9 3 3]
                 {3*/(\:+}%        slices of lengths 21, 27, 9, 9
                           N*'.    join slices with newlines, add final "."

Попробуйте онлайн


2

Юлия, 71 байт

f()=join(join.(['A':'G','H':'P',"QRS","TUV","WXYZ"],[", "]),",\n")*"."

Требуется 0,5 или выше для трансляции .()


С одной стороны, у этого в настоящее время нет завершающего периода, и не нуждается ли в printопределении / function? С другой стороны, не сохранение joinв переменную сохраняет байт.
Sp3000

Мой плохой по поводу пропуска ".", И спасибо за указатель на join. Я не учел Запущенная программа возвращает строку. Разве программа не возвращает строку верный вывод? (Или это только функции, которым разрешено возвращать вещи для подсчета в качестве выходных данных. Если это так f()=, короче print())
Линдон Уайт

Конечно, f()=или ()->хорошо - я думаю, что идея заключается в том, что функции могут быть назначены и могут запускаться несколько раз, и, напротив, это будет фрагмент кода.
Sp3000

2

Чеддер, 57 байт

->(65@"90).sub(/[GPSV]/g,"$0
").sub(/[^Z\n]/g,"$0, ")+"."

Попробуйте онлайн! Разве это не красиво? Это хороший прямоугольник.

Две подстановки регулярных выражений. (65@"90)является заглавным алфавитом, .sub(/[GPSV]/g,"$0\n")заменяет GPSVсобой и "\n", .sub(/[^Z\n]/g,"$0, ")заменяет собой все Zсимволы, не являющиеся символом новой строки, и собой ", ", и "."добавляет финал ..


1
Хорошая техника и отличная работа вне игры Downgoat;)
ETHproductions

2

Japt, 24 байта

;B¬qJ+S r"[HQTW]"@R+XÃ+L

Проверьте это онлайн!

Как это устроено

;                        // Reset various variables. B is set to "ABC...XYZ", J is set to ",", and L is set to ".".
 B¬                      // Take the uppercase alphabet and split into chars.
   qJ+S                  // Join with ", ".
        r"[HQTW]"        // Replace each H, Q, T, or W with
                 @R+XÃ   //   a newline plus the character.
                      +L // Append a period to the result.
                         // Implicit: output last expression

2

Ява, 116 109 105 104

String f(){String s="";for(char c=65;c<91;)s=s+c+(c>89?46:',')+("GPSV".indexOf(c++)<0?' ':10);return s;}

Ungolfed:

String f() {
  String s = "";
  for (char c = 65; c < 91;) {
    s = s + c
      + (c > 89 ? 46 : ',')
      + ("GPSV".indexOf(c++) < 0 ? ' ' : 10);
  }
  return s;
}

Вы можете сыграть в гольф на 7 байтов: все три ||до |(-3); меняется c==90на c>89(-1); меняется '.'на 46(-1); и меняется '\n'на 10(-2).
Кевин Круйссен

@KevinCruijssen спасибо, я попытался использовать десятичные дроби, но, похоже, если я заменю обе символьные константы в троичной, это изменит тип выражения на целое число, что сломало его. Изменение одной константы сработало и выдавило несколько байтов.

2
@KevinCruijssen спасибо. Если бы у меня было достаточно кофе, я бы вспомнил, чтобы обновить его сам.

1
Еще 2 байта: "GPSV".contains(""+c)вместо c==71|c==80|c==83|c==86.
TNT

1
@TNT Я смог сделать немного лучше. Я знал, что эта часть может быть улучшена, спасибо за толчок в правильном направлении.


1

Сетчатка, 43 байта


Z
{2`
$`
}T01`L`_L
.
$&, 
[HQTW]
¶$&
, $
.

Ведущий перевод строки является значительным. Попробуйте онлайн!

Я впервые использую Retina, поэтому любые советы по игре в гольф приветствуются ...


1

Pyth, 25 байт

+Pjmj\ dc*G\,j94092 23)\.

Программа, которая печатает результат в STDOUT.

Попробуйте онлайн

Как это устроено

+Pjmj\ dc*G\,j94092 23)\.  Program. Input: none
          G                Yield string literal'abcdefghijklmnopqrstuvwxyz'
         * \,              Cartesian product of that with ',', yielding a list of
                           characters with appended commas
             j94092 23)    Yield the integer 94092 in base-23, giving [7, 16, 19, 22]
        c                  Split the comma-appended character list at those indices
   mj\                     Join each element of that on spaces
  j                        Join that on newlines
 P                         All but the last element of that, removing trailing ','
+                      \.  Append '.'
                           Implicitly print
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.