Алфавитный треугольник снова поражает


24

задача

Ваша задача распечатать этот точный текст:

A
BCD
EFGHI
JKLMNOP
QRSTUVWXY
ZABCDEFGHIJ
KLMNOPQRSTUVW
XYZABCDEFGHIJKL
MNOPQRSTUVWXYZABC
DEFGHIJKLMNOPQRSTUV
WXYZABCDEFGHIJKLMNOPQ
RSTUVWXYZABCDEFGHIJKLMN
OPQRSTUVWXYZABCDEFGHIJKLM
NOPQRSTUVWXYZABCDEFGHIJKLMN
OPQRSTUVWXYZABCDEFGHIJKLMNOPQ
RSTUVWXYZABCDEFGHIJKLMNOPQRSTUV
WXYZABCDEFGHIJKLMNOPQRSTUVWXYZABC
DEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL
MNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVW
XYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJ
KLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXY
ZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOP
QRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHI
JKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCD
EFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZA
BCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ

Спекуляции

  • Вы можете сделать это только строчными, а не заглавными.
  • Трейлинг-перевод строки в конце треугольника разрешен.
  • Конечные пробелы после каждой строки разрешены.
  • Вы должны печатать в STDOUT вместо вывода массива строк.

счет

Это . Программа с наименьшим количеством байтов выигрывает.


1
Что вы подразумеваете под "снова наносит удар"? Был ли другой вызов, который вы сделали, как это?
haykam


1
Кажется довольно тривиальным, мы действительно нуждаемся в (другом) вызове алфавита?
Рохан Джунджхунвала

2
Это хороший вызов, но я думаю, что мы опередили насыщение этими задачами алфавита, ничего личного.
Рохан Джунджхунвала

На самом деле ищет алфавитный вызов, что буква в позиции не может быть вычислена с помощью простых выражений из ее координат, включающих modфункцию. Может сделать сам, если у меня будет время.
Вейцзюнь Чжоу,

Ответы:


39

Vim, 29 байт

:h<_↵↵↵y$ZZ26P0qqa↵♥βjllq25@q

Где представляет клавишу Return, клавишу Escape и βклавишу Backspace.

введите описание изображения здесь


3
Как ты всегда избиваешь меня, чтобы ответить на все эти вопросы? В любом случае, +1, я не могу не сказать vim! :)
DJMcMayhem

7
Я все еще думаю, что вы должны использовать вместо . И вместо β. Вот для чего были созданы эти символы Unicode. utf8icons.com/subsets/control-pictures
mbomb007

9

Python 2, 65 байт

i=1
a=bytearray(range(65,91))*26
while a:print a[:i];a=a[i:];i+=2

1
Я изменил заголовок на Python 2, потому что код не будет работать в Python 3.
Leaky Nun

7

Желе , 10 байт

26RḤ’RØAṁY

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

Как это работает

26RḤ’RØAṁY  Main link. No Arguments.

26          Set the return value to 26.
  R         Range; yield [1, 2, ..., 25, 26].
   Ḥ        Unhalve; yield [2, 4, ..., 50, 52].
    ’       Decrement; yield [1, 3, ..., 49, 51].
     R      Range; yield [[1], [1, 2, 3], ..., [1, ..., 49], [1, ..., 51]].
      ØA    Yield the uppercase alphabet.
        ṁ   Mold the alphabet as the array of ranges. This repeats the uppercase
            letters over an over again, until all integers in the range arrays
            have been replaced with letters.
         Y  Join, separating by linefeeds.

Был ли тогда «Double» тогда называться «Unhalve»? Кроме того, это здорово !! [жду, чтобы сказать поздравления за 100 тыс. представителей]
Эрик Outgolfer

Это просто мнемоника. Hявляется половиной и является его обратным ( unhalve ).
Деннис,

Я просто думаю о /2или *2, так что это «Половина» или «Двойной». Вот почему я был смущен.
Эрик Outgolfer

