Очень длинная терза Рима

38

Описание

Выведите схему рифмы для очень длинного Terza Rima.

вход

Никто.

Выход

ABA
BCB
CDC
DED
EFE
FGF
GHG
HIH
IJI
JKJ
KLK
LML
MNM
NON
OPO
PQP
QRQ
RSR
STS
TUT
UVU
VWV
WXW
XYX
YZY

правила

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

ABA BCB...

ИЛИ

ABA
BCB
...

Для каждой строки допускается один конечный пробел, а для новой строки - один завершающий.

Вывод может быть в верхнем или нижнем регистре.

Это , поэтому выигрывает самый короткий код в байтах для каждого языка.

LiefdeWen
источник
4
Список строк в порядке?
полностью человек
6
Согласно en.wikipedia.org/wiki/Terza_rima ваше окончание неверно. Он должен заканчиваться либо Z, либо ZZ.
Крис
Может ли быть дополнительный вывод помимо схемы рифмы? Это может сэкономить мне несколько байтов.
NK1406
@ NK1406 Нет, извините.
LiefdeWen
1
@totallyhuman Строковый массив в порядке.
LiefdeWen

Ответы:

24

JavaScript (ES6), 51 50 49 байт

Сохранено 1 байт благодаря @ l4m2

f=(n=45358)=>n%63?f(n-1333)+n.toString(36)+' ':''

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

Как?

Начнем с n = 45358 ( yzy в базе 36). Мы вычитаем 1333 из n на каждой итерации ( 111 в base-36). Мы остановимся, как только n MOD 63 = 0 , потому что 12033 ( 9a9 в base-36) является первым значением, для которого выполняется это условие, а 63 является наименьшим по модулю с таким свойством.

Decimal | Base-36 | MOD 63
--------+---------+-------
  45358 |   yzy   |   61
  44025 |   xyx   |   51
  42692 |   wxw   |   41
  41359 |   vwv   |   31
  40026 |   uvu   |   21
  38693 |   tut   |   11
  37360 |   sts   |    1
  36027 |   rsr   |   54
  34694 |   qrq   |   44
  33361 |   pqp   |   34
  32028 |   opo   |   24
  30695 |   non   |   14
  29362 |   mnm   |    4
  28029 |   lml   |   57
  26696 |   klk   |   47
  25363 |   jkj   |   37
  24030 |   iji   |   27
  22697 |   hih   |   17
  21364 |   ghg   |    7
  20031 |   fgf   |   60
  18698 |   efe   |   50
  17365 |   ded   |   40
  16032 |   cdc   |   30
  14699 |   bcb   |   20
  13366 |   aba   |   10
  12033 |   9a9   |    0
Arnauld
источник
Как ты решил base36? и вы уверены, что это оптимально?
LiefdeWen
2
@LiefdeWen Это самая низкая база, содержащая все буквы, поэтому она оптимальна.
Эрик Outgolfer
@ user202729 Что ты имеешь в виду? Он не OP, так что он один из тех людей, на которых вы ссылаетесь?
Эрик Outgolfer
17
Как (не) интересный побочный узел, 1333 = 666 * 2 + 1, и это мой 666-й ответ на PPCG.
Арно
3
@Arnauld, пожалуйста, убедитесь, что вы используете значение 1335 где-то в вашем следующем ответе.
IanF1
15

C (gcc) , 41 байт

f(i){for(i='ABA';i%29;i+=65793)puts(&i);}

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

Исправлено и -9 благодаря пользователю 202729 . -1 благодаря Деннису и -2 благодаря Арно .

Мистер Xcoder
источник
45 байтов .
user202729
1
(i='ABA';i<'ZZZ';i+=65793)сохраняет байт.
Деннис
Используйте 59e5вместо того, чтобы 'ZZZ'сохранить другой байт.
user202729
Вы можете использовать i%29для 41 байт
Arnauld
9

бред , 51 48 байт

Сохранено 3 байта благодаря @ovs.

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

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

объяснение

INITIALIZE TAPE:

