Роздрукуйте Tabula Recta!


81

Роздрукуйте Tabula Recta!

Табула Ректа (іноді її називають «Таблиця Вігенера») була створена Йоганнесом Тритеміусом і використовувалася в декількох шифрах, включаючи всі варіанти шифра Вігенера Белласо та шифри Тритемія. Це виглядає приблизно так:

ABCDEFGHIJKLMNOPQRSTUVWXYZ
BCDEFGHIJKLMNOPQRSTUVWXYZA
CDEFGHIJKLMNOPQRSTUVWXYZAB
DEFGHIJKLMNOPQRSTUVWXYZABC
EFGHIJKLMNOPQRSTUVWXYZABCD
FGHIJKLMNOPQRSTUVWXYZABCDE
GHIJKLMNOPQRSTUVWXYZABCDEF
HIJKLMNOPQRSTUVWXYZABCDEFG
IJKLMNOPQRSTUVWXYZABCDEFGH
JKLMNOPQRSTUVWXYZABCDEFGHI
KLMNOPQRSTUVWXYZABCDEFGHIJ
LMNOPQRSTUVWXYZABCDEFGHIJK
MNOPQRSTUVWXYZABCDEFGHIJKL
NOPQRSTUVWXYZABCDEFGHIJKLM
OPQRSTUVWXYZABCDEFGHIJKLMN
PQRSTUVWXYZABCDEFGHIJKLMNO
QRSTUVWXYZABCDEFGHIJKLMNOP
RSTUVWXYZABCDEFGHIJKLMNOPQ
STUVWXYZABCDEFGHIJKLMNOPQR
TUVWXYZABCDEFGHIJKLMNOPQRS
UVWXYZABCDEFGHIJKLMNOPQRST
VWXYZABCDEFGHIJKLMNOPQRSTU
WXYZABCDEFGHIJKLMNOPQRSTUV
XYZABCDEFGHIJKLMNOPQRSTUVW
YZABCDEFGHIJKLMNOPQRSTUVWX
ZABCDEFGHIJKLMNOPQRSTUVWXY

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

Правила / Вимоги

  • Кожне подання повинно бути або повною програмою, або функцією. Якщо це функція, її потрібно запускати, лише додаючи виклик функції в нижній частині програми. Все інше (наприклад, заголовки в C), має бути включено.
  • Якщо це можливо, надайте посилання на сайт, де можна перевірити вашу програму.
  • Ваша програма не повинна нічого писати на STDERR.
  • Стандартні лазівки заборонені.
  • Ваша програма може виводити в будь-якому випадку, але вона повинна бути надрукована (не масив чи подібне).

Оцінка балів

Програми оцінюються за байтами, за замовчуванням у UTF-8 або іншим набором символів на ваш вибір.

Зрештою, відповідь з найменшими байтами переможе.

Подання

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

# Language Name, N bytes

де Nрозмір вашого подання. Якщо ви покращите свій рахунок, ви можете зберегти старі бали у заголовку, прокресливши їх. Наприклад:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Якщо ви хочете включити у свій заголовок декілька чисел (наприклад, тому що ваш результат становить суму двох файлів або ви хочете окремо вказати штрафні санкції для перекладача), переконайтесь, що фактичний результат - це останнє число у заголовку:

# Perl, 43 + 2 (-p flag) = 45 bytes

Ви також можете зробити ім'я мови посиланням, яке потім з’явиться у фрагменті таблиць лідерів:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

Таблиця лідерів

Ось фрагмент стека для створення як звичайного табло, так і огляду переможців за мовою.


Щодо правила 1: чи потрібно включати кожен заголовок для кожної функції, яку ми використовуємо?
owacoder

Я мав на увазі, якщо ми використовуємо printf, нам потрібно включити stdio.h, якщо isalphaвін використовується, ctype.hі т. Д. Це правильно?
owacoder

3
Вам, мабуть, слід покласти "малі регістри дозволені" в самій специфікації виклику. Просто так люди рідше пропускають це, якщо вони не бачать цих коментарів.
Шерлок9

2
чи потрібно мені її роздрукувати чи можу я повернути рядок / масив char
downrep_nation

1
Дякую за запитання, що змусив мене не спати всю ніч. (+1)
Анастасія-Романова 秀

Відповіді:


30

05AB1E , 6 5 байт

Завдяки Downgoat за збереження 1 байта. Код:

ADv=À

Пояснення:

A      # Push the lowercase alphabet.
 D     # Duplicate it.
  v    # For each in the alphabet...
   =   #   Print without popping and with a newline.
    À  #   Rotate 1 to the left.

Використовує кодування CP-1252 . Спробуйте в Інтернеті! .


