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.


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! .


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.


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
Odważę się, żeby ktoś spróbował tego w emacsie.
addison


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!


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 ...


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ą.


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


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

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.


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,


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.

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.


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.


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)


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!


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

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

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

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))


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)..$_]}


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.


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)


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

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

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

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));

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,'']


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);}}

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.


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.