0000:           (none)
0001: C_NEWLINE (10)
0002: V_COUNT   (25)
0003: V_ALPHA   (64)
++++++++[>+>+++>++++++++<<<-]>++>+

V_COUNT TIMES:              [-
    INCREMENT V_ALPHA         >+
    PRINT V_ALPHA             .
    PRINT V_ALPHA PLUS ONE    +.
    PRINT V_ALPHA             -.
    PRINT C_NEWLINE           <<.
END LOOP                    >]
Конор О'Брайен
источник
@ ConorO'Brien - я только что заметил, что мой ответ очень похож на ваш. Пожалуйста, не стесняйтесь комментировать, если вы думаете, что это слишком близко, и я удалю его.
ElPedro
1
@ElPedro Нет, ты в порядке, в этом соревновании мало места для инноваций :)
Конор О'Брайен,
9

05AB1E , 5 байтов

Aü«€û

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

-1 байт благодаря Emigna
-1 байт благодаря изменению правила; спасибо Kalsowerus за указание на это

Хе-хе, в настоящее время бьет Пит. \ О /

объяснение

Aü«€û»  Full Program
A       Lowercase Alphabet
 ü«     Pairwise with merge-list
   €û   For each, palindromize
HyperNeutrino
источник
Вы могли бы сделатьAü«€û»
Emigna
@ Emigna О, круто, спасибо! : D
HyperNeutrino
Хорошо, вот что я тоже получил, не глядя.
Волшебная Осьминог Урна
Согласно комментариям, список строк в порядке вывода, вы можете удалить объединение.
kalsowerus
9

бред , 51 49 байтов

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

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

Попытка объяснения ...

+++++                     #Put 5 in cell 0 because that is the highest common denominator of 10, 65 and 25
[                         #Start loop
>+++++                    #Counter in cell 1 is 25 (How many lines we must print)
>+++++++++++++            #Counter in cell 2 is 65 (ASCII A)  
>++                       #Counter in cell 3 is 10 (Newline)
<<<-]                     #Decrement the outer counter until the cells have the right values (muliples of 5).
>                         #Move to the counter that says how many lines we must print.
[>.                       #Print the character in cell 2
+.                        #Add one to the character in cell 2 and print it
-.                        #Subtract one from the character in cell 2 and print it
+                         #Add one to the character in cell 2 for the next loop
>.                        #Print a new line
<<-]                      #Decrement cell 1 and run again until cell 1 is 0

-2 благодаря @ovs

Моя первая попытка сумасшедшего, так что любые советы с благодарностью получили. Если бы я был более опытен с этим, то я уверен, что мог бы сбрить еще несколько байтов, но я только вошел в это вчера.

ElPedro
источник
-1 байт
Джо Кинг
6

Brain-Flak , 90 байт

((((()()()){}){}){}()){(({})<((({}((((()()()()){}){}){}){})())[()])((()()()()()){})>[()])}

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

Одна из причин, по которой он короче, чем другой ответ «мозговая шутка», заключается в том, что в нем используются заглавные буквы вместо строчных символов, которые имеют меньшие значения ASCII и, следовательно, их проще нажимать.

Объяснение:

#Push 25
((((()()()){}){}){}())

#While true
{

    #Keep track of the number on top of the stack...
    # We'll call it 'a'
    (({})

        #Push A +...
        <((({}

        # 64 (push)
        ((((()()()()){}){}){}){})
        # + 1 (push)
        ())
        # - 1 (push)
        [()])

        # Push 10
        ((()()()()()){})>

    # Now that's all pushed, we push a - 1 to decrement the loop counter
    [()])

# Endwhile
}
DJMcMayhem
источник
Я пишу первую версию и не получаю голосов, вы пишете версию для гольфа и получаете +5. ???
Кристофер
5

R 51 47 байт

L=LETTERS;cat(sprintf("%s%s%1$s",L[-26],L[-1]))

Выход:

