Tabula Rectaを印刷します!


81

Tabula Rectaを印刷します!

Tabula Recta(「Vigenere Table」と呼ばれることもある)はJohannes Trithemiusによって作成され、BellasoのVigenere暗号とTrithemius暗号のすべてのバリアントを含むいくつかの暗号で使用されています。次のようになります。

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

これは頻繁に必要ですが、インターネット上のどこからでもコピーして貼り付けることはできません。正方形のテーブルはとても長く、friggingかかるため年齢を入力して、あなたのコードはできるだけ短くする必要があります。

ルール/要件

  • 各提出は、完全なプログラムまたは機能である必要があります。関数である場合、プログラムの下部に関数呼び出しを追加するだけで実行可能でなければなりません。他のもの(Cのヘッダーなど)を含める必要があります。
  • 可能であれば、プログラムをテストできるサイトへのリンクを提供します。
  • プログラムはに何も書き込まないでくださいSTDERR
  • 標準の抜け穴は禁止されています。
  • プログラムはどのような場合でも出力できますが、印刷する必要があります(配列などではありません)。

得点

プログラムは、デフォルトでUTF-8または選択した別の文字セットで、バイトに従ってスコア付けされます。

最終的に、バイト数が最小の答えが勝ちます。

提出

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

# Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

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

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

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

言語名をリンクにして、リーダーボードスニペットに表示することもできます。

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

リーダーボード

これは、通常のリーダーボードと言語ごとの勝者の概要の両方を生成するスタックスニペットです。


ルール1に関して、使用する各関数の各ヘッダーを含める必要がありますか?
-owacoder

私たちが使用している場合、私は意味printf、私たちは含める必要があるstdio.h場合は、isalpha使用されている、ctype.hなど、必要とされ、これは正しいですか?
owacoder

3
おそらく、チャレンジ仕様自体に「小文字は許可されます」と入力する必要があります。そのため、これらのコメントが表示されない場合、人々は見逃す可能性が低くなります。
Sherlock9

2
それを印刷する必要がありますか、文字列/文字配列を返すことができますか
downrep_nation

1
私が一晩中起きているようにするための質問をありがとう。(+1)
アナスタシアロマノバ秀

回答:


30

05AB1E6 5バイト

1バイトを節約してくれたDowngoatに感謝します。コード:

ADv=À

説明:

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

CP-1252エンコードを使用します。オンラインでお試しください!


複製する目的は何ですか?
エソランジングフルーツ

1
@ Challenger5 vコマンドは値を消費し、それを繰り返し処理します。この場合、アルファベットを消費するため、26回繰り返されます。これは、関数を繰り返す必要がある正確な時間でもあります。=葉スタック無傷でÀのみ左にスタック要素1の上部を回転させます。これはあなたの質問に答えますか?:)
アドナン

101

Vim、25 23バイト

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

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

編集:小文字は大丈夫なので、2つのキーを保存できます。


23
それ:h<_<cr>jjYは天才
-Downgoat

3
わおそれは驚きだ!OPは小文字でも大丈夫だから削除できると言ったV~
DJMcMayhem


4
だれかをemacsで試してみようと思います。
アディソン


24

パイソン2、59の 57、53バイト

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

-4バイトの@xsotに感謝します!


4
私はこれが好きです。ところで、最後の行をに短縮できますprint bytearray(a)
xsot

18

///、220バイト

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

オンラインでお試しください!

これは驚くほど簡単なことではなく、最適かどうかはわかりません。

///でこのような問題を解決する唯一の方法は、一般的な部分文字列を抽出することです。(結局、私は間違っていました。)しかし、出力の性質上、実際に改行のためにアルファベット全体を抽出することはできないため、どの部分文字列を抽出するのが最適かはまったく明確ではありません。したがって、ラップされたアルファベットの部分文字列を抽出する必要がありますが、部分文字列を作成する時間と選択する文字列に関してはトレードオフがあります。

だからここに私がやったことだ。これは、指定された文字列の長さ25までのすべての部分文字列を検出し、それぞれが抽出によって保存されるバイト数を計算するCJamスクリプトです。基本的Nに、長さのM部分文字列のコピーがある場合、部分文字列を保存し(N-1)*(M-1) - 5ます。これらの部分文字列にはスラッシュは含まれません。また、技術的には、8個程度の部分文字列を既に抽出している場合、末尾の定数オフセットはに減少し-4ますが、スクリプトはそれを考慮しません。