Яка мета його дублювання?
Esolanging Fruit

1
@ Challenger5 vКоманда споживає значення, повторюючи її. У цьому випадку він споживає алфавіт, тому він повторюється 26 разів. Це також точна кількість разів, яку нам потрібно повторити . Ці =листи стек інтактні і Àтільки повертають верхню частину стека елемента-вліво. Чи відповідає це на ваше запитання? :)
Аднан

101

Vim, 25 23 байти

:h<_↵jjYZZP25@='Ypx$p'↵

Де ключ повернення.

:h<_↵                       Open the help section v_b_<_example.
     jjY                    Copy the "abcdefghijklmnopqrstuvwxyz" line.
        ZZP                 Close this buffer and paste in ours.
           25@='     '↵     Run these commands 25 times:
                Yp          Duplicate line and move to column 1 of new line.
                  x         Cut the first character.
                   $p       Move to the end and paste.

GIF рішення

РЕДАКТУВАННЯ : малі регістри добре, тому я можу зберегти дві клавіші.


23
Тобто :h<_<cr>jjYгеній
Пуховик

3
Ого, це дивовижно! ОП сказав, що з малого регістру все гаразд, і ви можете знятиV~
DJMcMayhem


4
Я смію когось спробувати це в emacs.
Аддісон


24

Python 2, 59 57 53 байт

a=range(65,91)*27
a[::-27]=[10]*26
print bytearray(a)

Дякуємо @xsot за -4 байти!


4
Мені це подобається. До речі, можна скоротити останній рядок до print bytearray(a).
xsot

18

/// , 220 байт

/|/\/\///n/WXY|m/JKL|l/PQRS|k/CDEF|j/ZaNfV|i/MbAeI|h/TUcO|g/GHdB|f/OlTU|e/BkGH|d/ImMbA|c/VnZaN|b/NfVnZ|a/AeImM/ab
ed
kg
DEFgC
EFgCD
FgCDE
gk
HdBkG
de
mi
KLiJ
LiJK
im
ba
fc
lh
QRShP
RShPQ
ShPQR
hl
UcOlT
cf
nj
XYjW
YjWX
jn

Спробуйте в Інтернеті!

Це було напрочуд нетривіально, і я не маю поняття, чи оптимально це.

Єдиний спосіб вирішити подібну проблему в /// - це вилучення загальних рядків. ( Виявляється, я помилявся. ) Однак через характер виводу зовсім не зрозуміло, які підрядки слід найкраще витягти, оскільки ви не можете фактично витягнути весь алфавіт із-за переривків рядків. Таким чином, вам потрібно буде витягнути деякі підрядки оберненого алфавіту, але потім з’являються компроміси з точки зору того, як довго ви робите підрядки та які ви обираєте.

Отже ось що я зробив. Це сценарій CJam, який знаходить усі підрядки довжиною до 25 в даному рядку і для кожної з них обчислює, скільки байтів збереже його витяг. В основному, якщо є Nкопії Mпідрядок по довжині , ви збережете (N-1)*(M-1) - 5підрядки, ці підрядки не містять косої риски. Крім того, технічно, коли ви вже витягуєте 8 підрядів або близько того, постійне зміщення в кінці зводиться до -4, але сценарій цього не враховує.

У всякому разі, ось що я зробив зі сценарієм:

  • Запустіть скрипт проти поточного коду (який спочатку є лише висновком).
  • З підрядків, які дають найбільше вдосконалення, виберіть найкоротший. Якщо їх декілька, виберіть найменше лексикографічно (з того, що я можу сказати, для даного вводу це зменшує перекриття між підрядками).
  • Замініть всі випадки обраної підрядки в коді невикористаною малою літерою.
  • Додайте /x/ABC/до коду, де xзнаходиться обрана літера і ABCє підрядком.
  • Повторюйте, поки не залишиться жодної підрядки, яка б нічого не врятувала.

Зрештою, ми врятуємо ще кілька байт, замінюючи отриманий //з |і випереджаючи /|/\/\//(тому витяг подстроки варто тільки 4 замість 5 байт після 8 підрядка або близько того ).

Як я вже говорив, я не маю поняття, чи оптимально це, і я вважаю досить нерегулярним результат досить цікавим. Можливо, можна дійти до більш короткого рішення, вибравши неоптимальні (але більше) підрядки десь внизу лінії. Цікаво, який клас складності цієї проблеми ...


Це ... є ... геніально ...
Джордж Гібсон,

1
@GeorgeGibson Спасибі ... Мені довелося почати на півдорозі, коли я помітив певну YXу висновку. ;)
Мартін Ендер