Также 10 байтов:27Ḷ²IRØAṁY
Утечка монахиня

Также 10 байтов:51Rm2RØAṁY
HyperNeutrino

7

VBA Excel (80 байт, 1742 байт)


Excel, 1742 байта

Вдохновленный творческим ответом угорена , мне удалось найти формулу Excel для создания шаблона, как показано в ОП.

=MID(REPT("ABCDEFGHIJKLMNOPQRSTUVWXYZ",26),(ROW()-1)^2+1,2*ROW()-1)

Вставьте эту формулу в ячейку A1, затем перетащите ее по всему диапазону A1: A26.

Длина формулы составляет 67 байт, но вы должны повторить ее 26 раз, поэтому она равна 67 * 26 = 1742 байт. Вот вывод:

введите описание изображения здесь


Excel VBA, 80 байт

Теперь возможно интегрировать Excel с VBA, чтобы автоматизировать процесс и сэкономить много байтов, поскольку VBA встроен в большинство приложений Microsoft Office, включая Excel. Напишите и запустите следующий код в Immediate Window (используйте комбинацию клавиш CTRL+, Gчтобы отобразить его в редакторе Visual Basic):

[A1:A26]="=MID(REPT(""ABCDEFGHIJKLMNOPQRSTUVWXYZ"",26),(ROW()-1)^2+1,2*ROW()-1)"

Программа работает, печатая вышеприведенную формулу Excel в диапазоне A1: A26. К сожалению, в Excel и VBA нет встроенного алфавита.


Имена столбцов для меня выглядят как встроенный алфавит. Используйте первые 26 имен столбцов.
mbomb007

1
@ mbomb007 И что? Я думаю, что было бы сложнее использовать их вместо строк.
Эрик Outgolfer

@EriktheGolfer Так? Моя точка зрения в том , что там есть это встроенная алфавит.
mbomb007

1
@ mbomb007 Вы сказали «Использовать первые 26 имен столбцов», что я воспринимал как «Использовать первые 26 имен столбцов вместо того, что вы используете в настоящее время», поэтому я ответил.
Эрик Outgolfer

@EriktheGolfer Это предложение. ИДК, сколько байт это будет.
mbomb007

5

Haskell, 67 байт

_#53=[]
s#i=take i s:drop i s#(i+2)
mapM putStrLn$cycle['A'..'Z']#1

Простая рекурсия по длине iстроки. На каждом шаге следующие iсимволы взяты из бесконечного повторения алфавита.


4

Mathematica, 90 байт