とにかく、スクリプトで私がしたことは次のとおりです。

  • 現在のコード(最初は単なる出力)に対してスクリプトを実行します。
  • 最大の改善をもたらす部分文字列から、最も短いものを選択します。複数ある場合は、辞書的に最も小さいものを選択します(特定の入力に対して、サブストリング間のオーバーラップを減らすことができます)。
  • コード内の選択された部分文字列のすべての出現箇所を未使用の小文字に置き換えます。
  • /x/ABC/コードの先頭に、x選択した文字とABCサブストリングを追加します。
  • 何かを保存する部分文字列がなくなるまで繰り返します。

最後に、結果//をで置換し|て先頭に追加することで、さらに数バイトを節約します/|/\/\//(これが、サブストリングを抽出するのに8番目のサブストリングの後に5バイトではなく4バイトしかかからない理由です)。

私が言ったように、これが最適かどうかはわかりませんが、不規則な外観の結果は非常に興味深いものです。ラインのどこかで最適ではない(ただしそれ以上の)サブストリングを選択することで、より短いソリューションに到達できる可能性があります。この問題の複雑さのクラスは何だろう...


それ...です...華麗な...
ジョージ・ギブソン

1
@GeorgeGibsonありがとう... YX出力で特定のことに気づいたとき、私は途中からやり直さなければなりませんでした。;)
マーティン・エンダー

私の答えは消えました、それはこれのthisでした(より大きく、そして後で)。その[信じられないほどのゴルフ]のために+1!
エリックアウトゴルファー16

複雑さのクラスに関しては、///チューリングが完了しているので、問題は決定不能ではないでしょうか?問題は「文字列を与え、それを出力する最短の///プログラムを見つける」ことです。小さな文字列を除いて、無限にループする(ただし、無限にループすることは証明できない)プログラムが存在します。正式な証拠私自身はまだわかりませんが、直感的には不可能ですか?
ghosts_in_the_code

16

C、47バイト

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

Ideoneでお試しください

単一のループ。26文字ごとにアルファベットを印刷しますが、27文字ごとに改行に置き換えます。


1
くそー!まったく同じ関数を書いたところです!:-)最初のセミコロンを保存するには、引数を指定せずにf(i)then を使用しf()ます。
レベル川セント

@LevelRiverSt未定義の動作に依存します。
アンデルスカセオルグ16

2
最終的にはあなた次第ですが、PPCGは言語が実装によって定義されていると見なします。したがって、どのコンパイラで動作するかについて言及している限り、UBに依存することは問題とは見なされません。
デニス

