Imprimez une tabula recta!

81

Imprimez une tabula recta!

La Tabula Recta (parfois appelée «table de Vigenere») a été créée par Johannes Trithemius et a été utilisée dans plusieurs chiffrements, y compris toutes les variantes du chiffrement Vigenere de Bellaso et du chiffrement de Trithemius. Cela ressemble à ceci:

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

J'ai souvent besoin de cela, mais je ne peux pas le copier et le coller sur Internet. Parce que la table carrée est très longue et qu'il faut beaucoup de temps pour la taper, votre code doit être aussi court que possible.

Règles / exigences

  • Chaque soumission doit être un programme complet ou une fonction. S'il s'agit d'une fonction, vous devez l'exécuter en ajoutant uniquement l'appel de fonction au bas du programme. Tout le reste (par exemple les en-têtes en C) doit être inclus.
  • Si cela est possible, fournissez un lien vers un site où votre programme peut être testé.
  • Votre programme ne doit rien écrire à STDERR.
  • Les échappatoires standard sont interdites.
  • Votre programme peut sortir dans tous les cas, mais il doit être imprimé (pas un tableau ou similaire).

Notation

Les programmes sont notés en octets, en UTF-8 par défaut ou avec un jeu de caractères différent de votre choix.

Finalement, la réponse avec le moins d'octets va gagner.

Les soumissions

Pour vous assurer que votre réponse apparaît, commencez votre réponse par un titre, en utilisant le modèle Markdown suivant:

# Language Name, N bytes

Nest la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores en les effaçant. Par exemple:

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

Si vous souhaitez inclure plusieurs numéros dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou si vous souhaitez répertorier séparément les pénalités d'indicateur d'interprétation), assurez-vous que le score réel est le dernier numéro de l'en-tête:

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

Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de classement:

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

Classement

Voici un extrait de pile permettant de générer à la fois un classement régulier et un aperçu des gagnants par langue.

George Gibson
la source
Concernant la règle 1: devons-nous inclure chaque en-tête pour chaque fonction que nous utilisons?
owacoder
Je voulais dire que si nous utilisons printf, nous devons inclure stdio.h, si isalphaest utilisé, ctype.hest nécessaire, etc. Est-ce correct?
owacoder
3
Vous devriez probablement mettre "minuscules est autorisé" dans la spécification du challenge elle-même. Juste pour que les gens soient moins susceptibles de le manquer s'ils ne voient pas ces commentaires.
Sherlock9
2
Dois
1
Merci pour la question de m'avoir fait rester éveillé toute la nuit. (+1)
Anastasiya-Romanova

Réponses:

30

05AB1E , 6 5 octets

Merci à Downgoat d’ avoir économisé 1 octet. Code:

ADv=À

Explication:

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.

Utilise le codage CP-1252 . Essayez-le en ligne! .

Adnan
la source
Quel est le but de le dupliquer?
Esolanging Fruit
1
@ Challenger5 La vcommande consomme une valeur, en l'itérant. Dans ce cas, il consomme l'alphabet, donc il itère 26 fois. C'est aussi le nombre exact de fois que nous devons itérer la fonction. La =laisse la pile intacte et la Àseule fait pivoter le haut de l’élément de pile 1 vers la gauche. Est-ce que cela répond à votre question? :)
Adnan
101

Vim, 25 23 octets

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

est la clé de retour.

: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 de solution

EDIT : les minuscules vont bien, je peux donc sauvegarder deux clés.

Lynn
la source
23
C'est le :h<_<cr>jjYgénie
Downgoat
3
Wouh, c'est dingue! OP a dit que les lettres minuscules étaient acceptables pour vous permettre de les supprimerV~
DJMcMayhem
4
@RobStarling voir: meta.codegolf.stackexchange.com/q/8995/40695
Réduit à la baisse
4
Je défie quelqu'un d'essayer cela dans Emacs.
addison
2
@addison Emacs répond
TuxCrafting
24

Python 2, 59 57 53 octets

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

Merci à @xsot pour -4 octets!

Dianne
la source
4
J'aime celui la. Au fait, vous pouvez raccourcir la dernière ligne print bytearray(a).
xsot
18

/// , 220 octets

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

Essayez-le en ligne!

C'était étonnamment non trivial et je ne sais pas si c'est optimal.