StringRiffle[Flatten[Alphabet[]&~Array~26]~Internal`PartitionRagged~Range[1,51,2],"
",""]&

Анонимная функция. Не требует ввода и возвращает строку в качестве вывода. Предложения по игре в гольф приветствуются. Пример того, что Internal`PartitionRaggedделает:

In[1]:= Internal`PartitionRagged[{2, 3, 5, 7, 11, 13}, {2, 3, 1}]               

Out[1]= {{2, 3}, {5, 7, 11}, {13}}

Mathematica имеет встроенные для алфавита треугольники?
Переполнение буфера

4

C, 79 байтов

main(i,j){for(i=0,j=1;i<676;i++){putchar(i%26+65);if(j*j==i+1){puts("");j++;}}}

Мой первый ответ на C \ O /

Предложения по игре в гольф приветствуются.


62:i;main(j){while(i<676)printf("\n%c"+(j*j^i++||!j++),i%26+65);}
xsot

@xsot Спасибо, но я боюсь, что ведущие новые строки не допускаются.
Утренняя монахиня

1
Но нет ли новой строки?
xsot

60:i;main(j){for(;j<27;j*j^++i||puts("",j++))putchar(i%26+65);}
xsot

@immibis Думаю, я должен опубликовать это.
xsot

4

Брахилог , 37 байт

26~l<:1aLc~j[@A:I],L~@nw
=:2%1,.#@l?,

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

объяснение

  • Основной предикат:

    26~l         Let there be a list of 26 elements
    <            This list is an ascending list of integers
    :1aL         Apply predicate 1 to that list ; the resulting list of strings is L
    c            Concatenate the list of strings into one big string
    ~j[@A:I],    That big string is the result of juxataposing the alphabet I times to itself
    L~@n         Create a string which when splitted on line breaks results in L
    w            Write that string to STDOUT
    
  • Предикат 1: используется для генерации переменных строк нечетной длины.

    =            Assign a value to the Input
    :2%1,        That value must be odd
    .#@l?,       Output is a string of length Input
    

Наконец, вы делаете вызов ascii-art
Leaky Nun

@LeakyNun Будет классифицировать это как строковые манипуляции больше, чем ASCII art imo
Fatalize

Должен ли я добавить это к тегу?
Утренняя монахиня

Хорошо использовать тот факт, что последняя строка является единственной строкой, которая заканчивается Z, потому что 26она свободна от квадратов.
Утренняя монахиня


3

JavaScript (ES6), 77 82 88

EcmaScript 6 требуется просто сохранить 1 байт, используя строковый литерал шаблона для новой строки.

for(i=r=l=o='';l+52;r++||(r=l-=2,o+=`
`))o+=(i++%26+10).toString(36);alert(o)

Меньше гольфа

for(i = r = l = o = '';
    l + 52;
    r++ || (r = l -= 2, o += `\n`))
  o += (i++ % 26 + 10).toString(36);
alert(o);

Тест

for(i=r=l=o='';l+52;r++||(r=l-=2,o+=`
`))o+=(i++%26+10).toString(36);alert(o)


\ o / ответ ES6, который я могу запустить в своем браузере
Downgoat

Я украл вашу логику .toString (36) ... теперь вам нужно побить 80 байтов !!
applejacks01

Ааа, я признаю, я не могу придумать способ победить это с моей библиотекой. Спасибо за вызов!
applejacks01

3

Perl, 42 41 39 байт

perl -E '@b=(A..Z)x26;say splice@b,0,$#a+=2for@b'

Просто код:

@b=(A..Z)x26;say splice@b,0,$#a+=2for@b

К сожалению, очевидно более короткая версия вызывает внутреннюю проблему с Perl (использование освобожденного значения в итерации):

say splice@b,0,$#a+=2for@b=(A..Z)x26

2

JavaScript, 129 байт

z=1,i=0,g=a=>{b=0,c="";while(a+a-1>b){c+='ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split``[i>26?i=0:i++];b++}console.log(c)};while(z<26)g(z++)

1
Использование оператора распространения может сэкономить 3 байта : [...'ABCDEFGHIJKLMNOPQRSTUVWXYZ']вместо 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split``.
insertusername здесь



2

MATLAB, 112 109 95 79 77 байт

Это также будет работать с Octave , вы можете попробовать онлайн здесь .

a=['' 65:90 65:90]';j=0;for i=1:2:52;b=circshift(a,j);j=j-i;disp(b(1:i)');end

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

a=['' 65:90 65:90]';        %Create 2 copies of the upper case alphabet
j=0;                        %Initialise cumulative sum
for i=1:2:52;               %For each line length
    b=circshift(a,j);       %Rotate the alphabet string by the cumulative offset
    j=j-i;                  %Update cumulative negative sum of offsets.
    disp(
         b(1:i)'            %Extract first 'line length' characters from rotated alphabet.
               );           %Display next line (disp adds newline automatically)
end

Оригинальная версия:

a=['' repmat(65:90,1,26)];c=cumsum(1:2:51);disp(cell2mat(arrayfun(@(s,f)[a(s:f) 10],[1,c(1:25)+1],c,'Un',0)))

Ничего себе, это оказалось дольше, чем я думал. Я посмотрю, не смогу ли я сбить с него несколько байтов.

Безглобная версия для объяснения:

a=['' repmat(65:90,1,26)]; %Create 26 copies of the upper case alphabet
c=cumsum(1:2:51);          %Calculate the end index of each row in the above array, by cumulatively summing the length of each line
disp(
     cell2mat(
              arrayfun(@(s,f)
                             [a(s:f) 10], %Extract the part of the alphabet and insert a new line.
                                         [1,c(1:25)+1],c, %start index is the previous end of line plus 1. End index is as calculated by cumsum.
                       'Un',0 %The returned values are not all the same length
                       )   %Do this for each line
              )            %Convert back to a matrix now new lines inserted
     )                     %And display it

Подтверждения

  • 3 байта сохранены - спасибо @LuisMendo

2

XPath 3.0 (и XQuery 3.0), 84 байта

codepoints-to-string((0 to 25)!(subsequence(((1 to 26)!(65 to 90)),.*.+1,2*.+1),10))

Объяснение:

(1 to 26)!(65 to 90) это алфавит 26 раз

(0 to 25)!(subsequence(XX, start, len),10) занимает 26 подпоследовательностей этого, каждая из которых сопровождается переводом строки

subsequence(X, .*.+1, 2*.+1) принимает последовательные подпоследовательности с начальной позицией и длиной: (1, 1), (2, 3), (5, 5), (10, 9) и т. д.

codepoints-to-string() превращает кодовые точки Unicode в символы


Браво. Я думал, что знаю, что такое XQuery. Оказывается, я понятия не имел.
Джордан

Я сомневаюсь, что многие из постов здесь рассказывают вам много о языке, на котором они написаны.
Майкл Кей


2

05AB1E (альтернативный) 15 байтов

A2×52µ¼D¾£,¾¼FÀ

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

Объяснение:

A2×              # push a string containing a-za-z
   52µ           # Loop the rest of the program until counter = 52
      ¼          # increment counter (it's 0 initially)
       D         # Duplicate the alpha string on the stack
        ¾£       # Replace alpha with alpha[0..counter]
          ,      # Pop the substring and print it
           ¾¼FÀ  # rotate the alpha string left counter++ times.

2

R, 120 115 111 байтов

v=c();for(i in 1:26){v=c(v,c(rep(LETTERS,26)[(sum((b=seq(1,51,2))[1:i-1])+1):sum(b[1:i])],"\n"))};cat(v,sep="")

Ungolfed:

a=rep(LETTERS,26)
b=seq(1,51,2)
v=vector()

for(i in 1:26)
    {
    v=c(v,c(a[(sum(b[1:i-1])+1):sum(b[1:i])],"\n"))
    }

cat(v,sep="")

В основном, bэто вектор нечетных чисел между 1и 51, таким образом, давая длину каждой строки. Очевидно, что sumфункция суммирует числа этого вектора и дает начальный и конечный индексы.

-5 байт благодаря @plannapus!
-4 байта благодаря @plannapus!


1
arf, извините, я не видел этого раньше, но так как вы используете только aодин раз, вам не нужно его определять, то есть вы можете сбрить еще пару байтов: b=seq(1,51,2);v=c();for(i in 1:26){v=c(v,c(rep(LETTERS,26)[(sum(b[1:i-1])+1):sum(b[1:i])],"\n"))};cat(v,sep="")работает.
plannapus

@plannapus Глупый я! Еще раз спасибо ! Я также интегрировал b=seqчасть в основной корпус, так что она еще менее читабельна!
Фредерик

2

Р, 81 73 65 63 байта

Простой forцикл подход. Повторите алфавит 26 раз и переберите скользящий индексный диапазон, который рассчитывается с помощью (i^2-2*i+2):i^2.

for(i in 1:26)cat(rep(LETTERS,26)[(i^2-2*i+2):i^2],"\n",sep="")


1

Пакетный, 123 байта

@set s=
@for /l %%i in (1,2,51)do @call set s=%%s%%ABCDEFGHIJKLMNOPQRSTUVWXYZ&call echo %%s:~0,%%i%%&call set s=%%s:~%%i%%


1

Rexx, 74 72 байта

i=1;m=1;do 26;say substr(copies(xrange('A','Z'),26),i,m);i=i+m;m=m+2;end

Ungolfed:

i=1
m=1
do 26
  say substr(copies(xrange('A','Z'),26),i,m)
  i=i+m
  m=m+2
end

1

TSQL, 129 байт

ИСПОЛЬЗУЙТЕ MASTER в начале скрипта, чтобы убедиться, что запрос выполняется в базе данных master, которая по умолчанию для многих пользователей (без учета байтов для этого).

Golfed:

USE MASTER

SELECT SUBSTRING(REPLICATE('ABCDEFGHIJKLMNOPQRSTUVWXYZ',26),number*number+1,number*2+1)FROM spt_values WHERE number<26and'P'=type

Ungolfed:

USE MASTER

SELECT SUBSTRING(REPLICATE('ABCDEFGHIJKLMNOPQRSTUVWXYZ',26),number*number+1,number*2+1)
FROM spt_values
WHERE number<26and'P'=type

скрипка

Скрипка для старой версии с использованием пути XML


1

PowerShell, 68 байт

$a=-join(65..90|%{[char]$_})*26;26..1|%{$a=$a.Insert($_*$_,"`n")};$a

Раздел перед первой точкой с запятой создает строку, содержащую 26 копий прописного алфавита. В следующем разделе вводятся разрывы строк по индексу каждого квадратного числа (работая в обратном направлении, поэтому мне не приходится учитывать сдвиг). Наконец, $aв конце просто помещает эту строковую переменную в эквивалент PowerShell STDOUT.


1

18 байт или 18 символов? Чтобы кодировать эти 18 символов как 18 байтов, вам нужна пользовательская кодировка символов; и мы можем сжать любое из решений, если выберем нашу кодировку символов достаточно тщательно.
Майкл Кей


Ты это объяснишь или я?
Адам

1

C, 60 байтов

i;main(j){for(;j<27;j*j^++i||puts("",j++))putchar(i%26+65);}

putsпринимает только один аргумент (Некоторое неопределенное поведение разрешено в Codegolf обычно, но это слишком далеко за пределами обычных полос)
MM

@MM Неопределенное поведение эксплуатируется постоянно. Правило состоит в том, что отправка действительна до тех пор, пока она работает в каком-то компиляторе, в противном случае нам пришлось бы явно исключить длинный список исключений. Этот код работает в gcc, так что это правильное представление.
xsot

1

C ++, 111 байт

void a(){int c=65,i,j;for(i=0;i<26;i++){for(j=0;j<=2*i;j++){std::cout<<(char)c;c++;if(c==91)c=65;}std::cout<<'\n';}}

Сначала попробуйте один из них. Использует int "c", чтобы записать, какую букву нужно напечатать в любой момент времени. Как только «с» проходит 90 («Z»), он сбрасывается до 65 («А»). Печатает пирамиду, используя для петель.


Хороший ответ! Вы могли бы сделать, if(c<92)c=65чтобы снять один байт, и вы могли бы также сделать int a()вместо void a(), но я не уверен, если это работает без возврата. Кроме этого, я думаю, что вы должны включить #include <iostream>в свой счетчик байтов.
DJMcMayhem

Я полагаю, что вы имели в виду if(c>90)c=65, но спасибо за предложение, это хорошая идея. Кроме того, я думаю, я включу это, спасибо.
лайм

1

PHP, 76 69 байт

for(;$i<26&&$a.=join(range(A,Z));)echo substr($a,$i**2,1+2*$i++)."
";
  • Создать 26 алфавитов (более чем достаточно) и связать их в $ a
  • цикл для I <26
  • показать $ начало подстроки i ^ 2, конец 2 * i + 1
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.