Wydrukuj Tabula Recta!

81

Wydrukuj Tabula Recta!

Tabula Recta (czasami nazywana „tabelą Vigenere”) została stworzona przez Johannesa Trithemiusa i została użyta w kilku szyfrach, w tym we wszystkich wariantach szyfru Vigenere Bellaso i szyfru Trithemius. To wygląda tak:

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

Często tego potrzebuję, ale nie mogę go znaleźć w Internecie, aby skopiować i wkleić. Ponieważ kwadratowy stół jest tak długi i zajmuje dużo lat, aby napisać , Twój kod musi być jak najkrótszy.

Zasady / wymagania

  • Każde zgłoszenie powinno być pełnym programem lub funkcją. Jeśli jest to funkcja, musi być uruchomiona, wystarczy dodać wywołanie funkcji na dole programu. Wszystko inne (np. Nagłówki w C) musi zostać uwzględnione.
  • Jeśli to możliwe, podaj link do strony, na której można przetestować Twój program.
  • Twój program nie może nic pisać STDERR.
  • Standardowe luki są zabronione.
  • Twój program może wysyłać dane w każdym przypadku, ale musi zostać wydrukowany (nie tablica lub podobny).

Punktacja

Programy są oceniane według bajtów, domyślnie w UTF-8 lub według innego zestawu znaków.

W końcu wygra odpowiedź z najmniejszą liczbą bajtów.

Zgłoszenia

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

# Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

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

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

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

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:

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

Tabela liderów

Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.

George Gibson
źródło
Odnośnie do reguły 1: czy musimy zawrzeć każdy nagłówek dla każdej funkcji, której używamy?
owacoder
Miałem na myśli, jeśli używamy printf, musimy uwzględnić stdio.h, jeśli isalphajest używany, ctype.hjest potrzebny itp. Czy to prawda?
owacoder
3
Prawdopodobnie powinieneś wpisać „mała litera jest dozwolona” w samej specyfikacji wyzwania. Tylko dlatego ludzie są mniej skłonni do przegapienia tego, jeśli nie zobaczą tych komentarzy.
Sherlock9
2
czy muszę go wydrukować, czy mogę zwrócić tablicę znaków / znaków
downrep_nation 30.07.16
1
Dzięki za pytanie, żebym nie spała całą noc. (+1)
Anastasiya-Romanova 秀

Odpowiedzi:

30

05AB1E , 6 5 bajtów

Dzięki Downgoat za oszczędność 1 bajtu. Kod:

ADv=À

Wyjaśnienie:

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.

Wykorzystuje kodowanie CP-1252 . Wypróbuj online! .

Adnan
źródło
Jaki jest cel tego powielania?
Esolanging Fruit,
1
@ Challenger5 vPolecenie zużywa wartość, iterując nad nią. W tym przypadku zużywa alfabet, więc iteruje 26 razy. Dokładnie tyle razy potrzebujemy iteracji tej funkcji. W =pozostawia nienaruszone stos i Àtylko obraca się w górnej części elementu stosu 1 w lewo. Czy to odpowiada na twoje pytanie? :)
Adnan
101

Vim, 25 23 bajtów

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

Gdzie jest klawisz Return.

: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 rozwiązania

EDYCJA : małe litery są w porządku, więc mogę zapisać dwa klucze.

Lynn
źródło
23
To :h<_<cr>jjYjest genialne
Downgoat
3
Łał, to niesamowite! OP powiedział, że małe litery są OK, więc możesz je usunąćV~
DJMcMayhem
4
@RobStarling patrz: meta.codegolf.stackexchange.com/q/8995/40695
Downgoat
4
Odważę się, żeby ktoś spróbował tego w emacsie.
addison
2
Odpowiedź
TuxCrafting
24

Python 2, 59 57 53 bajtów

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

Dzięki @xsot za -4 bajty!

Dianne
źródło
4
Ten mi się podoba. Nawiasem mówiąc, możesz skrócić ostatnią linię do print bytearray(a).
xsot 31.07.16
18

/// , 220 bajtów

/|/\/\///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

Wypróbuj online!