Un seul problème pour ce problème dans /// est d'extraire des sous-chaînes communes. ( Il s'avère que je me suis trompé. ) Cependant, en raison de la nature du résultat, il est difficile de savoir quelle sous-chaîne doit être extraite, car vous ne pouvez pas extraire l'alphabet en entier à cause des sauts de ligne. Vous aurez donc besoin d'extraire des sous-chaînes de l'alphabet encapsulé, mais vous devrez également choisir une durée pendant laquelle vous créerez les sous-chaînes et celles que vous choisirez.

Alors voici ce que j'ai fait. Il s'agit d'un script CJam qui trouve toutes les sous-chaînes jusqu'à la longueur 25 dans la chaîne donnée et calcule le nombre d'octets que son extraction sauverait. En gros, s’il existe des Ncopies d’une longueur de Msous-chaîne, vous enregistrez les (N-1)*(M-1) - 5sous-chaînes, ces sous-chaînes ne contiennent pas de barres obliques. En outre, techniquement, lorsque vous avez déjà extrait environ 8 sous-chaînes, le décalage constant à la fin est réduit à -4, mais le script ne tient pas compte de cela.

Quoi qu'il en soit, voici ce que j'ai fait avec le script:

  • Exécutez le script avec le code actuel (ce qui ne représente initialement que la sortie).
  • Parmi les sous-chaînes qui offrent la plus grande amélioration, choisissez la plus courte. S'il y en a plusieurs, choisissez le plus petit lexicographiquement (d'après ce que je peux dire, pour une entrée donnée, cela réduit les chevauchements entre les sous-chaînes).
  • Remplacez toutes les occurrences de la sous-chaîne choisie dans le code par une lettre minuscule non utilisée.
  • Ajoutez /x/ABC/le code où xest la lettre choisie et ABCla sous-chaîne.
  • Répétez cette opération jusqu'à ce qu'il ne reste plus de sous-chaînes qui pourraient sauver quoi que ce soit.

À la fin, nous économisons quelques octets de plus en remplaçant le résultat //par |et par le préfixe /|/\/\//(c’est pourquoi l’extraction des sous-chaînes ne coûte que 4 au lieu de 5 octets après la 8 e sous-chaîne ou plus).

Comme je l'ai dit, je ne sais pas si c'est optimal et je trouve le résultat plutôt irrégulier assez intéressant. Il serait peut-être possible de trouver une solution plus courte en choisissant des sous-chaînes non optimales (mais plus) quelque part dans la suite. Je me demande quelle est la classe de complexité de ce problème ...

Martin Ender
la source
C'est ... génial ...
George Gibson le
1
@ GeorgeGibson Merci ... J'ai dû recommencer à mi-chemin lorsque j'ai remarqué un certain YXrésultat. ;)
Martin Ender
Ma réponse est partie, c'était dupe de cela (plus grand et plus tard). +1 pour ce [golf incroyable]!
Erik the Outgolfer
En ce qui concerne la classe de complexité, le problème ne devrait-il pas être indécidable puisque /// Turing est complet? Le problème est "si une chaîne est trouvée, trouvez le /// programme le plus court qui la génère". Sauf pour les petites chaînes, il existerait /// des programmes qui fonctionnent en boucle indéfiniment (mais il ne peut pas être prouvé qu'ils le font en boucle indéfiniment) qui ne peuvent pas être montrés comme ne produisant pas la sortie souhaitée sans les exécuter pour toujours. Preuve formelle Je ne suis pas encore sûr pour moi mais intuitivement, n'est-ce pas possible?
ghosts_in_the_code
16

C, 47 octets

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

Essayez sur Ideone

Une seule boucle, imprimant l'alphabet tous les 26 caractères, mais tous les 27 caractères étant remplacés par une nouvelle ligne.

