Создать алфавит с 4 копиями каждой буквы


27

Обратите внимание, что это не то же самое, что Печать алфавита четыре раза .

Эта задача состоит в том, чтобы написать программу для генерации четырех копий каждой буквы английского алфавита, по одной букве в строке, на стандартном выводе:

A
A
A
A
B
B
B
B

и т.п.

Вывод должен включать переводы строк после каждой буквы.

Прописные буквы без дополнительного вывода являются предпочтительными; однако строчные буквы и / или лишние пробелы допустимы, если использование заглавных букв / зачисток удлинит ваше решение.

Отредактировано ДОБАВИТЬ: решение должно быть достаточно полным, чтобы выполнить. Я должен иметь возможность вызывать реализацию языка, вставлять код из ответа и получать результаты, не вводя никакого дополнительного кода.

Вышеупомянутый вопрос о полноте возник в контексте решения C. Конечно, должно быть постоянное правило или соглашение об этом на сайте игры в гольф кода? Если это так, я с радостью уступлю руководящим принципам сообщества. Но это мое мнение:

  1. Что касается C, вам нужно включить (и сосчитать) main(){... }код, так как иначе он не скомпилируется. Предупреждения, потому что нет #include <stdio.h>, хороши, пока код все еще компилируется. В общем случае для компилируемого языка требуется компилируемый модуль.

  2. Голое выражение, которое дает желаемые результаты, приемлемо, если есть способ выполнить выражение напрямую; например, если у языка есть REPL. Таким образом, вы можете отправить Haskell без, main=пока он действительно работает, как написано, например, в ghciприглашении. Но так как это означает, что letвы должны ставить свои декларации, это может быть чистой победой, придерживаясь runhaskellформата.

  3. Точно так же awkсценарии должны быть в BEGIN(или END, с предположением, что stdin присоединен /dev/null) блоках, так как мы не обрабатываем какой-либо ввод.

и т.п.


4
Я немного смущен. Неужели задача состоит в том, чтобы просто вывести алфавит с повторением каждой буквы четыре раза, или вывод нужно также сохранить в файле?
Изи

И нужно ли выводить только алфавит?
Джастин

@MarkReed Нужно ли печатать его с новой строкой между ними? Почему бы просто не напечатать это, но новые строки необязательно?
Джастин

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

Последний бит запутывает правила пробела. Не могли бы вы уточнить? В частности, правильно ли я понимаю, что с дополнительным пробелом все в порядке, а с отсутствием перевода строки - нет?
Изи

Ответы:


16

APL (5)

⍪4/⎕A

Матричный формат ( ) 4-ти репликации ( 4/) алфавита ( ⎕A).


1
Кажется, вряд ли будет побежден. :)
Марк Рид


APL использует кодовую страницу, которая отображает каждый из символов, которые он использует, в один байт. Эту кодовую страницу можно найти здесь, на веб-сайте IBM.
Стивен Х.

@StevenH. Ссылка мертва
Стэн Струм

@StanStrum Я считаю, что ссылка устарела из-за устаревания, но ради игры в гольф этот мета-ответ должен работать.
Стивен Х.

11

Python - 37

for i in range(104):print chr(i/4+65)

iидет от 0 до 104; оно делится на четыре и добавляется к значению ascii для A, и полученный символ печатается.


Я так понимаю, Python использует целочисленное деление по умолчанию? Было бы неплохо, если бы PowerShell сделал это прямо сейчас. Как таковой, код, необходимый для принудительного его деления на целое число, слишком длинный, чтобы этот трюк помог мне сохранить что-либо в моем сценарии.
Изи

@lszi - Python берет свое начало от типа операндов. 3/40, а 3.0/4.00,75; range()генерирует целые числа
Марк Рид

1
Это не работает на более новых версиях Python. Во-первых, функция печати должна вызываться в скобках, и / больше не выполняет целочисленное деление по умолчанию (даже если оба числа являются целыми числами), что является // работой. Try:for i in range(104):print(chr(i//4+65))

3
@ Сознание я это знаю. Я сознательно решил использовать старую версию, чтобы лучше играть в гольф. Если бы вы запустили это на Ideone.com, вы бы выбрали «Python» вместо «Python 3»
Джастин

3
@Consciousness - под «более новыми версиями python» вы ссылаетесь на «Python 3», который на данный момент далеко не универсален. Я обычно предполагаю, что все, что претендует на звание «Python» без указанной версии, является Python 2.x, пока не доказано обратное; Код Python 3 имеет тенденцию быть явно помеченным.
Марк Рид

8

R, 30 28 27

write(rep(LETTERS,e=4),1,1)