Było to zaskakująco nietrywialne i nie mam pojęcia, czy jest optymalne.

Jedynym sposobem na rozwiązanie tego problemu w /// jest wyodrębnienie typowych podciągów. ( Okazuje się, że się myliłem. ) Jednak ze względu na charakter wyniku nie jest wcale jasne, które podciągi powinny być najlepiej wyodrębnione, ponieważ nie można wyodrębnić całego alfabetu z powodu przełamania linii. Musisz więc wyodrębnić niektóre podciągi z zawiniętego alfabetu, ale są też kompromisy pod względem tego, jak długo tworzysz podciągi i które wybierasz.

Oto co zrobiłem. Jest to skrypt CJam, który wyszukuje wszystkie podciągi o długości do 25 w danym ciągu i dla każdego z nich oblicza, ile bajtów zaoszczędziłoby jego wyodrębnianie. Zasadniczo, jeśli istnieją Nkopie Mpodłańcucha o długości , można zapisać (N-1)*(M-1) - 5podciągi, te podciągi nie zawierają ukośników. Ponadto, technicznie rzecz biorąc, kiedy już wyodrębniłeś około 8 podciągów, stałe przesunięcie na końcu zmniejsza się do -4, ale skrypt tego nie bierze pod uwagę.

W każdym razie oto, co zrobiłem ze skryptem:

  • Uruchom skrypt dla bieżącego kodu (który początkowo jest tylko wyjściem).
  • Spośród podłoży, które zapewniają największą poprawę, wybierz najkrótszą. Jeśli jest ich kilka, wybierz najmniejszy leksykograficznie (z tego, co mogę powiedzieć, dla danego wejścia zmniejsza to nakładanie się podłańcuchów).
  • Zamień wszystkie wystąpienia wybranego podciągu w kodzie na nieużywaną małą literę.
  • Wstaw /x/ABC/do kodu, w którym xjest wybrana litera i ABCpodłańcuch.
  • Powtarzaj, aż nie pozostaną żadne podciągi, które by cokolwiek zapisały.

Na koniec, możemy zaoszczędzić kilka bajtów więcej zastępując wynikające //z |i poprzedzenie /|/\/\//(dlatego wydobywania podciągi kosztuje tylko 4 zamiast 5 bajty po 8 podciągu lub tak).

Tak jak powiedziałem, nie mam pojęcia, czy jest to optymalne i dość nieregularnie wyglądający wynik wydaje mi się bardzo interesujący. Może być możliwe uzyskanie krótszego rozwiązania poprzez wybranie nieoptymalnych (ale więcej) podciągów gdzieś poniżej linii. Zastanawiam się, jaka jest klasa złożoności tego problemu ...

Martin Ender
źródło
To ... jest ... genialne ...
George Gibson
1
@GeorgeGibson Dzięki ... Musiałem zacząć od połowy, kiedy zauważyłem pewne YXw wynikach . ;)
Martin Ender
Moja odpowiedź zniknęła, to było duplikat tego (większy i później). +1 za to [niesamowite golfa]!
Erik the Outgolfer
Jeśli chodzi o klasę złożoności, czy problem nie powinien być nierozstrzygalny, ponieważ /// jest zakończone Turinga? Problem polega na tym, że „biorąc pod uwagę ciąg, znajdź najkrótszy program ///, który go wyprowadza”. Z wyjątkiem małych ciągów, istniałyby programy ///, które zapętlają się w nieskończoność (ale nie można udowodnić, że zapętlają się w nieskończoność), których nie można pokazać, aby nie generowały pożądanego wyjścia bez uruchamiania ich na zawsze. Formalny dowód Nie jestem jeszcze pewien, ale intuicyjnie nie jest to możliwe?
ghosts_in_the_code
16

C, 47 bajtów

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

Wypróbuj na Ideone

Pojedyncza pętla drukująca alfabet co 26 znaków, ale co 27 ​​znak zastępowany jest nową linią.