Anders Kaseorg
la source
1
Zut! Je viens d'écrire exactement la même fonction! :-) Vous pouvez enregistrer le premier point-virgule en utilisant f(i)ensuite simplement appeler f()sans aucun argument.
Level River St
@LevelRiverSt Cela reposerait sur un comportement indéfini.
Anders Kaseorg
2
C’est finalement à vous de décider, mais PPCG considère que les langages sont définis par leurs implémentations. Aussi longtemps que vous indiquez dans quel compilateur il fonctionne, le recours à UB n’est pas considéré comme un problème.
Dennis
vous pouvez vous raser un octet en initialisant i lorsque mentionné pour la première fois:i=702;f(){for(;i--;)//...
tucuxi
3
@tucuxi Non, car les réponses de fonction doivent être réutilisables .
Anders Kaseorg
15

J, 15 octets

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

Interprète en ligne .

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
Fuite Nun
la source
Agréable! Arithmétique très intelligent. L'approche la plus simple qui utilise |. (Shift)est 8 octets plus long! (i.26)(|."0 _)u:65+i.26
Dan Oak
1
@dahnoak Vous pouvez le réduire à 16 octets u:65+1&|.^:]i.26car les adverbes de puissance suivent les résultats précédents si une liste leur est donnée.
miles
1
@miles Nice, mon approche en utilisant |.est de 17 octets: u:65+|."0 1/~i.26(toujours en utilisant /~)
Leaky Nun
1
@ LeakyNun Une autre approche de 17 octets est u:65+(|./~,.)i.26. Je me suis débarrassé du rang en utilisant un crochet et ,.en triant la fourchette, mais il a fini par avoir la même longueur.
miles
Vous ne savez pas si je peux trouver le code source de tryj.tk quelque part? Je n'ai trouvé aucune information non plus à ce sujet, ni à propos de l'auteur (f211)
Dan Oak
15

/// , 128 octets

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

Essayez-le en ligne!

Inspiré par l'incroyable réponse de Jakube au défi L-phabet, j'ai pensé que je m'essayerais aussi à la programmation réelle de /// plutôt que de l'utiliser uniquement pour la compression. C'était assez compliqué et j'avais besoin de quatre tentatives, mais au final, le résultat était beaucoup plus court que ma solution basée sur la compression .

Explication

Une introduction rapide sur ///: en gros, l'interprète lit le code caractère par caractère et effectue les opérations suivantes:

  • Si ce n'est \ni un /, imprimez-le.
  • Si c'est un \, affiche le caractère suivant.
  • Si c'est un /, analysez une /x/y/instruction (avec les mêmes règles d'échappement) et remplacez à plusieurs reprises tout xdans le code restant par y.

S'inspirant de Jakube, pour plus de simplicité, je vais expliquer une version 4x4 de ceci:

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

Nous commençons par remplacer ceux :avec le truc entre le deuxième et le troisième /. Cela finira par être le code qui fera pivoter les lignes suivantes. Nous obtenons ceci:

/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

Le f, bet ne xsont que pour les chaînes communes sténographies, que nous allons maintenant étendre. Le fpour les barres obliques, le bpour les barres obliques inverses et le xpour \//qui arrive souvent. La raison pour laquelle j'utilise des alias pour les sous - chaînes d'un seul caractère /et \est qu'ils auraient à être échappé dans la première instruction de substitution, donc je suis en fait économiser beaucoup d'octets par ne pas avoir besoin tous ces antislashs. Voici ce que nous obtenons après x, fet bont été remplies:

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

Très lisible.

Donc, la première ligne est simplement imprimée textuellement. Nous arrivons ensuite à la partie géniale qui fait pivoter toutes les lignes suivantes. Il consiste en fait en quatre instructions différentes. Une chose à noter est que j'ai échappé à toutes les occurrences de Aces instructions. La raison en est que cela me permet de distinguer As dans les instructions de As dans les lignes restantes, qui doivent être traitées différemment.

/\/\A/\//

Cela correspond /Aet le remplace par /, supprimant le A. Notez que cette sous-chaîne n'apparaît qu'au ABCDdébut de chaque élément , ce qui supprime le premier caractère de toutes les lignes suivantes:

/
\//\A_\//

Cela correspond à un saut de ligne suivi d'une barre oblique et le remplace par A_/. Donc, ceci insère un Aà la fin de chaque ligne, complétant la rotation et transforme le saut de ligne en trait de soulignement.

/_\//
\//

Cela correspond _/et le remplace par un saut de ligne suivi d'une barre oblique. La raison pour laquelle j'ai besoin de faire ce détour par le trait de soulignement est que /// applique chaque instruction plusieurs fois jusqu'à ce que la chaîne ne corresponde plus. Cela signifie que vous ne pouvez jamais utiliser une instruction de la forme /x/axb/x, aet bsont des chaînes arbitraires, car après la substitution xcorrespondra toujours. Cela signifie notamment que nous ne pouvons pas simplement insérer quelque chose devant un saut de ligne. Nous devons remplacer le saut de ligne dans le processus et annuler ce remplacement.