> L=LETTERS;cat(sprintf("%s%s%1$s",L[-26],L[-1]))
ABA BCB CDC DED EFE FGF GHG HIH IJI JKJ KLK LML MNM NON OPO PQP QRQ RSR STS TUT UVU VWV WXW XYX YZY
plannapus
источник
Наивный путь без фантазии sprintfсоставляет 49 байтов
Джузеппе
@Giuseppe это было бы потому, что я не использовал sprintfправильно :)
plannapus
Хорошо, но я нашел 40 байтов :)
Джузеппе
@ Giuseppe ой :)
plannapus
1
другой [40 байт] [ tio.run/##K/r/…, основанный на преобразовании кодов ASCII, на случай
NofP
5

Java 8 , 132 85 62 60 байт

  • 47 байт благодаря Нейлу
  • 26 байтов благодаря Оливеру
  • 3 байта и намного лучшее форматирование благодаря Кевину
  • Ошибка исправлена ​​Оливером

Golfed

a->{for(char i=64;++i<90;)System.out.println(""+i+++i--+i);}

Ungolfed

public class TerzaRima {
    interface A{
        void a(String a);
    }
    static A a = a -> {
        for (char i = 64; ++i < 90; ) System.out.println("" + i++ + i-- + i);
    };
    public static void main(String[] args){
        a.a(null);
    }
}
DevelopingDeveloper
источник
1
Печать массива символов, вероятно, будет намного короче.
Нил
1
Можете ли вы сделать тоже? ichar
Нил
2
a->{for(char c=64;++c<90;)System.out.println(""+c++ +c--+c);}(62 байта)
Оливье Грегуар
2
В настоящее время это фрагмент кода, а не функция или программа, поэтому вам придется добавить, v->{...}как упомянуто выше, @ OlivierGrégoire. ( Если вы не знаете, как работают лямбды в Java 8, я однажды объяснил. ) Также вы можете убрать скобки цикла, как это сделал Оливье, и в качестве дополнительного поля для гольфа вы можете изменить печать на System.out.print(" "+i+++i--+i);(вместо пробела). новой строки, и вам не нужно место в c+++c--+c). Попробуй это здесь.
Кевин Круйссен
1
Спасибо @KevinCruijssen за советы, а также за документ о java лямбдах. Это было очень простое руководство для реализации некоторых простых лямбд. Я обновил соответственно!
DevelopingDeveloper
4

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

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

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