Anders Kaseorg
źródło
1
Cholera! Właśnie napisałem dokładnie tę samą funkcję! :-) Możesz zapisać pierwszy średnik, używając f(i)wtedy wywołania f()bez żadnych argumentów.
Level River St
@LevelRiverSt To będzie polegać na niezdefiniowanym zachowaniu.
Anders Kaseorg,
2
To ostatecznie zależy od ciebie, ale PPCG uważa, że ​​języki są definiowane przez ich implementacje, więc dopóki wspominasz, w którym kompilatorze działa, poleganie na UB nie jest uważane za problem.
Dennis
możesz ogolić 1 bajt, inicjując i, gdy po raz pierwszy wspomniano:i=702;f(){for(;i--;)//...
tucuxi
3
@tucuxi Nie, ponieważ odpowiedzi funkcji muszą być wielokrotnego użytku .
Anders Kaseorg
15

J, 15 bajtów

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

Tłumacz online .

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
Leaky Nun
źródło
Miły! Bardzo sprytna arytmetyka. Najprostsze podejście, które wykorzystuje, |. (Shift)to 8 bajtów dłużej! (i.26)(|."0 _)u:65+i.26
Dan Oak
1
@dahnoak Możesz skrócić go do 16 bajtów, u:65+1&|.^:]i.26ponieważ przysłówki mocy śledzą poprzednie wyniki, jeśli podano listę.
mile
1
@miles Nice, moje podejście przy użyciu |.jest 17 bajtów: u:65+|."0 1/~i.26(nadal używa /~)
Leaky Nun
1
@LeakyNun Kolejne 17-bajtowe podejście to u:65+(|./~,.)i.26. Pozbyłem się rangi za pomocą haka i ,.do skoluminowania zasięgu, ale skończyło się na tej samej długości.
mile
nie wiesz czy mogę gdzieś znaleźć kod źródłowy tryj.tk? Nie mogłem znaleźć żadnych informacji ani o tym, ani o autorze (f211)
Dan Oak
15

/// , 128 bajtów

/:/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:

Wypróbuj online!

Zainspirowany niesamowitą odpowiedzią Jakube'a na wyzwanie związane z literami L, pomyślałem, że spróbuję również swoich sił w programowaniu w ///, zamiast używać go do kompresji. Było to dość trudne i potrzebowałem czterech prób, ale ostatecznie okazało się, że jest znacznie krótsze niż moje rozwiązanie oparte na kompresji .

Wyjaśnienie

Szybki start na ///: w zasadzie interpreter po prostu odczytuje kod znak po znaku i wykonuje następujące czynności:

  • Jeśli nie jest to \ani a /, wydrukuj go.
  • Jeśli tak \, wydrukuj następny znak.
  • Jeśli jest to /, przeanalizuj /x/y/instrukcję (z tymi samymi regułami zmiany znaczenia) i kilkakrotnie zamień wszystko xw pozostałym kodzie na y.

Biorąc trochę inspiracji z Jakube, dla uproszczenia wyjaśnię po prostu wersję 4x4 tego:

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

Zaczynamy od zastąpienia tych :rzeczy między drugim a trzecim /. Skończy się to kodem, który obraca kolejne rzędy. Otrzymujemy to:

/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, bI xto tylko skróty dla typowych ciągów, które będziemy rozszerzać teraz. To fjest dla ukośników, bjest dla ukośników odwrotnych i xdla \//których zdarza się dość często. Powodem, dla którego używam aliasów dla podłańcuchów jednoznakowych /i \jest to, że musiałyby one być poprzedzone znakami ucieczki w pierwszej instrukcji podstawiania, więc w rzeczywistości oszczędzam sporo bajtów, nie potrzebując tych wszystkich odwrotnych ukośników. Oto co otrzymujemy po x, fi bzostały wypełnione:

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

Bardzo czytelny.

Więc pierwszy wiersz jest drukowany dosłownie. Następnie dochodzimy do funky, która obraca wszystkie kolejne rzędy. W rzeczywistości składa się z czterech różnych instrukcji. Należy zauważyć, że uniknąłem wszystkich wystąpień Aw tych instrukcjach. Powodem tego jest to, że pozwala mi odróżnić As wewnątrz instrukcji od As w pozostałych wierszach, które muszą być przetwarzane inaczej.

/\/\A/\//

To dopasowuje /Ai zastępuje go /, usuwając A. Zauważ, że ten podciąg pojawia się tylko z przodu każdego ABCD, więc upuszcza pierwszy znak wszystkich kolejnych wierszy:

/
\//\A_\//

Odpowiada to wysuwowi wiersza, po którym następuje ukośnik i zastępuje go A_/. To wstawia znak Ana końcu każdej linii, kończąc obrót, a także zamienia linię na podkreślenie.

/_\//
\//

To dopasowuje _/i zastępuje go wierszem, a następnie ukośnikiem. Powodem, dla którego muszę zrobić ten objazd przez podkreślenie, jest fakt, że /// stosuje każdą instrukcję wielokrotnie, dopóki łańcuch nie będzie już pasował. Oznacza to, że nigdy nie można używać instrukcji w formie /x/axb/gdzie x, ai bsą dowolne ciągi znaków, bo po podstawienie xzawsze będzie wciąż takie same. W szczególności oznacza to, że nie możemy po prostu wstawić czegoś przed linią. Musimy w tym procesie wymienić wysuw linii i cofnąć tę zamianę.

/\\\A/\\B/

To dopasowuje \Ai zastępuje go \B, dzięki czemu instrukcje po pozostałych wierszach przetwarzają następny znak. Po przetworzeniu wszystkich czterech instrukcji pozostały ciąg wygląda następująco:

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

Tak więc teraz drukowany jest pierwszy obrócony rząd, a następnie następny zestaw instrukcji obraca pozostałe rzędy o inną komórkę i tak dalej. Po ostatnim obrocie mamy jeszcze kilka instrukcji, które możemy zignorować, a następnie kończymy niepełną instrukcją:

/\\\B/\\

Niekompletne instrukcje na końcu są po prostu ignorowane i program się kończy.

Martin Ender
źródło
Niezłe. Wczoraj eksperymentowałem trochę z innym pomysłem. Chciałem zastąpić każdy znak w każdej linii. Coś podobnego A->B, B->C... ale nie dość pracy. Usunięcie pierwszego znaku i dodanie go na końcu jest zdecydowanie lepszym podejściem.
Jakube,
@Jakube Próbowałem tego również, ale nigdzie się nie dostałem. Zbyt trudno jest też nie zepsuć kolejnych instrukcji.
Martin Ender,
1
124 bajty: goo.gl/efSLKQ To tylko twoje rozwiązanie, ale udało mi się dodać kilka dodatkowych podstawień, dzięki czemu alfabet trzeba zapisać tylko raz. Zastosowano tę samą strategię w przypadku podobnego problemu.
Jakube,
1
122: goo.gl/zRsBbR
Jakube
11

Galaretka , 7 bajtów

ØAṙJṢj⁷

Wypróbuj online!

Jak to działa

Ø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.
Dennis
źródło
11

Emacs, 47 bajtów

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

Gdzie ^Poznacza „Control P” itp. To 47 bajtów, ponieważ klawisze F3 i F4 wymagają dwóch bajtów ASCII.

Po wprowadzeniu danych wejściowych definiuje makro klawiatury, które powiela linię i przenosi pierwszy znak na koniec. Następnie uruchamia makro kolejne 24 razy.

MattBlissett
źródło
2
Witamy w PPCG, fajna odpowiedź! Bardzo rzadko można zobaczyć odpowiedź Emacsa, nawet nie wiem, czy odpowiedź Emacsa została już opublikowana.
TuxCrafting
10

JavaScript (ES6), 56 bajtów

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

Tak, zgadza się, połowa mojego kodu to literał ciąg alfabetu. Najlepsze, co mogę zrobić bez literału, to 81 bajtów:

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

Jeśli chcesz program, a nie funkcję, usuń _=>i owiń console.log()za 10 bajtów.

Neil
źródło
Woah, dobra robota. Bardzo eleganckie rozwiązanie. Jak to działa?
Polyducks,
2
@Polyducks Dużo i wiele magii wyrażeń regularnych. Naturalnie /./gpasuje do każdej litery dostarczonego ciągu alfabetu. W zastępującym ciągu $&reprezentuje samo dopasowanie, $'część ciągu po dopasowaniu i $`część ciągu przed dopasowaniem. $`$&$'reprezentuje zatem oryginalny ciąg, ale oczywiście przeniesienie części po dopasowaniu na początek jest trywialne, zapewniając w ten sposób efekt obrotu.
Neil,
Bardzo mądry! Dobra robota @Neil!
Polyducks,
9

Mathematica 68 61 bajtów

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

Dzięki...

@MartinEnder (7 bajtów)

jaskółka oknówka
źródło
Ponadto Arraymoże być krótsze niż mapowanie nad Range.
Martin Ender
Właśnie sprawdziłem i Arrayrzeczywiście zapisuję bajt, ale możesz zapisać kolejny, unikając Column: Array[{"A"~CharacterRange~"Z"~RotateLeft~#,"\n"}&,26,0]<>""(wystarczy zastąpić bajt \nrzeczywistym).
Martin Ender
7
Czekaj, nie ma wbudowanego? Niemożliwe
MC ΔT
1
Print@@@NestList[RotateLeft,"A"~CharacterRange~"Z",25]
alephalpha
Grid@Array[FromCharacterCode[Mod[+##-2,26]+65]&,{26,26}]
mathe
9

Python 2, 75 65 61 58 bajtów

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

Pobiera alfabet map(chr,range(65,91)), a następnie ręcznie stosuje operację przesunięcia łańcucha.

Dzięki @LeakyNun i @TheBikingViking za -4 bajty!

Dzięki @xnor za -3 bajty!

Miedź
źródło
2
Najwyraźniej a="ABCDEFGHIJKLMNOPQRSTUVWXYZ"jest krótszy.
Leaky Nun
1
Możesz zrobić a[1:]zamiast a[1:26].
TheBikingViking
2
Twoja pętla może być wykonana jako for x in s:print s;s=s[1:]+x.
xnor
3
Można zrobić jeden bajt krótszy niż hardcoding alfabetu: s='%c'*26%tuple(range(65,91)).
xnor 30.07.16
9

C, 88 64 bajtów

Zadzwoń f()bez argumentów.

f(i,j){for(i=j=0;i<26;putchar(j==26?j=0,i++,10:65+(i+j++)%26));}

Wypróbuj na ideone .

owacoder
źródło
9

Piet , 247 bajtów / 190 kodów

Tabula Recta in Piet

Wypróbuj online!

Trwało to znacznie dłużej, niż się spodziewałem, i mam kilka pomysłów na inne, bardziej wydajne (bardziej przyjazne dla stosów) podejścia, ale w końcu udało mi się zadziałać (poprawiłem błąd interpretera i dodałem funkcje IDE wzdłuż sposób), więc oto jest. Nie jest to najbardziej wydajny bajtowo język, ale jest naprawdę świetna zabawa. Oto większy widok i ślad pokazujący wybraną ścieżkę. Historia na moim GitHubie .

Tabula Recta in Piet, duża wersja

Tabula Recta run trace

Jako język oparty na stosie jest zbyt skomplikowany, by go krótko wyjaśniać, ale oto podstawowy przegląd tego, co robią różne sekcje / pętle. Wszystkie nazwy zmiennych i funkcji służą wyłącznie wyjaśnieniu, ponieważ w Piet nie ma żadnych zmiennych ani funkcji.

  • Inicjalizacja (lewy górny róg): zaczyna się line_counterod 27, ładuje „@” as cur_letter, ustawia letter_countna 27
  • Pętla główna (od ciemnego fioletu, środkowa góra)
    • Ubytki letter_counter
    • Rozgałęzia się do reset_linezera (jasnobłękitny 2-blokowy)
    • Rzutuje cur_letterna szczyt stosu
    • Gałęzie do check_doneif cur_letter > 'X'(turkusowy / czerwony blok, prawa strona)
    • Przyrosty cur_letteri wyjścia (prawy dolny róg)
    • Gałęzie do reset_letterif cur_letter > 'Y'(jasnozielony blok, po lewej)
    • Zrzuca `letter_counter_ z powrotem na górę stosu, z powrotem na górę pętli
  • reset_line gałąź (duży różowy kwadrat):
    • Wyświetla znak nowej linii
    • Resetuje letter_countdo 27
    • Kontynuuje powrót do początku głównej pętli
  • check_done gałąź (prawa połowa wewnątrz)
    • Rolls line_counterto top
    • Oddziały kończą się, jeśli zero
    • Zmniejsza line_counteri przewraca z powrotem na dół stosu
    • Wznawia od miejsca, w którym zostało przerwane, drukuje list
  • reset_line gałąź (lewa strona, zielony blok):
    • Resetuje się cur_letterdo „@”
    • Wznawia od miejsca, w którym zostało przerwane, przewijanie / powrót do początku pętli
cincodenada
źródło
8

MATL , 8 bajtów

Z podziękowaniami @Dennis , który zasugerował, że MATL powinien obejmować modułowe indeksowanie, oraz @Suever , który wpadł na pomysł automatycznych operacji parowania.

1Y2t&+Q)

Wypróbuj online!

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
Luis Mendo
źródło
8

JavaScript, 113 96 91 76 bajtów

Super-krótka wersja do uruchamiania w konsoli:

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

JavaScript / HTML, 140 123 118 105 bajtów

Ładniejsza wersja z wyjściem HTML, który ułatwia OP kopiowanie i wklejanie:

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

(EDYCJA: Powinienem był po prostu użyć ciągu AZ zamiast go generować)

(EDYCJA 2: Podziękowania dla @Neil i @DanTheMan za ich wkład (patrz komentarze))

Polyducks
źródło
Czy pierwsze C = 26 nie ma znaczenia?
DanTheMan
O rany. Wygląda na to, że zapomniałem go usunąć, kiedy przeniosłem go do. Naprawiony! Dzięki @DanTheMan :)
Polyducks
1
l.slice(0,1)jest po prostu l[0], podczas gdy nie ,27jest konieczne, w którym momencie możesz przenieść plasterek i skończyć z l.slice(1)+l[0]. Myślę też, że można przesunąć console.logciało do pętli, unikając w ten sposób przeciągania ;.
Neil
Testuję to teraz, dzięki @Neil! EDYCJA: Sweet Holy Moly. Dzięki wam obojgu dodam was do uznania w komentarzu.
Polyducks
1
Och, fajnie, to jeszcze lepszy sposób uproszczenia console.log.
Neil
8

PowerShell, 44 bajty

-1..24|%{-join[char[]](65..90)[($_-25)..$_]}
Joey
źródło
8

R, 47 42 41 bajtów

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

Wypróbuj online!

Generuje 27 alfabetów, usuwa 27 liter i drukuje w 26 kolumnach.

Poprawa zainspirowany @Giuseppe „s rozwiązania .

Robert Hacken
źródło
1
46 bajtów
Giuseppe
Wow, myślałem, że wypróbowałem każdą sztuczkę indeksowania, repale było to szczególnie inspirujące! Bardzo dobrze. Głosowałbym ponownie, gdybym mógł.
Giuseppe
możesz użyć 1zamiast ""dla stdout.
Giuseppe,
6

Sesos , 27 25 bajtów

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

Wypróbuj online! Zaznacz opcję Debuguj, aby zobaczyć wygenerowany kod SBIN.

Montaż Sesos

Powyższy plik binarny został wygenerowany przez skompletowanie następującego kodu 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)

Jak to działa

Zaczynamy od inicjalizacji taśmy ABCDEFGHIJKLMNOPQRSTUVWXYZ. Jest to następujące.

Napisz 26 do komórki, pozostawiając taśmę w następującym stanie.

                                                     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

Dopóki komórka pod głowicą danych jest niezerowa, wykonujemy następujące czynności.

Skopiuj liczbę do dwóch komórek po lewej stronie i dodaj 64 do kopii najbardziej po lewej stronie.

                                                   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

Przenieś kopię po lewej stronie do oryginalnej lokalizacji, a następnie odejmij 1 od kopii po prawej stronie.

                                                     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

Proces zatrzymuje się po 26 iteracjach, ponieważ prawostronna kopia wynosi do tego czasu 0 . Przesuwamy komórkę w prawo, więc końcowy stan taśmy po inicjalizacji jest następujący.

     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

Teraz jesteśmy gotowi wygenerować wynik, powtarzając następujący proces, aż komórka pod głowicą danych wyniesie zero.

Najpierw drukujemy znak pod głowicą danych i przechodzimy w prawo, powtarzając ten krok, aż do znalezienia komórki o wartości 0 . Po wydrukowaniu ABCDEFGHIJKLMNOPQRSTUVWXYZtaśma wygląda następująco.

                                                                                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

Teraz przesuwamy głowicę danych o 27 jednostek w lewo (z powrotem do początkowego 0 ) i powtarzamy kombinację print-move, aż do znalezienia komórki o wartości 0 . Nie drukuje nic i pozostawia taśmę w następujący sposób.

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

Teraz piszemy 10 do bieżącej komórki, wypisujemy odpowiedni znak (wysuw linii) i zerujemy komórkę, wywołując getpuste wejście, pozostawiając niezmienioną taśmę.

Następnie przenosimy zawartość komórki w prawo do bieżącej komórki, a następnie przesuwamy głowicę danych do jednostek w prawo.

      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

Kolejna iteracja jest nieco inna. Pierwszy krok drukowania zostanie wydrukowany BCDEFGHIJKLMNOPQRSTUVWXYZ, pozostawiając taśmę w następujący sposób.

                                                                                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

Teraz przesuwamy głowicę danych o 27 jednostek w lewo.

 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

Kolejna pętla drukująca drukuje Ai pozostawia taśmę w następujący sposób.

   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

Ponownie drukujemy wysuw linii, przesuwamy zawartość komórki w prawo do bieżącej komórki, a następnie przesuwamy głowicę danych do jednostek w prawo.

         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

Po 24 kolejnych iteracjach ostatni krok przesunięcia głowicy danych w prawo pozostawia taśmę w następującym stanie.

                                                                                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

Komórka pod głowicą danych ma teraz wartość 0 i program się kończy.


TIO używa nowszej wersji Sesos, która jest wstecznie kompatybilna z SASM, ale generuje krótszy kod SBIN.

Dennis
źródło
6

Haskell, 56 53 52 bajtów

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

ta sama długość: (przy użyciu sugestii @AndersKaseorg)

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

aby robić rzeczy modułowe, musisz zaimportować dane.Char, aby uzyskać funkcję chr, 74 59 58 Bajtów było najlepsze, co mogłem z tym uzyskać: (dzięki @nimi za sugestię funkcji toEnum)

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

To może być prawdopodobnie krótsze, ale nie znam żadnych sztuczek golfowych Haskell.

użyłem mapM zamiast mapM_ (patrz komentarz @ Lynn)

KarlKastor
źródło
1
W przypadku −3 bajtów zmień ['A'..x]na ['A'..'Z'], który jest teraz używany dwa razy, i przenieś go do definicji.
Anders Kaseorg
@AndersKaseorg: Dzięki! Jednak wpadłem na inny pomysł, który pozwolił zaoszczędzić tyle samo bajtów, zachowując jednocześnie oneliner. Dodałem jednak twoją sugestię do alternatywnego rozwiązania.
KarlKastor
Jeśli potrzebujesz tylko chrod Data.Char, można użyć toEnumzamiast i pominąć import.
nimi
1
Czuję, że zmiana mapM_na mapMpowinna być w porządku. Może to jest warte meta posta
Lynn
5

Siatkówka, 36 31 bajtów

5 bajtów dzięki Martinowi Enderowi.

Z
{2`
$ `
} T01`L`_L
\ `.
$ & $ '$ `¶

Wiodące podawanie linii jest znaczące.

Wypróbuj online!

Kredyty .

Leaky Nun
źródło
5

Brain-Flak , 222 bajty

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

Wypróbuj online!

Jestem nowy w Brain-Flak, więc może to można dużo zagrać w golfa, ale przynajmniej to pierwsza próba. Przechowuje 27 pełnych alfabetów na lewym stosie, a następnie przesuwa alfabety w prawo i zamienia każdą 27 literę na nową linię.

Mój kod źródłowy jest nieco mylący, ale mimo to go dodam.

(((()()()()){})
    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
dorycki
źródło
5

V , 36 , 10 bajtów

¬AZ25ñÙx$p

Wypróbuj online!

Wykorzystuje to kodowanie „Latin1”.

Wyjaśnienie:

¬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
DJMcMayhem
źródło
Idź i dodaj to;)
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Powinieneś już wiedzieć, że jedynym sposobem na zrobienie czegokolwiek w tym języku jest tempo ślimaków. Prawdopodobnie uruchomię to w styczniu przyszłego roku. : P
DJMcMayhem
Och, w ciągu najbliższych 6-8 tygodni?
Conor O'Brien
4

C #, 98 bajtów

Próbowałem sprawdzić, czy mogę wygenerować litery krótsze niż tylko inicjowanie ich jako łańcucha, ale tak naprawdę nie jest to możliwe. Litery mają 26 bajtów i sam ten fragment kodu

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

ma 25 bajtów. Myślę, że zainicjowanie ich, a następnie dodanie ich za pomocą + = a jest dobrym rozwiązaniem, ale w C # jesteś ograniczony liczbą bajtów funkcji takich jak Substring()i Console.WriteLine().

Moja próba na 98 bajtów:

var a="ABCDEFGHIJKLMNOPQRSTUVWXYZ";a+=a;for(int i=0;i<26;i++)Console.WriteLine(a.Substring(i,26));
Daniel
źródło
4

Oktawa, 27 bajtów

Dodajemy wektor wiersza i kolumny, a Octave ładnie rozszerza wymiary sigleton, bez potrzeby bsxfun(tak jak w Matlabie).

[mod((v=0:25)+v',26)+65,'']
wada
źródło
4

q, 20 bajtów

(til 26)rotate\:.Q.A
skeevey
źródło
14 bajtów -1_'26 27#.Q.A
streetster,
4

Java, 190 176 172 163 bajtów

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);}}
Master_ex
źródło
Możesz łatwo zgolić więcej bajtów: System.out.printf("%c", ...)-> System.out.write(...), '\n'-> 10, 'A'-> 65. Należy pamiętać, że sugestia znaku nowej linii / wiersza jest dozwolona, ​​ale wymaga wyjściowej ideone . :)
MH.
@MH. świetne wskazówki! zapisano 9 bajtów :)
Master_ex
Wiem, że minął ponad rok, odkąd odpowiedziałeś na to pytanie, ale wciąż możesz zagrać w golfa w kilku rzeczach: Przestrzeń w String[]amożna usunąć; i int s=0;while(s<26){p(s,26);p(0,s++);p(-1,0);}może być for(int s=0;s<26;p(0,s++),p(0,s++))p(s,26);.
Kevin Cruijssen
4

Bash, 66 bajtów

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

Tworzę pełny alfabet A, a następnie drukuję 26 jego obróconych wersji, biorąc znaki zaczynające się od ni dołączając poprzednie n.

Toby Speight
źródło
4

Perl, 42 bajty

Pełny kredyt za @Dom Hastings za to.

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

Lub (ta sama liczba bajtów):

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

Potrzebuje -M5.010lub -Euruchomić, na przykład:

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



Moja stara odpowiedź (55 bajtów):

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

Musisz -M5.010biec. Więc uruchom z:

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

Prawdopodobnie można to zrobić krócej, ale nie dowiedziałem się, jak ... jeszcze

Dada
źródło
Udało się wymyślić kilka 42 bajtowych rozwiązań: @l=A..Z;say@l[$_..25],@l[0..$_-1]for 0..25i $_=join"",A..Z;eval'say;/./;$_=$\'.$&;'x26oba wymagają -E/ -M5.010.
Dom Hastings
Ładnie wykonane. Wygląda znacznie lepiej niż moja próba! dzięki
Dada