最初に言及したときにiを初期化することで1バイトを削ることができますi=702;f(){for(;i--;)//...
。– tucuxi


15

J、15バイト

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

オンライン通訳

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

いいね!非常に賢い算術。使用する最も簡単なアプローチ|. (Shift)は8バイト長くなります!(i.26)(|."0 _)u:65+i.26
ダン・オーク

1
@dahnoak u:65+1&|.^:]i.26リストを指定すると、パワー副詞が前の結果を追跡するため、16バイトに短縮できます。
マイル

1
@milesニース、私の使用するアプローチ|.は17バイトです:(u:65+|."0 1/~i.26まだ使用しています/~
リーキー修道女

1
@LeakyNunもう1つの17バイトのアプローチはu:65+(|./~,.)i.26です。フックを使用し,.て範囲を列化することでランクを削除しましたが、最終的には同じ長さになりました。
マイル

tryj.tkのソースコードがどこかで見つかるかどうかわかりませんか?私はそれについてどちらの作者(F211)についてはどちらも任意の情報を見つけることができませんでした
ダンオーク

15

///、128バイト

/:/fABCDEFGHIJKLMNOPQRSTUVWXYZ
fbfbAfxf
xbA_xf_x
xfbbbAfbb//x/bff//f/\///b/\\:B:C:D:E:F:G:H:I:J:K:L:M:N:O:P:Q:R:S:T:U:V:W:X:Y:Z:

オンラインでお試しください!

L-phabetチャレンジに対するJakubeの驚くべき答えに触発され、圧縮に使用するのではなく、/// での実際のプログラミングにも手をかけると思いました。これはかなりトリッキーで、4回の試行が必要でしたが、最終的には圧縮ベースのソリューションよりもはるかに短くなりました。

説明

///:の簡単な入門書:基本的に、インタープリターはコードを文字ごとに読み取り、次のことを行います。

  • a \でもa でもない場合は/、印刷します。
  • の場合\、次の文字を出力します。
  • の場合//x/y/(同じエスケープルールを使用して)命令を解析xし、残りのコードのすべてを繰り返し置換しyます。

Jakubeからインスピレーションを得て、簡単にするために、この4x4バージョンについて説明します。

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

それら:を2番目と3番目の間のものに置き換えることから始め/ます。これは、最終的に次の行を回転させるコードになります。これを取得します。

/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

fbx私たちは今、拡大します共通の文字列、のためだけの略記法です。fスラッシュ用では、bバックスラッシュのためのものであり、xためにある\//非常に多くのことを思い付くたまたま。理由は、私は単一文字のストリングのエイリアスを使用しています/し、\彼らが最初の置換命令でエスケープする必要があるだろうということですので、私は実際にこれらすべてのバックスラッシュを必要としないことでバイトのかなり多くを保存しています。ここでは、後に得るものだxfbに充填されています:

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

とても読みやすい。

したがって、最初の行はそのまま印刷されます。次に、さらにすべての行を回転するファンキーな部分に行きます。実際には、4つの異なる命令で構成されています。注目すべきことの1つは、Aこれらの指示内のすべての出現を回避したことです。この理由はA、命令内のAsを残りの行のs と区別できるためです。これらの行は、異なる処理が必要です。

/\/\A/\//

これは、一致する/Aとに置き換え/取り外し、A。このサブストリングはeachの前にのみ表示されるABCDため、これにより後続のすべての行の最初の文字が削除されることに注意してください。

/
\//\A_\//

これは、スラッシュに続く改行と一致し、で置き換えA_/ます。これAにより、各行の末尾にが挿入され、回転が完了し、改行がアンダースコアに変わります。

/_\//
\//

これは一致_/し、改行とそれに続くスラッシュに置き換えられます。アンダースコアを介してこの迂回を行う必要があるのは、文字列が一致しなくなるまで各命令を///繰り返し適用するという事実です。これは、フォームの命令は絶対に使用しないことを意味し、そして置換は後にするので、任意の文字列ですが、常にまだ一致します。特に、これは改行の前に何かを挿入できないことを意味します。プロセスで改行を交換し、この交換を元に戻す必要があります。/x/axb/xabx

/\\\A/\\B/

これは、残りの行の後の命令が次の文字を処理するように、一致\Aしてに置き換え\Bます。4つの命令すべてが処理された後、残りの文字列は次のようになります。

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

そのため、最初に回転した行が印刷され、次に次の命令セットが残りの行を別のセルなどで回転します。最後のローテーションの後、無視できる命令がさらにいくつかあり、不完全な命令で終了します。

/\\\B/\\

最後の不完全な命令は単に無視され、プログラムは終了します。


良いですね。昨日、私は別のアイデアで少し実験しました。各行の各文字を置き換えたいと思いました。何かのようなA->BB->C...、しかし、それは非常に動作しませんでした。最初の文字を削除して最後に追加することは、間違いなくはるかに優れたアプローチです。
ジャクベ

@ジャクベ私もそれを試してみましたが、どこにも行きませんでした。後続の命令も台無しにしないようにするのは難しすぎます。
マーティンエンダー

1
124バイト:goo.gl/efSLKQこれはまさにあなたのソリューションですが、アルファベットを1回書くだけで済むように、いくつかの追加の置換を追加することができました。同様の問題にも同じ戦略を使用しました。
寂部


11

ゼリー、7 バイト

ØAṙJṢj⁷

オンラインでお試しください!

使い方

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

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

11

Emacs、47バイト

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

Where ^Pは「Control P」などを意味します。F3キーとF4キーには2つのASCIIバイトが必要なため、これは47バイトです。

開始入力を入力した後、行を複製して最初の文字を最後に移動するキーボードマクロを定義します。その後、マクロをさらに24回実行します。


2
PPCGへようこそ、いい答えです!Emacsの回答が表示されることは非常にまれです。Emacsの回答がすでに投稿されているかどうかさえわかりません。
TuxCrafting

10

JavaScript(ES6)、56バイト

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

はい、そうです、私のコードの半分はアルファベット文字列リテラルです。リテラルなしでできることは81バイトです。

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

関数ではなくプログラムが必要な場合は、を削除して10バイトのコストで_=>ラップインconsole.log()します。


うわー、よくやった。非常にエレガントなソリューション。どのように機能しますか?
Polyducks

2
@Polyducksたくさんの正規表現の魔法。/./g提供されたアルファベット文字列の各文字に自然に一致します。置換文字列で$&は、一致自体、$'一致後の文字列$`の部分、および一致前の文字列の部分を表します。$`$&$'したがって、元の文字列を表しますが、当然のことながら、一致後の部分を先頭に移動することは簡単で、回転効果が得られます。
ニール

超スマート!@Neilよくやった!
Polyducks

9

Mathematica 68 61バイト

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

おかげで...

@MartinEnder(7バイト)


また、Array上のマッピングよりも短いかもしれませんRange
マーティンエンダー

私はちょうどチェックして、Array実際にバイトを保存しない、しかし、あなたがして回避することにより、別のものを保存することができますColumnArray[{"A"~CharacterRange~"Z"~RotateLeft~#,"\n"}&,26,0]<>""(あなただけ交換する必要があります\n実際の改行で)。
マーティンエンダー

7
ビルトインを待ちませんか?インポッシブル
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バイト

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

でアルファベットを取得しmap(chr,range(65,91))、文字列シフト操作を手動で適用します。

-4バイトの@LeakyNunと@TheBikingVikingに感謝します!

-3バイトの@xnorに感謝します!


2
どうやらa="ABCDEFGHIJKLMNOPQRSTUVWXYZ"短いです。
リーキー修道女

1
a[1:]代わりに行うことができますa[1:26]
TheBikingViking

2
ループはとして実行できますfor x in s:print s;s=s[1:]+x
xnor

3
アルファベットをハードコーディングするよりも1バイト短くできます:s='%c'*26%tuple(range(65,91))
xnor


9

Piet、247バイト/ 190コーデル

ピエトのタブラレクタ

オンラインでお試しください!

したがって、これは予想よりもはるかに長くかかり、他のより効率的な(スタックに優しい)アプローチに関するいくつかのアイデアがありますが、ついに動作しないようになりました(そしてインタープリターのバグを修正しIDE機能追加しました方法)、ここにあります。ほとんどのバイト効率の高い言語ではありませんが、非常に楽しいです。これは、より大きなビューと、とられたパスを示すトレースです。私のGitHubの歴史。

ピエトのタブラレクタ、ラージバージョン

Tabula Recta実行トレース

スタックベースの言語であるため、簡潔に説明するには複雑すぎますが、ここではさまざまなセクション/ループの機能の基本的な概要を示します。Pietには変数や関数がないため、すべての変数および関数名は説明のためのものです。

  • 初期設定(左上):始まりline_counter27で、負荷「@」としてcur_letter設定し、letter_count27に
  • メインループ(濃い紫色から始まり、中央上部)
    • デクリメント letter_counter
    • reset_lineゼロの場合に分岐(明るいシアンの2ブロック)
    • cur_letterスタックの一番上までロールします
    • check_doneif への分岐cur_letter > 'X'(ティール/レッドブロック、右側)
    • インクリメントcur_letterして出力します(右下隅)
    • reset_letterif への分岐cur_letter > 'Y'(薄緑色のブロック、左)
    • `letter_counter_をスタックの先頭、ループの先頭にロールバックします
  • reset_line ブランチ(大きなピンクの正方形):
    • 改行文字を出力します
    • letter_count27にリセット
    • メインループの先頭に戻る
  • check_done 枝(右半分は内側)
    • ロールスline_counterトップへ
    • ゼロの場合に終了する分岐
    • 減少しline_counter、スタックの一番下にロールバックします
    • 中断したところから再開、レターを印刷
  • reset_line ブランチ(左側、緑色のブロック):
    • cur_letter「@」にリセット
    • 中断したところから再開し、ループの先頭に移動/戻ります

8

MATL、8バイト

おかげでは@Dennis提案 MATLはモジュラーインデックスを組み込む必要があり、すること@Sueverた、アイデア自動ペアごとの操作を。

1Y2t&+Q)

オンラインでお試しください!

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

8

Javascript、113 96 91 76バイト

コンソールで実行するための超短版:

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

ジャバスクリプト/ HTML、140の 123 118 105バイト

OPによるコピーと貼り付けを容易にするHTML出力を備えた、よりきれいなバージョン:

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

(編集:文字列AZを生成する代わりに使用する必要があります)

(編集2:@Neilと@DanTheManの入力に感謝します(コメントを参照))


最初のC = 26は無関係ではありませんか?
DanTheMan

ああスナップ。forに移動したときに削除するのを忘れたようです。一定!ありがとう@DanTheMan :)
Polyducks

1
l.slice(0,1)ただでl[0]いる間、,27あなたはスライスを移動し、で終わることができた時点で、不要ですl.slice(1)+l[0]。また、私はあなたがconsole.logループ本体に移動することができ、したがってトレーリングを回避できると思います;
ニール

今これをテストしてください、ありがとう@Neil!編集:甘い聖なるモリー。両方のおかげで、コメントにクレジットを追加します。
Polyducks

1
ああ、いいですね、それはを単純化するさらに良い方法ですconsole.log
ニール


8

R、47 42 41バイト

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

オンラインでお試しください!

27のアルファベットを生成し、27番目の文字を削除して、26列に印刷します。

@Giuseppeソリューションに触発された改善



うわー、私repは使用するためにすべてのインデックス作成のトリックを試してみたと思いましたが、これは特に触発されました!非常に素晴らしい。できればもう一度賛成します。
ジュゼッペ

あなたが使用できる1の代わりを""するためにstdout
ジュゼッペ

6

Sesos27 25バイト

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

オンラインでお試しください!デバッグをチェックして、生成されたSBINコードを確認します。

Sesosアセンブリ

上記のバイナリファイルは、次のSASMコードをアセンブルして生成されています。

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

使い方

テープをに初期化することから始めますABCDEFGHIJKLMNOPQRSTUVWXYZ。これは次のとおりです。

セルに26を書き込むと、テープは次の状態のままになります。

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

データヘッドの下のセルがゼロ以外である限り、以下を実行します。

左の2つのセルに番号をコピーし、左端のコピーに64を追加します。

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

左端のコピーを元の場所に移動し、右端のコピーから1を引きます。

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

右端のコピーはそれまでに0なので、プロセスは26回の反復後に停止します。セルを右に移動するため、初期化後のテープの最終状態は次のようになります。

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

これで、データヘッドの下のセルがゼロになるまで次のプロセスを繰り返すことにより、出力を生成する準備が整いました。

まず、データヘッドの下に文字を印刷して右に移動し、値0のセルが見つかるまでこの手順を繰り返します。印刷後ABCDEFGHIJKLMNOPQRSTUVWXYZ、テープは次のようになります。

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

次に、データヘッドを左に27単位(先頭の0に戻る)移動し、値0のセルが見つかるまでprint-moveの組み合わせを繰り返します。これは何も印刷せず、テープは次のようになります。

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

ここで、現在のセルに10を書き込み、対応する文字(改行)をget出力し、空の入力でを呼び出してセルをゼロにし、テープを変更せずに残します。

その後、セルの内容を現在のセルの右側に移動し、データヘッドを右側のユニットに移動します。

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

次の反復は少し異なります。最初の印刷ステップでprintが行われBCDEFGHIJKLMNOPQRSTUVWXYZ、テープは次のようになります。

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

次に、データヘッドを27ユニット左に移動します。

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

後続の印刷ループAでは、次のようにテープが印刷されます。

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

もう一度、改行を印刷し、セルの内容を現在のセルの右側に移動し、データヘッドを右側のユニットに移動します。

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

さらに24回繰り返した後、データヘッドを右に移動する最後の手順では、テープは次の状態のままになります。

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

データヘッドの下のセルは0になり、プログラムは終了します。


TIOは新しいバージョンのSesosを使用します。これはSASMとの下位互換性がありますが、生成されるSBINコードは短くなります。


6

Haskell、56 53 52バイト

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

同じ長さ:(@AndersKaseorgによる提案を使用)

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

あなたはChr関数を取得するためにData.Charをインポートする必要がモジュラーものを、行うために74の 59 58バイトは、私はそれで得ることができる最高だった:(toEnum機能を示唆するために@nimiのおかげで)

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

これはおそらくもっと短いかもしれませんが、私はHaskellのゴルフトリックを知りません。

mapM_の代わりにmapMを使用しました(@Lynnのコメントを参照)


1
-3バイトの場合、現在2回使用されているに変更['A'..x]['A'..'Z']、それを定義まで持ち上げます。
アンデルスカセオルグ16

@AndersKaseorg:ありがとう!しかし、同じバイト数を節約し、1つのライナーを維持するという別のアイデアがありました。ただし、代替ソリューションに提案を追加しました。
カールカストール

chrfrom のみが必要な場合はData.ChartoEnum代わりにを使用して、import。を省略できます。
nimi

1
に変更mapM_してmapMもいいと思う。たぶん、これはメタ投稿の価値がある…
リン



5

Brain-Flak、222バイト

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

オンラインでお試しください!

私はBrain-Flakが初めてなので、多分これはたくさんゴルフできるかもしれませんが、少なくとも最初の試みです。27個の完全なアルファベットを左のスタックに保存し、アルファベットを右に移動して、27番目の文字を改行で置き換えます。

私のソースコードは少しわかりにくいですが、それでも追加します。

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

5

V36、10バイト

¬AZ25ñÙx$p

オンラインでお試しください!

これは「Latin1」エンコーディングを使用します。

説明:

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

行って追加してください;)
コナーオブライエン

@CᴏɴᴏʀO'Bʀɪᴇɴこの言語で何かが行われる唯一の方法はカタツムリのペースであることを知っているはずです。おそらく来年の1月にそれを稼働させます。:P
DJMcMayhem

ああ、次の6-8週間で?
コナーオブライエン

4

C#、98バイト

文字列として初期化するよりも短い文字を生成できるかどうかを確認しようとしましたが、実際には不可能です。文字は26バイトで、このスニペットだけです

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

25バイトです。私は良い解決策をされ、それらを初期化して、+ = Aでそれらを追加すると思うが、C#のとあなたのような機能の:バイトによって制限されているSubstring()Console.WriteLine()

98バイトでの私の試み:

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

4

オクターブ、27バイト

行ベクトルと列ベクトルを追加し、Octave bsxfunは必要なく(Matlabで必要になるように)シグルトンの次元をうまく拡張します。

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


4

Java、190 176 172 163バイト

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

より多くのバイトを簡単に削ることができます:System.out.printf("%c", ...)-> System.out.write(...)'\n'-> 10'A'-> 65。改行/改行文字の提案が許可されていることを確認してください。ただし、出力要件が必要です。:)
MH。

@MH。素晴らしいヒント!保存された9バイト:)
Master_ex

あなたがこれに答えてから1年以上が経ちましたが、まだいくつかのことをゴルフにかけることString[]aができます。とint s=0;while(s<26){p(s,26);p(0,s++);p(-1,0);}することができますfor(int s=0;s<26;p(0,s++),p(0,s++))p(s,26);
ケビンCruijssen

4

バッシュ、66バイト

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

で完全なアルファベットを作成し、A26 文字の回転したバージョンを印刷します。文字を先頭から取得し、nそれらの前の位置を追加しnます。


4

Perl、42バイト

これについては@Dom Hastingsに全面的に感謝します。

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

または(同じバイト数):

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

ニーズ-M5.010-E例えば、実行します:

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



私の古い答え(55バイト):

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

-M5.010実行する必要があります。だから実行:

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

おそらくもっと短くすることは可能ですが、どうやって...


42のバイトソリューションのカップルを思い付くことをどうにか:@l=A..Z;say@l[$_..25],@l[0..$_-1]for 0..25$_=join"",A..Z;eval'say;/./;$_=$\'.$&;'x26の両方が必要-E/を-M5.010
ドムヘイスティングス

よくできました。私の試みよりもはるかに良く見えます!おかげで
ダダ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.