Моєї відповіді вже немає, це було дурнем цього (більшого і пізніше). +1 за це [неймовірний гольф]!
Ерік Аутгольфер

Щодо класу складності, чи не слід проблему не визначити, оскільки /// завершено Тюрінг? Проблема полягає в тому, що "задано рядок, знайдіть найкоротшу /// програму, яка виводить її". За винятком невеликих рядків, існують програми ///, які циклічно фіксують нескінченно (але не можна довести їх циклічність), які не можуть бути показані, що не дають потрібного результату, не запускаючи їх назавжди. Формальне підтвердження Я ще не впевнений, але інтуїтивно це не можливо?
ghosts_in_the_code

16

C, 47 байт

i;f(){for(i=702;i--;)putchar(i%27?90-i%26:10);}

Спробуйте це на Ideone

Один цикл, який друкує алфавіт кожні 26 символів, але кожен 27-й символ замінюється новим рядком.


1
Чорт! Я просто написав точно таку ж функцію! :-) Ви можете зберегти перший крапку з комою, скориставшись f(i)тоді просто зателефонувати f()без аргументів.
Рівень річки Св.

@LevelRiverSt Це буде покладатися на невизначену поведінку.
Anders Kaseorg

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

Ви можете голити 1 байт, ініціалізуючи i, коли вперше згадується:i=702;f(){for(;i--;)//...
tucuxi


15

J, 15 байт

u:65+26|+/~i.26

Онлайн-перекладач .

u:65+26|+/~i.26
           i.26  creates vector [0 1 2 ... 25]
        +/~      builds an addition table with itself
     26|         modulo 26 to every element
  65+            add 65 to every element
u:               convert every element from codepoint to character

Приємно! Дуже розумна арифметика. Найпростіший підхід, який використовує |. (Shift), на 8 байт довше! (i.26)(|."0 _)u:65+i.26
Дан Дуб

1
@dahnoak Ви можете скоротити його до 16 байтів, u:65+1&|.^:]i.26оскільки рекламні оголошення відстежують попередні результати, якщо їм надано список.
милі

1
@miles Приємно, мій підхід |.- 17 байт: u:65+|."0 1/~i.26(все ще використовується /~)
Leaky Nun

1
@LeakyNun Ще 17-байтний підхід u:65+(|./~,.)i.26. Я позбувся звання, використовуючи гачок і ,.обміняючи дальність, але в кінцевому підсумку він був однаковою.
милі

Ви не знаєте, чи можу я десь знайти вихідний код tryj.tk? Я не зміг знайти жодної інформації, ні про нього, ні про автора (f211)
Dan Oak

15

/// , 128 байт

/:/fABCDEFGHIJKLMNOPQRSTUVWXYZ
fbfbAfxf
xbA_xf_x
xfbbbAfbb//x/bff//f/\///b/\\: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:

Спробуйте в Інтернеті!

Надихнувшись дивовижною відповіддю Якубе на виклик L-phabet, я подумав, що спробую свої сили і в реальному програмуванні ///, на відміну від простого використання його для стиснення. Це було досить хитро, і мені знадобилися чотири спроби, але врешті-решт це вийшло набагато коротше, ніж моє рішення на основі стиснення .

Пояснення

Швидкий буквар на ///: в основному інтерпретатор просто зчитує символ коду за символом і робить наступне:

  • Якщо це не \ані a /, а надрукуйте.
  • Якщо це а \, надрукуйте наступний символ.
  • Якщо це a /, проаналізуйте /x/y/інструкцію (з тими самими правилами проходження) та кілька разів замініть всі xв коді, що залишився y.

Отримавши ще трохи натхнення від Jakube, для простоти я просто поясню 4x4 версію цього:

/:/fABCD
fbfbAfxf
xbA_xf_x
xfbbbAfbb//x/bff//f/\///b/\\:B:C:D:

Почнемо, замінивши ті :речі між другим і третім /. Це в кінцевому підсумку стане кодом, який обертає наступні рядки. Ми отримуємо це:

/x/bff//f/\///b/\\fABCD
fbfbAfxf
xbA_xf_x
xfbbbAfbbBfABCD
fbfbAfxf
xbA_xf_x
xfbbbAfbbCfABCD
fbfbAfxf
xbA_xf_x
xfbbbAfbbDfABCD
fbfbAfxf
xbA_xf_x
xfbbbAfbb

f, bІ xпросто скорочення для загальних рядків, які ми будемо розширювати в даний час. Це для косої fриси, bдля косої риски, і xдля того, \//що трапляється, приходить досить багато. Причина я використовую псевдоніми для подстрок односимвольних /і в \тому , що вони повинні бути екрановані в першій інструкції заміни, так що я на самом деле економити досить багато байтів, не потребуючи всі ці зворотні косі риси. Ось що ми отримаємо після того, як x, fі bбули заповнені:

ABCD
/\/\A/\///
\//\A_\///_\//
\///\\\A/\\B/ABCD
/\/\A/\///
\//\A_\///_\//
\///\\\A/\\C/ABCD
/\/\A/\///
\//\A_\///_\//
\///\\\A/\\D/ABCD
/\/\A/\///
\//\A_\///_\//
\///\\\A/\\

Дуже читабельний.

Тож перший рядок просто надрукований дослівно. Потім ми переходимо до фанк-частини, яка обертає всі подальші ряди. Він фактично складається з чотирьох різних інструкцій. Одне, що слід помітити, - це те, що я уникнув усіх подій, що містяться Aв цих інструкціях. Причиною цього є те, що це дозволяє мені відрізнити As в інструкціях від As в решти рядків, які потрібно обробити по-різному.

/\/\A/\//

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

/
\//\A_\//

Це збігається з подачею рядків з наступною косою рисою і замінює його A_/. Таким чином, це вставляє Aв кінці кожного рядка, завершуючи обертання, а також перетворює передачу рядків у підкреслення.

/_\//
\//

Це збігається _/і замінює його на подачу ліній, а потім нахил. Причиною, що мені потрібно зробити цей обхід через підкреслення, є той факт, що /// застосовує кожну інструкцію повторно, поки рядок більше не збігається. Це означає, що ви ніколи не можете використовувати інструкцію форми, /x/axb/де є x, aі bє довільними рядками, тому що після підстановки xзавжди буде відповідати. Зокрема, це означає, що ми не можемо просто вставити щось перед стрічковим каналом. Нам потрібно замінити подачу рядків у процесі та скасувати цю заміну.

/\\\A/\\B/

Це відповідає \Aі замінює його \Bтаким чином, що вказівки після решти, що залишилися, обробляють наступний символ. Після того як усі чотири інструкції були оброблені, решта рядка виглядає приблизно так:

BCDA
/\/\B/\///
\//\B_\///_\//
\///\\\B/\\C/BCDA
/\/\B/\///
\//\B_\///_\//
\///\\\B/\\D/BCDA
/\/\B/\///
\//\B_\///_\//
\///\\\B/\\

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

/\\\B/\\

Неповні інструкції в кінці просто ігноруються і програма припиняється.


Хороший. Вчора я трохи експериментував з іншою ідеєю. Я хотів замінити кожного символу в кожному рядку. Щось на кшталт A->B, B->C... Але це не зовсім спрацювало. Видалення першого знака та додавання його в кінці, безумовно, є набагато кращим підходом.
Якубе

@Jakube Я також спробував це, але нікуди не дістався. Це занадто важко, щоб уникнути псування наступних інструкцій.
Мартін Ендер

1
124 байти: goo.gl/efSLKQ Це лише ваше рішення, але мені вдалося додати кілька додаткових підстановок, так що вам потрібно виписати алфавіт лише один раз. Використовували таку ж стратегію і для подібної проблеми.
Якубе


11

Желе , 7 байт

ØAṙJṢj⁷

Спробуйте в Інтернеті!

Як це працює

ØAṙJṢj⁷  Main link. No arguments.

ØA       Set argument and return value to "ABCDEFGHIJKLMNOPQRSTUVWXYZ".
   J     Yield the indices of the argument, i.e., [1, ..., 26].
  ṙ      Rotate the alphabet 1, ..., 26 units to the left.
         This generates all rotations, but not in the correct order.
    Ṣ    Sort the rotated alphabets.
     j⁷  Join, separating by linefeeds.

11

Emacs, 47 байт

abcdefghijklmnopqrstuvwxyz^M
^P
<F3>
^K ^K ^Y ^Y
^P
^<space> ^F ^W ^E ^Y ^A
<F4>
^U 2 4 F4

Де ^Pозначає "Control P" і т. Д. Це 47 байт, оскільки для клавіш F3 і F4 потрібні два байти ASCII.

Після введення початкового вводу він визначає макрос клавіатури для дублювання рядка та переміщення першого символу до кінця. Потім він запускає макрос ще 24 рази.


2
Ласкаво просимо до PPCG, приємна відповідь! Дуже рідко можна побачити відповідь Emacs, я навіть не знаю, чи відповідь на Emacs вже розміщена.
TuxCrafting

10

JavaScript (ES6), 56 байт

_=>"ABCDEFGHIJKLMNOPQRSTUVWXYZ".replace(/./g,"$&$'$`\n")

Так, саме так, половина мого коду - це буква алфавіту. Найкраще, що я міг зробити без буквального, - це 81 байт:

_=>[...Array(26)].map((_,i,a)=>a.map(_=>(i++%26+10).toString(36)).join``).join`
`

Якщо ви хочете скористатися програмою, а не функцією, видаліть _=>та заверніть console.log()вартість 10 байт.


Вау, молодець. Дуже елегантне рішення. Як це працює?
Полідуки

2
@Polyducks Багато і багато магії regexp. Природно /./gвідповідає кожній букві доданого рядка алфавіту. У рядку заміни, $&представлений самим збігом, $'частиною рядка після відповідності та $`частиною рядка перед матчем. $`$&$'Тому буде представляти оригінальний рядок, але, звичайно, тривіально переміщати частину після матчу до початку, забезпечуючи таким чином ефект обертання.
Ніл

Супер розумний! Молодці @Neil!
Полідуки

9

Mathematica 68 61 байт

Column[""<>RotateLeft["A"~CharacterRange~"Z",#]&/@0~Range~25]

Завдяки...

@MartinEnder (7 байт)


Крім того, Arrayможе бути коротше, ніж відображення над Range.
Мартін Ендер

Я щойно перевірив і Arrayдійсно зберігає байт, але ви можете зберегти інший, уникаючи Column: Array[{"A"~CharacterRange~"Z"~RotateLeft~#,"\n"}&,26,0]<>""(вам просто потрібно буде замінити \nфактичну лінію передачі даних).
Мартін Ендер

7
Не чекаєте вбудованого? Неможливо
MC ΔT

1
Print@@@NestList[RotateLeft,"A"~CharacterRange~"Z",25]
алефальфа

Grid@Array[FromCharacterCode[Mod[+##-2,26]+65]&,{26,26}]
математика

9

Python 2, 75 65 61 58 байт

a='%c'*26%tuple(range(65,91))
for x in a:print a;a=a[1:]+x

Отримує алфавіт map(chr,range(65,91)), а потім вручну застосовує операцію зсуву рядків.

Дякуємо @LeakyNun та @TheBikingViking за -4 байти!

Дякуємо @xnor за -3 байти!


2
Мабуть a="ABCDEFGHIJKLMNOPQRSTUVWXYZ", коротше.
Leaky Nun

1
Можна робити a[1:]замість a[1:26].
TheBikingViking

2
Ваш цикл можна зробити як for x in s:print s;s=s[1:]+x.
xnor

3
Ви можете зробити один байт коротше , ніж жорстко прописувати алфавіту: s='%c'*26%tuple(range(65,91)).
xnor


9

Піт , 247 байт / 190 коделів

Tabula Recta в Піет

Спробуйте в Інтернеті!

Отже, це зайняло набагато більше часу, ніж я передбачав, і у мене є кілька ідей щодо деяких інших більш ефективних (більш зручних для підходів) підходів, але я, нарешті, спрацював з небезпекою (і виправив помилку інтерпретатора та додав функції IDE уздовж спосіб), так ось воно. Навряд чи найефективніша мова, але весело. Ось більший вигляд і слід, який показує пройдений шлях. Історія на моєму GitHub .

Tabula Recta в Piet, велика версія

Tabula Recta біжить слід

Як мову на основі стека, це занадто складно, щоб коротко пояснити, але ось основний огляд того, що роблять різні розділи / петлі. Усі назви змінних та функцій - лише для пояснення, оскільки в Piet немає змінних чи функцій.

  • Ініціалізація (зліва вліво): починається line_counterз 27, завантажує "@" як cur_letter, встановлює letter_count27
  • Основна петля (починаючи з темно-фіолетового, центральний верх)
    • Укази letter_counter
    • Відгалуження до reset_lineнуля (легкий синій 2-блок)
    • Котиться cur_letterдо вершини стека
    • Гілки до check_doneif cur_letter > 'X'(чирок / червоний блок, права сторона)
    • Збільшення cur_letterта виведення його (нижній правий кут)
    • Гілки до reset_letterif cur_letter > 'Y'(світло-зелений блок, зліва)
    • Згортає `letter_counter_ назад до вершини стека, назад до вершини циклу
  • reset_line гілка (великий рожевий квадрат):
    • Виводить символ нового рядка
    • Скидає letter_countдо 27
    • Продовжується назад до верхньої частини петлі
  • check_done гілка (права половина всередині)
    • Котиться line_counterна вершину
    • Гілки закінчуються, якщо нульові
    • Зменшення line_counterі відкочування назад до низу стека
    • Поновлюється там, де він зупинився, друкуючи лист
  • reset_line гілка (ліва сторона, зелений блок):
    • Скидання cur_letterна "@"
    • Поновлюється там, де він припинився, прокручуючи / повертаючись до вершини циклу

8

MATL , 8 байт

Дякуємо @Dennis , який запропонував MATL включати модульну індексацію та @Suever , який мав ідею автоматичних парних операцій.

1Y2t&+Q)

Спробуйте в Інтернеті!

1Y2    % Predefined literal: string 'AB...Z'
t      % Push another copy of it
&+     % 2D array with all pairwise additions of ASCII code points from that string.
       % Gives the 26×26 array [130 131... 155; 131 132... 146; ...; 155 156... 180] 
Q      % Add 1 to each element. First entry is now 131, etc
)      % Index into string 'AB...Z'. Since it has length 26 and MATL uses modular
       % indexing, 131 is the first entry (character 'A'), etc. Implicitly display

8

Javascript, 113 96 91 76 байт

Надкоротка версія для запуску в консолі:

l="ZABCDEFGHIJKLMNOPQRSTUVWXY";for(C=26;C--;console.log(l=l.slice(1)+l[0]));

Javascript / HTML, 140 123 118 105 байт

Гарніша версія з вихідним кодом HTML, що спрощує копіювання та вставлення ОП:

<script>l="ABCDEFGHIJKLMNOPQRSTUVWXYZ";for(C=26;C--;document.write(l+"<br>"),l=l.slice(1)+l[0]);</script>

(EDIT: я повинен був просто використовувати рядок AZ, а не створювати його)

(EDIT 2: Дякую @Neil та @DanTheMan за їхній внесок (див. Коментарі))


Чи не має значення перший C = 26?
DanTheMan

Ой оснащення. Схоже, я забув видалити його, коли перемістив його до. Виправлено! Дякую @DanTheMan :)
Polyducks

1
l.slice(0,1)це просто l[0], поки значення ,27непотрібне, і тоді ви можете перемістити фрагмент і закінчити l.slice(1)+l[0]. Крім того, я думаю, що ви можете перемістити console.logдо корпусу петлі, тим самим уникнувши відставання ;.
Ніл

Тестуйте це зараз, дякую @Neil! EDIT: Солодкий святий молік. Дякую вам обом, я додам вас до коментаря в коментарі.
Полідуки

1
О, приємно, це ще кращий спосіб спрощення console.log.
Ніл


8

R, 47 42 41 байт

write(rep(LETTERS,27)[-27*1:26],1,26,,'') 

Спробуйте в Інтернеті!

Створює 27 алфавітів, видаляє 27-й лист і друкує в 26 стовпцях.

Поліпшення натхненний @Giuseppe «s рішення .



Нічого собі, я думав, що я спробував використати кожен трюк з індексацією, repале це було особливо натхненно! Дуже хороша. Я б знову схвалив, якби міг.
Джузеппе

ви можете використовувати 1замість ""для stdout.
Джузеппе

6

Sesos , 27 25 байт

0000000: 685902 ae7b33 764992 c45d9b 397360 8fef1f 7bca72  hY..{3vI..].9s`...{.r
0000015: 3adc33 07

Спробуйте в Інтернеті! Поставте прапорець Налагодження, щоб побачити сформований код SBIN.

Збірка Sesos

Бінарний файл, описаний вище, був сформований шляхом складання наступного коду SASM.

add 26
jmp
    jmp
        rwd 1, add 1, rwd 1, add 1, fwd 2, sub 1
    jnz
    rwd 2, add 64
    jmp
        fwd 2, add 1, rwd 2, sub 1
    jnz
    fwd 1, sub 1
jnz
fwd 1
jmp
    jmp
        put, fwd 1
    jnz
    rwd 27
    jmp
        put, fwd 1
    jnz
    add 10, put, get, fwd 1
    jmp
        rwd 1, add 1, fwd 1, sub 1
    jnz
    fwd 1
; jnz (implicit)

Як це працює

Почнемо з ініціалізації стрічки до ABCDEFGHIJKLMNOPQRSTUVWXYZ. Це так.

Запишіть 26 у клітинку, залишивши стрічку в наступному стані.

                                                     v
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 26 0

Поки комірка під головою даних не дорівнює нулю, робимо наступне.

Скопіюйте номер у дві клітинки зліва та додайте 64 до крайньої лівої копії.

                                                   v
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 90 26 0 0

Перемістіть крайню ліву копію до початкового місця, а потім відніміть 1 від крайньої правої копії.

                                                     v
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 90 0

Процес зупиняється після 26 ітерацій, оскільки до цього часу найправіша копія дорівнює 0 . Переміщаємо комірку праворуч, тому остаточний стан стрічки після ініціалізації наступний.

     v
0 0 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 0

Тепер ми готові генерувати вихід, повторюючи наступний процес, поки комірка під головою даних не дорівнює нулю.

Спочатку друкуємо символ під заголовком даних і рухаємося праворуч, повторюючи цей крок, поки не знайдеться комірка зі значенням 0 . Після друку ABCDEFGHIJKLMNOPQRSTUVWXYZстрічка виглядає наступним чином.

                                                                                v
0 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 0

Тепер ми переміщуємо головку даних 27 ліворуч (назад до провідного 0 ) і повторюємо комбінацію друку-переміщення, поки не знайдеться комірка зі значенням 0 . Це нічого не друкує і залишає стрічку так.

v
0 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 0

Тепер ми записуємо 10 до поточної комірки, друкуємо відповідний символ (linefeed) та нуль комірки із закликом до getпустого вводу, залишаючи стрічку незмінною.

Після цього ми переміщуємо вміст комірки праворуч до поточної комірки, а потім переміщуємо дані голови до одиниць праворуч.

      v
65 0 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 0

Наступна ітерація дещо інша. Перший крок друку друкується BCDEFGHIJKLMNOPQRSTUVWXYZ, залишаючи стрічку наступним чином.

                                                                                v
65 0 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 0

Тепер ми переміщаємо головку даних 27 одиниць ліворуч.

 v
65 0 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 0

Наступна петля друку надрукує Aта залишає стрічку наступним чином.

   v
65 0 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 0

Ще раз ми друкуємо подачу рядків, переміщуємо вміст комірки праворуч до поточної комірки, а потім переміщуємо головку даних на одиниці праворуч.

         v
65 66 0 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 0

Після ще 24 ітерацій останній крок переміщення головки даних вправо залишає стрічку в наступному стані.

                                                                                v
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 0 0

У комірці під заголовком даних зараз 0 і програма припиняється.


TIO використовує новішу версію Sesos, яка є сумісною для SASM, але генерує коротший код SBIN.


6

Хаскелл, 56 53 52 байт

mapM(\x->putStrLn$init$[x..'Z']++['A'..x])['A'..'Z']

однакова довжина: (використовуючи пропозицію @AndersKaseorg)

a=['A'..'Z']
mapM putStrLn[take 26$[x..'Z']++a|x<-a]

щоб зробити модульні речі, вам потрібно імпортувати Data.Char, щоб отримати функцію chr, 74 59 58 байт - це найкраще, що я міг отримати із цим: (спасибі @nimi за те, що він запропонував функцію toEnum)

a=[0..25]
mapM(\x->putStrLn[toEnum$65+(x+y)`mod`26|y<-a])a

Це, можливо, може бути набагато коротшим, але я не знаю жодних хитрощів Haskell з гольфу.

використаний mapM замість mapM_ (див. коментар @ Lynn)


1
Для −3 байтів змініть ['A'..x]на ['A'..'Z'], яке зараз використовується двічі, і підніміть його до визначення.
Anders Kaseorg

@AndersKaseorg: Дякую! Однак у мене з’явилася ще одна ідея, яка зберегла таку ж кількість байтів, зберігаючи її однолінійкою. Я додав вашу пропозицію до альтернативного рішення.
КарлКастор

Якщо вам потрібно тільки chrз Data.Char, ви можете використовувати toEnumзамість цього і опускати import.
німі

1
Я відчуваю , як змінюється mapM_до mapMповинно бути в порядку. Можливо, це варте мета-поста…
Лінн



5

Мозок-Флак , 222 байти

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

Спробуйте в Інтернеті!

Я новачок у Brain-Flak, тому, можливо, в цьому можна багато пограти в гольф, але принаймні це перша спроба. Він зберігає 27 повних алфавітів у лівій стеці, потім переміщує алфавіти праворуч і замінює кожну 27-ю літеру на новий рядок.

Мій вихідний код трохи заплутаний, але я все-таки додам його.

(((()()()()){})
    park 8 in third
    <(((({}){}){}){})> push 64
)
((((([[]]{}){}()){}))<>()) push 26 twice on left and 27 on right
left stack: 64 letter, 26 letter count, 26 constant
right stack: 27 alphabet count
{ while alphabet count
    <>
    ({}<>)<> push 26 back to right
    { while counter
        (
            {} park counter in third
                <(({}()))> add next letter to stack
            [()] decrement counter
        )
    }
    {} pop 0 counter
    <>([({})]<>{}) set Z back to A-1
    <>(({}<>)) move 26 twice from right to left
    <> go to right stack
    ({}[()]) decrement counter
}
{} pop 0
<>(({}<>)) push 26 twice on right stack
<>{}{}{} pop counter, @ and Z from left stack
<> go to right stack
{ while alphabet count
    (
        {} save alphabet count on third stack
        <(
            ({}())[()] save constant on third stack and push lettercount 26 + 1 for lf
            <
                {   while lettercount
                    (
                        {} save lettercount on third stack
                        <
                            <>({}<>) pull letter from left to right
                        > 
                        [()] decrement lettercount
                    )
                }
                {} pop 0
                {} pop last letter
                ((()()()()()){}) push lf
            >
        )>
        [()] decrement alphabet count
    )
}
{}{}{} pop alphabet count, constant and lf

5

V , 36 , 10 байт

¬AZ25ñÙx$p

Спробуйте в Інтернеті!

Для цього використовується кодування "Latin1".

Пояснення:

¬AZ         " Insert the alphabet
   25ñ      " 25 times...
      Ù     "   Duplicate this line
       x    "   Cut the first character
        $p  "   Move to the end of the line and past the character we just cut

Перейдіть і додайте його потім;)
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Наразі ви повинні знати, що єдиний спосіб, що робиться цією мовою, - це темпи равликів. Я, мабуть, буду це працювати і колись наступного січня. : P
DJMcMayhem

О, в найближчі 6-8 тижнів?
Conor O'Brien

4

C #, 98 байт

Я спробував зрозуміти, чи можу я генерувати літери коротше, ніж просто ініціалізувати їх як рядок, але це насправді неможливо. Літери мають 26 байт, і цей фрагмент поодинці

for(char a='A';a<'[';a++)

становить 25 байт. Я думаю, що їх ініціалізація, а потім додавання + = a є хорошим рішенням, але з C # ви обмежені числом функцій, таких як Substring()і Console.WriteLine().

Моя спроба в 98 байт:

var a="ABCDEFGHIJKLMNOPQRSTUVWXYZ";a+=a;for(int i=0;i<26;i++)Console.WriteLine(a.Substring(i,26));

4

Октава, 27 байт

Ми додаємо вектор і рядок, і стовпець, і Octave чудово розширює розміри сиглетона, не потребуючи bsxfun(як вам потрібно в Matlab).

[mod((v=0:25)+v',26)+65,'']


4

Java, 190 176 172 163 байт

class C{public static void main(String[] a){int s=0;while(s<26){p(s,26);p(0,s++);p(-1,0);}}static void p(int s,int e){for(;s<e;s++)System.out.write(s<0?10:65+s);}}

Ви можете легко поголити ще кілька байтів: System.out.printf("%c", ...)-> System.out.write(...), '\n'-> 10, 'A'-> 65. Зауважте, що дозволено пропозицію новинки / рядка каналу каналу, але вимога виведення ідеону . :)
МЗ.

@MH. чудові поради! збережено 9 байт :)
Master_ex

Я знаю, що минуло більше року з того часу, як ти відповів на це, але ти все одно можеш пограти в декілька речей: Простір на місці String[]aможна видалити; і int s=0;while(s<26){p(s,26);p(0,s++);p(-1,0);}може бути for(int s=0;s<26;p(0,s++),p(0,s++))p(s,26);.
Кевін Круїссен

4

Баш, 66 байт

A=`printf %c {A..Z}`
for i in {0..25};do echo ${A:$i}${A::$i};done

Я створюю повний алфавіт A, а потім надрукую 26 повернутих його версій, взявши символи, що починаються з цього місця nі додавши це попереднє положення n.


4

Perl, 42 байти

Повна заслуга @Dom Hastings за це.

@l=A..Z;say@l[$_..25],@l[0..$_-1]for 0..25  

Або (те саме число байтів):

$_=join"",A..Z;eval'say;/./;$_=$\'.$&;'x26

Потрібно -M5.010або -Eзапустити, наприклад:

perl -E '@l=A..Z;say@l[$_..25],@l[0..$_-1]for 0..25'



Моя стара відповідь (55 байт):

@t=A..Z;for$i(0..25){print$t[($_+$i)%26]for 0..25;say}

Потрібно -M5.010бігти. Тож біжіть із:

perl -M5.010 -e '@t=A..Z;for$i(0..25){print$t[($_+$i)%26]for 0..25;say}'  

Це, мабуть, можна зробити і коротше, але я не дізнався, як ... поки


Вдалося придумати пару 42-байтних рішень: @l=A..Z;say@l[$_..25],@l[0..$_-1]for 0..25і $_=join"",A..Z;eval'say;/./;$_=$\'.$&;'x26обидва вимагають -E/ -M5.010.
Дом Гастінгс

Чудово зроблено. Виглядає набагато краще, ніж моя спроба! дякую
Дада
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.