Предыдущая версия с 30 байтами:

cat(rep(LETTERS,e=4),sep="\n")

Я думаю, что буквальный перевод строки на байт короче :)
Джузеппе

@Giuseppe Можете ли вы указать эту идею?
Свен Хоэнштайн


@Giuseppe Действительно хорошая идея! Спасибо за указание.
Свен Хоэнштайн

Вы также можете использовать 1вместо, ""чтобы указать стандартный вывод write, который сохраняет другой байт.
Джузеппе

7

С, 59

Я представляю это, неконкурентно длинный ответ, просто потому, что пока не вижу заявки на Си. И это меня огорчает. : - /

ПОЗЖЕ: перейдите к @moala для выполнения этой версии "/ 4", сэкономив 13 символов!

float i;main(){while(i<26)printf("%c\n",65+(int)i),i+=.25;}

Я отредактировал свой ответ, теперь сохранил еще 2 символа!
Моала

и еще один!
Моала

6

J: 18 13

4#u:65+i.26 1

Я все еще довольно шаткий с J, так что, возможно, это можно улучшить


3
Вы можете использовать копировщик ( #) вместо деление примерно так: 4#u:65+i.26 1. Кроме того, ~меняются аргументы функции, так что если вы когда-нибудь обнаружите, что делаете (expression) F value, вы можете заменить это value F~ expressionна сохранение символа.
Маринус

@marinus Спасибо за совет. Я все еще изучаю J, и с такими трюками сложно найти какую-либо полезную информацию.
PSWG

1
4#65{26,.\a.для 12 байтов.
FrownyFrog

5

Руби, 23

puts ([*?A..?Z]*4).sort

Вся заслуга @manatwork - поддержите его комментарий, а не этот. :)


Огромный. @ Manatwork, я сделаю правку, но, очевидно, я не заслуживаю никакого уважения!
Даррен Стоун

5
Лучше сделать это puts [*?A..?Z].map{|i|[i]*4}или puts ([*?A..?Z]*4).sortтак, чтобы буквы были упорядочены, как в примере.
manatwork

2
@manatwork: puts (?A..?Z).map{|i|[i]*4}персонаж короче. Вы можете позвонить mapнапрямую на Range, поэтому в этом случае вам не нужен сплат.
Марк Рид

5

PowerShell: 32 23

Гольф-код:

[char[]](65..90*4)|Sort

Прохождение:

[char[]](... )берет массив объектов и преобразует их в символы ASCII.
65..90являются кодами ASCII для AZ.
*4повторяет серию 4 раза.
|Sortсортирует вывод.

Заметка:

Если вы хотите, чтобы это было записано в файл, просто бросьте >, а затем имя файла, в конце.


5

Хаскелл, 46

x a=a++a
main=putStr$['A'..'Z']>>=x.x.(:"\n")

1
putStr$['A'..'Z']>>=("golf">>).(:"\n")сохраняет 8 битов
Angs

5

Befunge 98 - 18

1+::'g`#@_4/'A+,a,

Работает, сохраняя число и заканчивая его, когда оно достигает 104. Распечатывает соответствующий символ алфавита для числа, разделенного на 4, за которым следует новая строка. Но если мне не нужно добавлять новую строку после каждой буквы, то это 16 символов:

1+::'g`#@_4/'A+,

Может быть уменьшено, если я смогу напечатать больше символов (т.е. все четыре раза) ( 7 6 символов, даже работает в Befunge 93):

1+:4/,

С новой строки:

1+:4/,a,


4

Perl 5, 21

map{print"$_
"x4}A..Z

2
Мне никогда не приходило в голову вставить буквальный перевод строки в двойные кавычки в Perl. +1.
Марк Рид

Должен отметить, что я тоже этого не сделал, но @manatwork упомянул об этом в другом моем ответе, и он застрял!
Дом Гастингс

4

С 46 44 43

46 :

i;main(){while(i<104)printf("%c\n",65+i++/4);}

44 :

i=260;main(j){for(;(j=i++>>2)<91;puts(&j));}

44 тоже:

i=260;main(j){while(j=i++>>2,j<91)puts(&j);}

Благодаря @marinus, 43:

i=260;main(j){while(j=i++/4,j<91)puts(&j);}

Должен ли я добавить награду за получение 42? :)


6
50 респ. необходимо комментировать что-либо, и у вас есть 101 на момент публикации этого комментария.
syb0rg

Большой! Благодарность! Ответ отредактирован!
Моала

1
Вы можете заменить >>2на /4.
Маринус

4

Ява: 56

for(int i=0;i<104;)System.out.println((char)(i++/4+65));