/\\\A/\\B/

Cela correspond \Aet le remplace par \B, de sorte que les instructions après les lignes restantes traitent le caractère suivant. Une fois que les quatre instructions ont été traitées, la chaîne restante ressemble à ceci:

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

Alors maintenant, la première ligne tournée est imprimée, puis le jeu d'instructions suivant fait pivoter les lignes restantes d'une autre cellule, etc. Après la dernière rotation, nous avons quelques instructions supplémentaires que nous pouvons ignorer, puis nous terminons avec les instructions incomplètes:

/\\\B/\\

Les instructions incomplètes à la fin sont simplement ignorées et le programme se termine.

Martin Ender
la source
Joli. Hier, j'ai expérimenté un peu avec une idée différente. Je voulais substituer chaque caractère dans chaque ligne. Quelque chose comme A->B, B->C... Mais ça n'a pas tout à fait fonctionné. Supprimer le premier caractère et l'ajouter à la fin est une approche bien meilleure.
Jakube
@ Jakube, j'ai aussi essayé mais je n'allais nulle part. Il est trop difficile d'éviter de gâcher les instructions ultérieures.
Martin Ender
1
124 octets: goo.gl/efSLKQ Ceci n’est que votre solution, mais j’ai réussi à ajouter quelques substitutions supplémentaires, de sorte que vous n’ayez besoin d’écrire l’alphabet qu’une seule fois. Utilisé la même stratégie sur un problème similaire.
Jakube
1
122: goo.gl/zRsBbR
Jakube
11

Gelée , 7 octets

ØAṙJṢj⁷

Essayez-le en ligne!

Comment ça fonctionne

Ø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
la source
11

Emacs, 47 octets

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

^Psignifie "Contrôle P", etc. C'est 47 octets, car les touches F3 et F4 nécessitent deux octets ASCII.

Après avoir saisi l'entrée de départ, il définit une macro de clavier pour dupliquer la ligne et déplacer le premier caractère à la fin. Il exécute ensuite la macro 24 fois supplémentaires.

Matt Blissett
la source
2
Bienvenue sur PPCG, bonne réponse! C'est très rare de voir une réponse Emacs, je ne sais même pas si une réponse Emacs a déjà été postée.
TuxCrafting
10

JavaScript (ES6), 56 octets

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

Oui, c'est vrai, la moitié de mon code correspond au littéral de la chaîne de l'alphabet. Le mieux que je puisse faire sans le littéral est de 81 octets:

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

Si vous souhaitez un programme plutôt qu'une fonction, supprimez-le _=>et emballez-le console.log()pour un coût de 10 octets.

Neil
la source
Woah, bien fait. Une solution très élégante. Comment ça marche?
Polyducks
2
@ Polyducks Beaucoup et beaucoup de magie regexp. Correspond naturellement à /./gchaque lettre de la chaîne d'alphabet fournie. Dans la chaîne de remplacement, $&représente la correspondance elle-même, $'la partie de la chaîne après la correspondance et $`la partie de la chaîne avant la correspondance. $`$&$'représenterait donc la chaîne d'origine, mais bien sûr, il est trivial de déplacer la partie après le match au début, fournissant ainsi l'effet de rotation.
Neil
Super intelligent! Bien fait @Neil!
Polyducks
9

Mathematica 68 61 octets

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

Grâce à...

@MartinEnder (7 octets)