овс
источник
+1 Я слежу за большей частью, но это начинается с - [Значит ли это, что вы устанавливаете ячейку от 0 до -1, прежде чем начать цикл? Есть ли шанс объяснить новичку, у которого есть мозг, если есть время? Кстати, спасибо за -2 на мои усилия.
ElPedro
@ElPedro, это зависит от интерпретатора brainfuck, интерпретатор на tio.run хранит 8-битные числа без знака в каждой ячейке, поэтому первая ячейка получает 255 перед циклом.
овс
@ElPedro сегмент инициализации фактически генерируется BF-Crunch .
овс
4

брейкфак , 45 37 байт

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

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

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

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

+[[<+>>++<-]>] Intialises the tape with the format n^2
               1 2 4 8 16 32 64 128 0 0'
<<---          Navigates to the desired section and tweaks the counter
               1 2 4 8 16 32 64 125<
[-----<+.+.-.<.>>] Prints the Terza Rima, using:
                 125 as the loop counter (decremented by 5 each loop)
                 64 as the current alphabetic character (incremented and printed each loop)
                 32 as the space character
Джо Кинг
источник
1
Это на самом деле очень приятно! Отличная работа!
Пыль
3

Brain-Flak , 180 байт

(()()())(({}){})(({}){})(({}){})(({}){})(({}){}())<>(()()()()())(({}){})(({}){})(()()()()(){}){({}[()])<>(({}))(({}()))(({}[()]))({}()<(()()()()()()()()()())>)<>}<>{}{}{({}<>)<>}<>

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

Спасибо ди-джею за эту работу

Кристофер
источник
3

Haskell , 28 байт

[[x,succ x,x]|x<-['A'..'Y']]

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

succ такой неудачный выбор имен ...

объяснение

[[x,succ x,x]|x<-['A'..'Y']]

[            |x<-          ]  -- for x in...
                 ['A'..'Y']   -- the alphabet sans Z
 [x,succ x,x]                 -- construct a string of x, the successor of x and x
totallyhuman
источник
4
Я не чувствую, что совершенно справедливо возвращать список строк вместо того, чтобы разделять их пробелом или переводом строки, как требуется.
user28667
@ user28667 Обычно это разрешено в задачах (возможно, оно должно быть в сообщении по умолчанию для ввода-вывода, если это еще не сделано). ФП еще предстоит ответить на этот вызов конкретно. Это, однако, не повод для понижения.
полностью человек
@totallyhuman В настоящий момент в задаче явно указывается, что для разделения выходных данных следует использовать пробелы или символы новой строки, поэтому этот ответ в настоящее время недействителен. Строго в соответствии с правилами сайта его следует удалить или просто исправить, добавив a unlinesили unwords.
Лайкони
@Laikoni Кажется, у тебя есть ниндзя. Задача явно не запрещает вывод списка строк. (Кроме того, это лишит законной силы значительное количество ответов.) В любом случае, ответ теперь не является недействительным.
полностью человек
3

R , 40 байт

cat(intToUtf8(rbind(x<-65:89,x+1,x,10)))

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

Еще одна альтернатива в R ответам Планнапа и Джузеппе . Опубликовано после их запроса. Это решение использует код ASCII для кодирования UTF8.

PS, если разрешены вкладки, можно заменить символ новой строки (код ASCII 10) на табуляцию (код ASCII 9), и решение может сократиться до 39 байт:

cat(intToUtf8(rbind(x<-65:89,x+1,x,9)))

NofP
источник
Я думаю, что использование 9прекрасно, так как это пробел, который разрешен OP.
Джузеппе
3

PowerShell , 39 37 байт

65..89|%{-join[char[]]($_,++$_,--$_)}

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

Петли от 65до 89. На каждой итерации мы создаем целочисленный массив (текущего, еще одного и текущего) текущей цифры с использованием предварительного увеличения и предварительного уменьшения. Затем он повторно приводится как char-array и -joinобъединяется в одну строку. Каждая строка остается в конвейере, и неявное Write-Outputзавершение программы дает нам новую строку между каждым элементом бесплатно.


Кроме того, тот же счетчик байтов

65..89|%{-join[char[]]($_,($_+1),$_)}

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

AdmBorkBork
источник
1
($_,($_+1),$_)альтернативный кортеж одинаковой длины
Веска
2

J , 18 16 байт

2(,{.)\u:65+i.26

Измененный a.{~к u:после решения Конора О'Брайена и FrownyFrog в

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

Гален Иванов
источник
1
Альтернатива 16 байт:u:(i.25)+/66-#:5
FrownyFrog
2

Пепе, 59 56 байт

-3 байта благодаря u_ndefined

REeEeEEeEerEeEeeeeeERrEEEEErEEEeeREEreeerEEEEEeeEreeERee

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

Объяснение:

# Prepare stacks

  # prepare stack R [Z]
  REeEeEEeEe  # push Z

  # prepare stack r [A,B,A]
  rEeEeeeeeE  # push A
  RrEEEEE     # copy and increment A (getting B)
  rEEEee      # duplicate A to end

# Start loop
REE           # create label Z

  reee        # output stack r contents
  rEEEEEeeE   # increment all

  reeE        # end line

Ree           # loop while r[p] != Z
Красный клевер
источник
1
Замена rEeEeeeeEeна RrEEEEEэкономит 3 байта
u_ndefined
@u_ndefined Спасибо! Я сделал этот код до того, как флаги были добавлены в Pepe. Обновил ответ.
RedClover
1

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


ABA
;{:G`
T`_p`p`[^Y]..

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

Мартин Эндер
источник
21 байт, но страдает от следов новой строки ...
Нил
@ Нил Да, тебе даже не нужно `.... Избавление от этих новых строк действительно раздражает. Я надеюсь сделать печать в петлях немного более гибкой и удобной в Retina 1.0.
Мартин Эндер