редактировать: изменено с «печать» на «печать»


Вывод должен включать переводы строк после каждой буквы.
Пьер Арло

спасибо за указание на это, он должен теперь каждый раз печатать новую строку
reblerebel

2
The solution must be complete enough to execute. I should be able to invoke an implementation of the language, paste the code from the answer, and get results, without typing any additional code. я думаю, что ваше решение нарушает это условие
user902383

2
@ user902383 Если вы вставите его в JShell (Java REPL в Java 9), это сработает, и вам даже не понадобится последняя точка с запятой.
Дэвид Конрад

@DavidConrad Тогда это здорово, я думаю, я мог бы начать использовать REPL / JShell.
user902383



4

16-битный машинный код x86 MS-DOS COM, 25 байт

В шестнадцатеричном виде:

B409BA160189D7B96800F6C1037502FE05CD21E2F5C3400A24

Это полная программа MS-DOS .COM. Скопируйте последовательность байтов в файл с расширением .com и запустите его из DOSBox.

Разборка:

00: B4 09        mov    ah,0x09         ;INT 21h "Write string to STDOUT" function
02: BA 16 01     mov    dx,0x116        ;Address of the string s ('$'-terminated)
05: 89 D7        mov    di,dx           ;Because there's no way to dereference address in DX
07: B9 68 00     mov    cx,104          ;CX=26*4
_0000000A:
0A: F6 C1 03     test   cl,0x03         ;When lower two bits are zero...
0D: 75 02        jne    _00000011       ;...do not skip the next instruction
0F: FE 05        inc    b,[di]          ;*s++
_00000011:
11: CD 21        int    21              ;Print the string
13: E2 F5        loop   _0000000A       ;Until --CX==0
15: C3           retn
16: 40           db     0x40            ;s[0], starts with 'A'-1
17: 0A           db     0x0A            ;'\n'
18: 24           db     '$'             ;Terminator required by the print function


3

AWK, 48

Давайте попробуем это с AWK ...

END{s=65;for(i=104;i--;s+=0==i%4)printf"%c\n",s}

Как подсказывает manatwork, мы можем избавиться от 2 символов

AWK, 46 (Изменить)

END{for(i=104;i--;s+=0==i%4)printf"%c\n",s+65}

AWK, 40 (редактирование кода MarkReed )

END{for(;i<104;){printf"%c\n",i++/4+65}}

Удаляя инициализацию переменных с вы можете сэкономить 2 символов: END{for(i=104;i--;s+=0==i%4)printf"%c\n",s+65}.
manatwork

1
Помещение кода в ENDблок означает, что для его работы требуется поток ввода (даже если он есть /dev/null). Это изменяет количество символов? Во всяком случае, BEGIN{for(;++i<104;){printf"%c\n",i/4+65}}на 5 символов короче.
Марк Рид

@MarkReed Ваш код не работает. Проверьте это
Васи

D'о. Так близко! :) Но мне все еще не нравится требование ENDшаблона для входного потока ...
Марк Рид


3

C # LINQ 115 байт 110 байт

Enumerable.Range(65, 26).SelectMany(i => Enumerable.Repeat(i,4))
.ToList().ForEach(i=> Console.WriteLine((char)i));

1
Добро пожаловать в PPCG! Хороший первый пост!
Rɪᴋᴇʀ



3

Perl 6, 32

.say for (('A'..'Z') »xx»4)[*;*]

Я думаю, что это первый раз, когда Perl 6 был первым решением, о котором я подумал, но гипероператор просто показался мне естественным.
Марк Рид

3

Холст , 5 байт

Z41*⟳

Попробуй это здесь!

Объяснение:
Code        | Explanation                                  | Stack
------------+----------------------------------------------+------------------------------
Z          | The uppercase alphabet                       | "ABC..."
  41*     | Stretched by 4 horizontally and 1 vertically | "AAAABBBBCCCC..."
        ⟳  | Rotated clockwise                            | "A¶A¶A¶A¶B¶B¶B¶B¶C¶C¶C¶C¶..."
            | Print ToS (implicit)                         |

С заменой на \nпосле печати.



3

брейкфук , 48 байт

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

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

Печать в нижнем регистре, разделенная переводом каретки. Использует обтекание 8-битных ячеек, а также ячеек слева от источника, хотя вы можете добавить a, >чтобы противостоять последним.


Я собирался опубликовать новый, но вам удалось полностью превзойти все возможное, я получил 71 байт с ++++++ [-> ++> ++++> ++++++++ ++ <<<] ++++> +> ++> +++++ <[-........> << >> << >> << >> << +>]
KrystosTheOverlord




Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.