Martin
la source
En outre, Arraypeut être plus court que la cartographie sur un Range.
Martin Ender
Je viens de cocher et Arrayenregistre effectivement un octet, mais vous pouvez ensuite en sauvegarder un autre en évitant Column: Array[{"A"~CharacterRange~"Z"~RotateLeft~#,"\n"}&,26,0]<>""(il vous suffira de remplacer le \npar un saut de ligne réel).
Martin Ender
7
Attendez, pas intégré? Impossible
MC ΔT le
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 octets

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

Obtient l'alphabet avec map(chr,range(65,91)), puis applique manuellement l'opération de décalage de chaîne.

Merci à @LeakyNun et @TheBikingViking pour -4 octets!

Merci à @xnor pour -3 octets!

Cuivre
la source
2
Apparemment, a="ABCDEFGHIJKLMNOPQRSTUVWXYZ"c'est plus court.
Leaky Nun
1
Vous pouvez faire a[1:]au lieu de a[1:26].
TheBikingViking
2
Votre boucle peut être faite comme for x in s:print s;s=s[1:]+x.
xnor
3
Vous pouvez faire un octet plus courte que hardcoding l'alphabet: s='%c'*26%tuple(range(65,91)).
xnor
9

C, 88 64 octets

Appel f()sans arguments.

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

Essayez sur ideone .

owacoder
la source
9

Piet , 247 octets / 190 codels

Tabula Recta en Piet

Essayez-le en ligne!

Donc, cela a pris beaucoup plus de temps que prévu et j’ai quelques idées sur d’autres approches plus efficaces (plus faciles à empiler), mais j’ai enfin réussi à faire fonctionner le problème (et à corriger un bogue d’interprète et à ajouter des fonctionnalités IDE le long de la chemin), alors le voici. Pas le langage le plus efficace en octets, mais vraiment très amusant. Voici une vue plus grande et une trace indiquant le chemin emprunté. Histoire sur mon GitHub .

Tabula Recta in Piet, grande version

Tabula Recta trace trace

En tant que langage basé sur des piles, il est beaucoup trop compliqué d'expliquer brièvement, mais voici un aperçu de base de ce que font les différentes sections / boucles. Tous les noms de variables et de fonctions sont simplement explicatifs, car Piet ne contient aucune variable ou fonction.

  • Initialisation (en haut à gauche): commence line_counterà 27, charge '@' en tant que cur_letter, définie letter_countà 27
  • Boucle principale (à partir de violet foncé, centre en haut)
    • Décrements letter_counter
    • Branches à reset_linesi zéro (cyan clair à 2 blocs)
    • Rolls cur_letterau sommet de la pile
    • Branches to check_doneif cur_letter > 'X'(sarcelle / bloc rouge, côté droit)
    • Incrémente cur_letteret affiche le résultat (coin inférieur droit)
    • Branches to reset_letterif cur_letter > 'Y'(bloc vert clair, gauche)
    • Rolls `letter_counter_ retour en haut de la pile, retour en haut de la boucle
  • reset_line branche (grand carré rose):
    • Affiche le caractère de nouvelle ligne
    • Réinitialise letter_countà 27
    • Continue en haut de la boucle principale
  • check_done branche (moitié droite à l'intérieur)
    • Rolls line_counterto top
    • Branches à terminer si zéro
    • Décrémente line_counteret revient au bas de la pile
    • Reprend où il s’est arrêté en imprimant une lettre
  • reset_line branche (côté gauche, bloc vert):
    • Réinitialisation cur_letterà '@'
    • Reprend là où il s’était arrêté en roulant / retournant au sommet de la boucle
Cincodenada
la source
8

MATL , 8 octets

Merci à @Dennis , qui a suggéré que MATL devrait incorporer une indexation modulaire, et à @Suever , qui a eu l’ idée des opérations par paires automatiques.

1Y2t&+Q)

Essayez-le en ligne!

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
la source
8

Javascript, 113 96 91 76 octets

Une version très courte pour fonctionner dans la console:

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

Javascript / HTML, 140 123 118 105 octets

Une version plus jolie, avec une sortie HTML qui permet à l'OP de copier et coller plus facilement:

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

(EDIT: J'aurais juste utilisé la chaîne AZ au lieu de la générer)

(EDIT 2: Merci à @Neil et @DanTheMan pour leur contribution (voir commentaires))

Polyducks
la source
Le premier C = 26 n'est-il pas pertinent?
DanTheMan
Oh snap. On dirait que j'ai oublié de le supprimer quand je l'ai déplacé vers le pour. Fixé! Merci @DanTheMan :)
Polyducks
1
l.slice(0,1)est juste l[0], alors que le ,27est inutile, à quel point vous pouvez déplacer la tranche et vous retrouver avec l.slice(1)+l[0]. De plus, je pense que vous pouvez déplacer le console.logcorps vers la boucle, évitant ainsi le trailing ;.
Neil
Testez cela maintenant, merci @Neil! EDIT: Sweet Sainte Moly. Merci à vous deux, je vais vous ajouter au crédit dans le commentaire.
Polyducks
1
Ooh, sympa, c’est une façon encore meilleure de simplifier les choses console.log.
Neil
8

PowerShell, 44 octets

-1..24|%{-join[char[]](65..90)[($_-25)..$_]}
Joey
la source
8

R, 47 42 41 octets

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

Essayez-le en ligne!

Génère 27 alphabètes, supprime les 27e lettres et imprime en 26 colonnes.

Amélioration inspirée par la solution de @Giuseppe .

Robert Hacken
la source
1
46 octets
Giuseppe
Wow, je pensais avoir essayé tous les trucs d'indexation à utiliser repmais c'était particulièrement inspirant! Très agréable. Je voterais encore si je le pouvais.
Giuseppe
vous pouvez utiliser 1au lieu de ""pour stdout.
Giuseppe
6

Sesos , 27 25 octets

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

Essayez-le en ligne! Cochez Debug pour voir le code SBIN généré.

Assemblage Sesos

Le fichier binaire ci-dessus a été généré en assemblant le code SASM suivant.

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)

Comment ça fonctionne

Nous commençons par initialiser la bande à ABCDEFGHIJKLMNOPQRSTUVWXYZ. Ceci est comme suit.

Ecrivez 26 dans une cellule en laissant la bande dans l'état suivant.

                                                     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

Tant que la cellule sous l'en-tête de données est non nulle, nous procédons comme suit.

Copiez le numéro dans les deux cellules à gauche et ajoutez 64 à la copie la plus à gauche.

                                                   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

Déplacez la copie la plus à gauche vers l'emplacement d'origine, puis soustrayez 1 de la copie la plus à droite.

                                                     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

Le processus s'arrête après 26 itérations, car la copie la plus à droite est 0 à ce moment-là. Nous déplaçons une cellule vers la droite, l'état final de la bande après l'initialisation est le suivant.

     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

Nous sommes maintenant prêts à générer la sortie en répétant le processus suivant jusqu'à ce que la cellule située sous l'en-tête de données soit à zéro.

Tout d'abord, nous imprimons le caractère sous l'en-tête de données et nous nous déplaçons à droite, en répétant cette étape jusqu'à ce qu'une cellule de valeur 0 soit trouvée. Après l’impression ABCDEFGHIJKLMNOPQRSTUVWXYZ, la bande se présente comme suit.

                                                                                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

Maintenant, nous déplaçons la tête de données de 27 unités vers la gauche (de retour au 0 ) et répétons la combinaison impression-déplacement jusqu'à ce qu'une cellule de valeur 0 soit trouvée. Cela n'imprime rien et laisse la bande comme suit.

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

Maintenant, nous écrivons 10 dans la cellule en cours, imprimons le caractère correspondant (saut de ligne) et remettons à zéro la cellule avec un appel à getsur une entrée vide, en laissant la bande inchangée.

Ensuite, nous déplaçons le contenu de la cellule vers la droite vers la cellule actuelle, puis nous déplaçons la tête de données vers les unités vers la droite.

      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

La prochaine itération est légèrement différente. La première étape d'impression s'imprime BCDEFGHIJKLMNOPQRSTUVWXYZen laissant la bande comme suit.

                                                                                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

Nous déplaçons maintenant la tête de données de 27 unités vers la gauche.

 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

La boucle d’impression suivante imprime Aet laisse la bande comme suit.

   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

Une fois encore, nous imprimons un saut de ligne, déplaçons le contenu de la cellule de droite à la cellule actuelle, puis la tête de données vers les unités de droite.

         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

Après 24 autres itérations, la dernière étape du déplacement de la tête de données vers la droite laisse la bande dans l'état suivant.

                                                                                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

La cellule sous l'en-tête de données est maintenant 0 et le programme se termine.


TIO utilise une version plus récente de Sesos, qui est rétro-compatible pour SASM, mais génère un code SBIN plus court.

Dennis
la source
6

Haskell, 56 53 52 octets

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

même longueur: (suggestion de @AndersKaseorg)

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

pour faire des choses modulaires, vous devez importer Data.Char pour obtenir la fonction chr, 74 59 58 octets était le meilleur que je pouvais obtenir avec ça: (merci à @nimi pour avoir suggéré la fonction toEnum)

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

Cela pourrait probablement être beaucoup plus court, mais je ne connais aucun tour de golf chez Haskell.

mapM utilisé à la place de mapM_ (voir le commentaire de @ Lynn)

KarlKastor
la source
1
Pour -3 octets, passez ['A'..x]à ['A'..'Z'], qui est maintenant utilisé deux fois, et élève cela à une définition.
Anders Kaseorg
@AndersKaseorg: Merci! Cependant, j'ai eu une autre idée qui économisait le même nombre d'octets tout en le maintenant. J'ai ajouté votre suggestion à la solution alternative, cependant.
KarlKastor
Si vous avez seulement besoin chrde Data.Char, vous pouvez utiliser à la toEnumplace et omettre le import.
nimi
1
Je me sens comme le changement mapM_de mapMdevrait être bon. Cela vaut peut-être un meta post…
Lynn le
5

Retina, 36 31 octets

5 octets grâce à Martin Ender.

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

Le saut de ligne est significatif.

Essayez-le en ligne!

Crédits .

Fuite Nun
la source
5

Brain-Flak , 222 octets

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

Essayez-le en ligne!

Je suis nouveau à Brain-Flak, alors peut-être que cela peut être joué au golf beaucoup, mais au moins c'est un premier essai. Il stocke 27 alphabets complets sur la pile de gauche, puis les déplace à droite et les remplace toutes les 27 lettres par une nouvelle ligne.

Mon code source est un peu déroutant, mais je l’ajouterai quand même.

(((()()()()){})
    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
Dorian
la source
5

V , 36 , 10 octets

¬AZ25ñÙx$p

Essayez-le en ligne!

Ceci utilise le codage "Latin1".

Explication:

¬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
la source
Allez et ajoutez-le ensuite;)
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Vous devriez savoir maintenant que le seul moyen de faire quoi que ce soit dans cette langue est à un rythme rapide. Je l'aurai probablement en ligne en janvier prochain. : P
DJMcMayhem
Oh, dans les 6-8 prochaines semaines?
Conor O'Brien
4

C #, 98 octets

J'ai essayé de voir si je pouvais générer des lettres plus courtes qu'une simple initialisation sous forme de chaîne, mais ce n'est pas vraiment possible. Les lettres sont 26 octets et cet extrait seul

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

est 25 octets. Je pense que les initialiser et ensuite les ajouter avec un + = a est une bonne solution, mais avec C #, vous êtes limité par le nombre de fonctions telles que Substring()et Console.WriteLine().

Ma tentative à 98 octets:

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

Octave, 27 octets

Nous ajoutons un vecteur ligne et colonne, et Octave étend bien les dimensions de sigleton, ce qui est inutile bsxfun(comme dans Matlab).

[mod((v=0:25)+v',26)+65,'']
flawr
la source
4

q, 20 octets

(til 26)rotate\:.Q.A
skeevey
la source
14 octets -1_'26 27#.Q.A
streetster
4

Java, 190 176 172 163 octets

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
la source
Vous pouvez facilement supprimer quelques octets supplémentaires: System.out.printf("%c", ...)-> System.out.write(...), '\n'-> 10, 'A'-> 65. Notez que la suggestion de caractère de saut de ligne / ligne est autorisée, mais que vous devez fournir une sortie idéale . :)
MH.
@MH. bons conseils! 9 octets enregistrés :)
Master_ex
Je sais que cela fait plus d’un an que vous n’avez pas répondu à cette question, mais vous pouvez toujours String[]ajouer au golf: l’espace peut être supprimé; et int s=0;while(s<26){p(s,26);p(0,s++);p(-1,0);}peut être for(int s=0;s<26;p(0,s++),p(0,s++))p(s,26);.
Kevin Cruijssen le
4

Bash, 66 octets

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

Je crée un alphabet complet dans A, puis en imprime 26 versions pivotées en prenant les caractères commençant par net en ajoutant ceux qui précèdent n.

Toby Speight
la source
4

Perl, 42 octets

Nous remercions @Dom Hastings pour cela.

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

Ou (même nombre d'octets):

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

A besoin -M5.010ou -Eà courir, par exemple:

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



Mon ancienne réponse (55 octets):

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

Besoin -M5.010de courir. Alors courez avec:

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

Il est probablement possible de faire plus court cependant, mais je n'ai pas encore découvert comment ... encore

Dada
la source
Nous avons réussi à trouver deux solutions à 42 octets: @l=A..Z;say@l[$_..25],@l[0..$_-1]for 0..25et les $_=join"",A..Z;eval'say;/./;$_=$\'.$&;'x26deux nécessitent -E/ -M5.010.
Dom Hastings
Bien fait. Semble beaucoup mieux que mon essai! merci
Dada