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


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.

Завдяки Лінні та її приголомшливій відповіді за пораду схопити алфавіт з допомоги.

Дякуємо 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.".


Зачекайте, що як це зробити - пояснення pls? : 3
Пуховик

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 секунда? Dang ...
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прямо економить ще один байт.
планнапус

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."
Дом Гастінгс

@DomHastings Гарний, молодець. І красивіше мати одне твердження замість трьох! ;-)
Дада

4

JavaScript (ES6), 66 64 байт

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

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

Редагувати: Видалено 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

@"Оператор використовується для генерації рядка варіювалися. Він створює рядок, починаючи з лівого char коду до правого char коду.

Наприклад, чи 65є char код для 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, і ви можете також робити і неявні вставки, це лише 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>64S це залишає в буфері буде перетворена в точках ASCII код, а потім в літери. Коми вже в.
  • r.: Ніколи більше не буде в кінці, так чиніть .зараз.
  • V{g<C-A>: Використовує візуальний приріст, щоб перетворити всі 64s в кодові точки ASCII з великої літери.
  • 8Jj9Jj3Jj.j4J: Долучається довільна лінія. Перший - 8Jзамість того, 7Jщо ми маємо справу з порожнім рядком. Повторні 3Js є придатними для крапки в точці.
  • cH<C-R>": Люди зазвичай вважають i<C-R>це вставкою режиму вставки, але це більше схоже на макрос режиму вставки. Такі речі <C-V>65, як ніби введені та інтерпретуються як десятковий код. Це залишає додатковий (дозволений) рядок в кінці і залишається у режимі вставки.

4
якщо у вас є проблема з політикою (або її відсутність), займіться нею мета, а не відповіддю.
Mego

2

PowerShell v3 +, 60 78 67 байт

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

ГАРАЗД. Я справді читав, розумів і дотримувався специфікації цього разу. Обіцяти. : 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.
Олексій Хованський

Оскільки вам дозволено пробіли у кожному рядку, ви можете зберегти байт, скинувши пробіл з регулярного вираження. Також ви можете зберегти байт, використовуючи (застаріле та видалене в 7.0) ereg_replace, оскільки це дозволяє пропускати роздільники в регулярному виразі.
користувач59178

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

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

Можливо, пограбуючи - мені не подобаються багаторазові дзвінки F ...


3
Вихід у сировину становить лише 77 байт. Друк, що безпосередньо може бути коротшим ...
Лінн

@Lynn, я знаю, але тут я бачу деякі можливості для гольфу.
pajonk


2

Джулія, 71 байт

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

Для мовлення потрібно 0,5 або більше .()


З одного боку, в даний момент немає періоду відстеження, і чи не потрібно це printвизначення / функції? З іншого боку, не збереження joinзмінної економить байт.
Sp3000

У моєї поганої wrt пропущено ".", І дякую за вказівник на join. Я прорахував. Запуск програми повертає рядок. Чи не програма, що повертає рядок, є дійсним результатом? (Або лише ті функції, яким дозволено повертати речі, рахувати як вихід. Якщо так f()=коротше, ніж print())
Lyndon White

Зрозуміло, 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;}

Безголівки:

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).
Kevin Cruijssen

@KevinCruijssen спасибі, я спробував використовувати десяткові знаки, але схоже, якщо я заміню обидва константи символів у потрійному, він змінює тип виразу на ціле число, яке порушило його. Змінивши одну постійну працював і видавив кілька байт.

2
@KevinCruijssen дякую. Якби у мене було достатньо кави в мені, я б пам’ятав, щоб самому її оновити.

1
Ще 2 байти: "GPSV".contains(""+c)замість c==71|c==80|c==83|c==86.
ТНТ

1
@TNT мені вдалося зробити трохи краще. Я знав, що частину можна вдосконалити, дякую за поштовх у правильному напрямку.



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.