Cetak Tabula Recta!


81

Cetak Tabula Recta!

Tabula Recta (kadang-kadang disebut 'Vigenere Table'), diciptakan oleh Johannes Trithemius, dan telah digunakan di beberapa cipher, termasuk semua varian cipher Vigenere Bellaso dan cipher Trithemius. Ini terlihat seperti ini:

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

Saya sering membutuhkan ini, tetapi tidak dapat menemukannya di mana pun di internet untuk menyalin dan menempel. Karena tabel persegi sangat panjang, dan perlu waktu lama untuk mengetik, kode Anda harus sesingkat mungkin.

Aturan / Persyaratan

  • Setiap pengajuan harus berupa program atau fungsi lengkap. Jika itu adalah suatu fungsi, itu harus dapat dijalankan dengan hanya perlu menambahkan panggilan fungsi ke bagian bawah program. Hal lain (mis. Tajuk dalam C), harus dimasukkan.
  • Jika memungkinkan, berikan tautan ke situs tempat program Anda dapat diuji.
  • Program Anda tidak boleh menulis apa pun STDERR.
  • Celah Standar dilarang.
  • Program Anda dapat menampilkan dalam hal apa pun, tetapi harus dicetak (bukan array atau serupa).

Mencetak gol

Program-program dinilai berdasarkan byte, dalam UTF-8 secara default atau serangkaian karakter pilihan Anda.

Akhirnya, jawaban dengan byte terkecil akan menang.

Pengajuan

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda bisa menyimpan skor lama di headline, dengan mencoretnya. Misalnya:

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

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar penalti penterjemah secara terpisah), pastikan bahwa skor aktual adalah angka terakhir di tajuk:

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

Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:

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

Papan peringkat

Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.


Mengenai aturan 1: apakah kita harus memasukkan setiap header untuk setiap fungsi yang kita gunakan?
owacoder

Maksud saya jika kita menggunakan printf, kita perlu memasukkan stdio.h, jika isalphadigunakan, ctype.hdiperlukan, dll. Apakah ini benar?
owacoder

3
Anda mungkin harus memasukkan "huruf kecil diperbolehkan" dalam spesifikasi tantangan itu sendiri. Hanya saja orang cenderung melewatkannya jika mereka tidak melihat komentar ini.
Sherlock9

2
apakah saya harus mencetaknya atau dapatkah saya mengembalikan string / char array
downrep_nation

1
Terima kasih atas pertanyaannya untuk membuat saya tetap terjaga sepanjang malam. (+1)
Anastasiya-Romanova 秀

Jawaban:


30

05AB1E , 6 5 byte

Terima kasih kepada Downgoat untuk menghemat 1 byte. Kode:

ADv=À

Penjelasan:

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.

Menggunakan pengkodean CP-1252 . Cobalah online! .


Apa tujuan menggandakannya?
Buah Esolanging

1
@ Challenger5 vPerintah ini mengkonsumsi nilai, mengulanginya. Dalam hal ini, ia mengkonsumsi alfabet, jadi iterasi 26 kali. Itu juga jumlah tepat yang kita butuhkan untuk beralih dari fungsi. The =daun tumpukan utuh dan Àhanya berputar bagian atas elemen tumpukan 1 ke kiri. Apakah ini menjawab pertanyaan Anda? :)
Adnan

101

Vim, 25 23 byte

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

Di mana tombol 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 solusi

EDIT : huruf kecil tidak apa-apa, jadi saya bisa menyimpan dua tombol.


23
Itu :h<_<cr>jjYjenius
Downgoat

3
Wow, luar biasa! OP mengatakan huruf kecil itu OK sehingga Anda dapat menghapusV~
DJMcMayhem


4
Saya berani seseorang untuk mencoba ini di emacs.
addison


24

Python 2, 59 57 53 byte

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

Berkat @ xsot untuk -4 byte!


4
Saya suka yang ini. Omong-omong, Anda dapat mempersingkat baris terakhir menjadi print bytearray(a).
xsot

18

/// , 220 byte

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

Cobalah online!

Ini mengejutkan non-sepele dan saya tidak tahu apakah itu optimal.

Satu-satunya cara untuk mengatasi masalah seperti ini di /// adalah dengan mengekstraksi substring umum. ( Ternyata saya salah. ) Namun, karena sifat dari output itu sama sekali tidak jelas substring mana yang sebaiknya diekstraksi karena Anda tidak dapat benar-benar mengekstrak seluruh alfabet karena linebreak. Jadi, Anda perlu mengekstrak beberapa substring dari alfabet yang dibungkus, tetapi kemudian ada trade-off dalam hal berapa lama Anda membuat substring dan mana yang Anda pilih.

Jadi, inilah yang saya lakukan. Ini adalah skrip CJam yang menemukan semua substring hingga panjang 25 dalam string yang diberikan dan untuk masing-masing menghitung berapa byte byte yang akan disimpan. Pada dasarnya jika ada Nsalinan dari Msubstring panjang, Anda akan menyimpan (N-1)*(M-1) - 5substring, substring ini tidak mengandung garis miring. Juga, secara teknis, ketika Anda sudah mengekstraksi 8 substring atau lebih, offset konstan di akhir dikurangi menjadi -4, tetapi skrip tidak menganggap itu.

Bagaimanapun, inilah yang saya lakukan dengan skrip:

  • Jalankan skrip terhadap kode saat ini (yang awalnya hanya keluaran).
  • Keluar dari substring yang menghasilkan peningkatan terbesar, pilih yang terpendek. Jika ada beberapa, pilih leksikografis terkecil (dari apa yang saya tahu, untuk input yang diberikan ini mengurangi tumpang tindih antara substring).
  • Ganti semua kemunculan substring yang dipilih dalam kode dengan huruf kecil yang tidak terpakai.
  • Tambahkan /x/ABC/ke kode di mana xhuruf yang dipilih dan ABCadalah substring.
  • Ulangi sampai tidak ada lagi substring yang akan menyimpan apa pun.

Pada akhirnya, kami menyimpan beberapa byte lagi dengan mengganti hasilnya //dengan |dan prepending /|/\/\//(inilah sebabnya mengekstraksi substring hanya memakan biaya 4 alih-alih 5 byte setelah substring ke-8 atau lebih).

Seperti yang saya katakan, saya tidak tahu apakah ini optimal dan saya menemukan hasil yang agak tidak teratur cukup menarik. Dimungkinkan untuk mendapatkan solusi yang lebih pendek dengan memilih substring yang tidak optimal (tetapi lebih) di suatu tempat di telepon. Saya ingin tahu apa kelas kompleksitas masalah ini ...


Itu ... brilian ...
George Gibson

1
@ GeorgeGibson Terima kasih ... Saya harus memulai dari awal ketika saya melihat sesuatu YXdalam output. ;)
Martin Ender

Jawaban saya hilang, itu adalah penipuan ini (lebih besar dan lebih baru). +1 untuk itu [bermain golf luar biasa]!
Erik the Outgolfer

Mengenai kelas kompleksitas, bukankah masalahnya tidak dapat dipungkiri karena /// apakah Turing lengkap? Masalahnya adalah "diberi string, temukan program /// terpendek yang mengeluarkannya". Kecuali untuk string kecil, akan ada /// program yang mengulang tanpa batas (tetapi tidak dapat dibuktikan untuk mengulang tanpa batas) yang tidak dapat ditampilkan untuk tidak menghasilkan output yang diinginkan tanpa menjalankannya selamanya. Bukti formal Saya sendiri belum yakin tetapi secara intuitif apakah itu tidak mungkin?
ghosts_in_the_code

16

C, 47 byte

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

Cobalah di Ideone

Satu putaran, mencetak alfabet setiap 26 karakter tetapi dengan setiap 27 karakter digantikan oleh baris baru.


1
Sial! Saya baru saja menulis fungsi yang sama persis! :-) Anda dapat menyimpan titik koma pertama dengan menggunakan f(i)lalu panggil saja f()tanpa argumen.
Level River St

@LevelRiverSt Itu akan bergantung pada perilaku yang tidak terdefinisi.
Anders Kaseorg

2
Ini pada akhirnya terserah Anda, tetapi PPCG menganggap bahasa didefinisikan oleh implementasinya, jadi selama Anda menyebutkan di mana kompiler berfungsi, mengandalkan UB tidak dianggap sebagai masalah.
Dennis

Anda dapat mencukur 1 byte dengan menginisialisasi saya ketika pertama kali disebutkan:i=702;f(){for(;i--;)//...
tucuxi


15

J, 15 byte

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

Penerjemah 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

Bagus! Aritmatika sangat pintar. Pendekatan paling sederhana yang digunakan |. (Shift)adalah 8 byte lebih lama! (i.26)(|."0 _)u:65+i.26
Dan Oak

1
@ ahnoak Anda dapat mempersingkat menjadi 16 byte u:65+1&|.^:]i.26karena kata keterangan daya melacak hasil sebelumnya jika diberikan daftar.
mil

1
@ Miles Bagus, pendekatan saya menggunakan |.17 byte: u:65+|."0 1/~i.26(masih menggunakan /~)
Leaky Nun

1
@ LeakyNun Pendekatan 17 byte lainnya adalah u:65+(|./~,.)i.26. Saya menyingkirkan pangkat dengan menggunakan kail dan ,.untuk membuat kolom rentang tetapi berakhir dengan panjang yang sama.
mil

tidak tahukah kamu jika aku dapat menemukan kode sumber dari tryj.tk di suatu tempat? Saya tidak dapat menemukan info juga tentang penulis (f211)
Dan Oak

15

/// , 128 byte

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

Cobalah online!

Terinspirasi oleh jawaban Jakube yang luar biasa untuk tantangan L-phabet, saya pikir saya akan mencoba tangan saya juga pada pemrograman aktual di /// dan bukan hanya menggunakannya untuk kompresi. Ini cukup sulit dan saya membutuhkan empat upaya, tetapi pada akhirnya itu jauh lebih pendek daripada solusi berbasis kompresi saya .

Penjelasan

Sebuah primer cepat pada ///: pada dasarnya penerjemah hanya membaca karakter kode dengan karakter dan melakukan hal berikut:

  • Jika bukan a \atau a /, cetaklah.
  • Jika a \, cetak karakter berikutnya.
  • Jika itu adalah /, parsing /x/y/instruksi (dengan aturan pelolosan yang sama) dan berulang-ulang gantikan semua xkode yang tersisa y.

Mengambil lebih banyak inspirasi dari Jakube, untuk kesederhanaan saya hanya akan menjelaskan versi 4x4 ini:

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

Kami mulai dengan mengganti :barang-barang dengan yang kedua dan ketiga /. Ini akan menjadi kode yang memutar baris berikutnya. Kami mendapatkan ini:

/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

Itu f, bdan xhanya singkatan untuk string umum, yang akan kita kembangkan sekarang. The fyaitu untuk garis miring, yang badalah untuk backslashes dan xbagi \//yang kebetulan datang cukup banyak. Alasan saya menggunakan alias untuk substring karakter tunggal /dan \adalah bahwa mereka harus melarikan diri dalam instruksi substitusi pertama, jadi saya sebenarnya menyimpan cukup banyak byte dengan tidak memerlukan semua backslash tersebut. Inilah yang kami dapatkan x, fdan btelah diisi:

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

Sangat mudah dibaca.

Jadi baris pertama baru saja dicetak kata demi kata. Kemudian kita sampai pada bagian funky yang memutar semua baris lebih lanjut. Ini sebenarnya terdiri dari empat instruksi berbeda. Satu hal yang perlu diperhatikan adalah bahwa saya telah lolos dari semua kejadian Adalam instruksi ini. Alasannya adalah ini memungkinkan saya untuk membedakan As di dalam instruksi dari As di baris yang tersisa, yang perlu diproses secara berbeda.

/\/\A/\//

Ini cocok /Adan menggantinya dengan /, menghapus A. Perhatikan bahwa substring ini hanya muncul di bagian depan masing-masing ABCD, jadi ini menjatuhkan karakter pertama dari semua baris berikut:

/
\//\A_\//

Ini cocok dengan umpan baris yang diikuti oleh garis miring dan ganti dengan A_/. Jadi ini menyisipkan Apada akhir setiap baris, menyelesaikan rotasi dan juga mengubah umpan baris menjadi garis bawah.

/_\//
\//

Ini cocok _/dan menggantinya dengan linefeed diikuti dengan garis miring. Alasan saya perlu membuat jalan memutar ini melalui garis bawah adalah kenyataan bahwa /// menerapkan setiap instruksi berulang kali hingga string tidak lagi cocok. Itu berarti Anda tidak akan pernah bisa menggunakan instruksi formulir di /x/axb/mana x, adan bmerupakan string arbitrer, karena setelah substitusi xakan selalu tetap cocok. Secara khusus, ini berarti kita tidak bisa hanya memasukkan sesuatu di depan umpan baris. Kita perlu mengganti linefeed dalam proses dan membatalkan penggantian ini.

/\\\A/\\B/

Ini cocok \Adan menggantinya dengan \B, sehingga instruksi setelah baris yang tersisa memproses karakter berikutnya. Setelah keempat instruksi diproses, string yang tersisa terlihat seperti ini:

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

Jadi sekarang baris pertama yang diputar akan dicetak, dan kemudian rangkaian instruksi berikutnya memutar baris yang tersisa oleh sel lain dan seterusnya. Setelah rotasi terakhir, kami memiliki beberapa instruksi lagi yang dapat kami abaikan dan kemudian kami akhiri dengan instruksi tidak lengkap:

/\\\B/\\

Instruksi yang tidak lengkap pada akhirnya hanya diabaikan dan program berakhir.


Bagus Kemarin saya bereksperimen sedikit dengan ide yang berbeda. Saya ingin mengganti setiap karakter di setiap baris. Sesuatu seperti A->B,, B->C... Tapi itu tidak berhasil. Menghapus char pertama dan menambahkannya di akhir jelas merupakan pendekatan yang jauh lebih baik.
Jakube

@ Jakube Saya mencobanya juga tetapi tidak berhasil. Terlalu sulit untuk menghindari mengacaukan instruksi selanjutnya juga.
Martin Ender

1
124 byte: goo.gl/efSLKQ Ini hanya solusi Anda, tetapi saya telah berhasil menambahkan beberapa substitusi tambahan, sehingga Anda hanya perlu menulis alfabet satu kali. Menggunakan strategi yang sama untuk masalah yang sama juga.
Jakube


11

Jelly , 7 byte

ØAṙJṢj⁷

Cobalah online!

Bagaimana itu bekerja

Ø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 byte

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

Di mana ^Pberarti "Kontrol P", dll. Itu 47 byte, karena tombol F3 dan F4 memerlukan dua byte ASCII.

Setelah memasukkan input awal, itu mendefinisikan makro keyboard untuk menduplikasi baris dan memindahkan karakter pertama ke akhir. Ini kemudian menjalankan makro lebih jauh 24 kali.


2
Selamat datang di PPCG, jawaban yang bagus! Sangat jarang melihat jawaban Emacs, saya bahkan tidak tahu apakah jawaban Emacs sudah diposting.
TuxCrafting

10

JavaScript (ES6), 56 byte

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

Ya, benar, setengah kode saya adalah string alfabet literal. Yang terbaik yang bisa saya lakukan tanpa literal adalah 81 byte:

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

Jika Anda menginginkan program daripada fungsi, maka hapus _=>dan bungkus console.log()dengan biaya 10 byte.


Woah, bagus sekali. Solusi yang sangat elegan. Bagaimana cara kerjanya?
Polyducks

2
@ Polyducks Banyak dan banyak sihir regexp. Secara alami /./gcocok dengan setiap huruf dari string alfabet yang disediakan. Dalam string pengganti, $&merupakan kecocokan itu sendiri, $'bagian dari string setelah pertandingan dan $`bagian dari string sebelum pertandingan. $`$&$'Oleh karena itu akan mewakili string asli, tetapi tentu saja sepele untuk memindahkan bagian setelah pertandingan ke awal, sehingga memberikan efek rotasi.
Neil

Super pintar! @Neil dilakukan dengan baik!
Polyducks

9

Mathematica 68 61 byte

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

Terimakasih untuk...

@MartinEnder (7 byte)


Juga, Arraymungkin lebih pendek dari pemetaan atas a Range.
Martin Ender

Saya baru saja memeriksa dan Arraymemang menyimpan byte, tetapi Anda kemudian dapat menyimpan yang lain dengan menghindari Column: Array[{"A"~CharacterRange~"Z"~RotateLeft~#,"\n"}&,26,0]<>""(Anda hanya perlu mengganti \ndengan linefeed yang sebenarnya).
Martin Ender

7
Tunggu, tidak ada built-in? Mustahil
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 byte

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

Dapatkan alfabet dengan map(chr,range(65,91)), kemudian secara manual menerapkan operasi string shift.

Terima kasih kepada @LeakyNun dan @TheBikingViking untuk -4 byte!

Berkat @xnor untuk -3 byte!


2
Ternyata a="ABCDEFGHIJKLMNOPQRSTUVWXYZ"lebih pendek.
Leaky Nun

1
Anda dapat melakukan a[1:]bukan a[1:26].
TheBikingViking

2
Loop Anda dapat dilakukan sebagai for x in s:print s;s=s[1:]+x.
xnor

3
Anda dapat melakukan satu byte lebih pendek dari hardcoding alfabet: s='%c'*26%tuple(range(65,91)).
xnor


9

Piet , 247 byte / 190 kode

Tabula Recta di Piet

Cobalah secara Online!

Jadi, ini memakan waktu lebih lama dari yang saya perkirakan, dan saya punya beberapa ide tentang beberapa pendekatan lain yang lebih efisien (lebih ramah tumpukan), tapi saya akhirnya berhasil bekerja (dan memperbaiki bug interpreter dan menambahkan fitur IDE di sepanjang cara), jadi ini dia. Bukan bahasa byte yang paling efisien, tapi sangat menyenangkan. Berikut tampilan yang lebih besar, dan jejak yang menunjukkan jalur yang diambil. Riwayat di GitHub saya .

Tabula Recta di Piet, versi besar

Tabula Recta menjalankan jejak

Sebagai bahasa berbasis stack, terlalu berbelit-belit untuk dijelaskan secara singkat, tapi inilah gambaran umum dasar tentang apa yang dilakukan berbagai bagian / loop. Semua nama variabel dan fungsi hanya untuk penjelasan, karena tidak ada variabel atau fungsi di Piet.

  • Inisialisasi (kiri atas): dimulai line_counterpada 27, memuat '@' as cur_letter, ditetapkan letter_countke 27
  • Loop utama (mulai dari ungu tua, tengah atas)
    • Pengurangan letter_counter
    • Cabang ke reset_linejika nol (light cyan 2-block)
    • Gulung cur_letterke bagian atas tumpukan
    • Cabang ke check_donejika cur_letter > 'X'(blok merah / merah, sisi kanan)
    • Menambahkan cur_letterdan mengeluarkannya (sudut kanan bawah)
    • Cabang ke reset_letterif cur_letter > 'Y'(blok hijau muda, kiri)
    • Gulung `letter_counter_ kembali ke atas tumpukan, kembali ke atas loop
  • reset_line cabang (kotak merah muda besar):
    • Menghasilkan karakter baris baru
    • Ulang letter_countke 27
    • Terus kembali ke atas loop utama
  • check_done cabang (setengah kanan di dalam)
    • Gulung line_counterke atas
    • Cabang berakhir jika nol
    • Penurunan line_counterdan gulungan kembali ke bawah tumpukan
    • Melanjutkan ke tempat yang ditinggalkannya, mencetak surat
  • reset_line cabang (sisi kiri, blok hijau):
    • Mereset cur_letterke '@'
    • Melanjutkan di mana ia tinggalkan, berguling / kembali ke atas lingkaran

8

MATL , 8 byte

Dengan terima kasih kepada @Dennis , yang menyarankan bahwa MATL harus memasukkan pengindeksan modular, dan kepada @Suever , yang memiliki ide operasi berpasangan otomatis.

1Y2t&+Q)

Cobalah 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 byte

Versi super singkat untuk berjalan di konsol:

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

Javascript / HTML, 140 123 118 105 byte

Versi yang lebih cantik, dengan output HTML yang memudahkan OP untuk menyalin dan menempel:

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

(EDIT: Saya seharusnya hanya menggunakan string AZ daripada menghasilkannya)

(EDIT 2: Terima kasih kepada @Neil dan @DanTheMan atas masukan mereka (lihat komentar))


Bukankah C = 26 yang pertama tidak relevan?
DanTheMan

Oh, snap. Sepertinya saya lupa menghapusnya ketika saya memindahkannya ke for. Tetap! Terima kasih @DanTheMan :)
Polyducks

1
l.slice(0,1)hanya l[0], sementara ,27itu tidak perlu, pada titik mana Anda dapat memindahkan slice dan berakhir dengan l.slice(1)+l[0]. Saya juga berpikir Anda dapat memindahkan console.logke loop body sehingga menghindari trailing ;.
Neil

Menguji ini sekarang, terima kasih @Neil! EDIT: Moly suci yang manis. Terima kasih kepada Anda berdua, saya akan menambahkan Anda untuk kredit di komentar.
Polyducks

1
Ooh, bagus, itu cara yang lebih baik untuk menyederhanakan console.log.
Neil

8

PowerShell, 44 byte

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

8

R, 47 42 41 byte

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

Cobalah online!

Menghasilkan 27 alphabet, menghilangkan 27-huruf dan mencetak dalam 26 kolom.

Peningkatan terinspirasi oleh @Giuseppe 's solusi .



Wow, saya pikir saya telah mencoba setiap trik pengindeksan untuk digunakan reptetapi ini sangat terinspirasi! Sangat bagus. Saya akan memilih lagi jika saya bisa.
Giuseppe

Anda bisa menggunakan 1bukan ""untuk stdout.
Giuseppe

6

Sesos , 27 25 byte

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

Cobalah online! Periksa Debug untuk melihat kode SBIN yang dihasilkan.

Perakitan Sesos

File biner di atas telah dihasilkan dengan merakit kode SASM berikut.

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)

Bagaimana itu bekerja

Kami mulai dengan menginisialisasi rekaman ke ABCDEFGHIJKLMNOPQRSTUVWXYZ. Ini sebagai berikut.

Menulis 26 ke sel, meninggalkan kaset dalam keadaan berikut.

                                                     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

Selama sel di bawah kepala data bukan nol, kami melakukan hal berikut.

Salin nomor ke dua sel ke kiri dan tambahkan 64 ke salinan paling kiri.

                                                   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

Pindahkan salinan paling kiri ke lokasi asli, lalu kurangi 1 dari salinan paling kanan.

                                                     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

Proses berhenti setelah 26 iterasi, karena salinan paling kanan adalah 0 saat itu. Kami memindahkan sel ke kanan, sehingga keadaan akhir rekaman setelah inisialisasi adalah sebagai berikut.

     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

Sekarang kita siap untuk menghasilkan output, dengan mengulangi proses berikut sampai sel di bawah kepala data nol.

Pertama, kita mencetak karakter di bawah kepala data dan bergerak ke kanan, mengulangi langkah ini sampai sel dengan nilai 0 ditemukan. Setelah mencetak ABCDEFGHIJKLMNOPQRSTUVWXYZ, rekaman itu terlihat sebagai berikut.

                                                                                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

Sekarang kita memindahkan data head 27 unit ke kiri (kembali ke 0 terkemuka ) dan ulangi kombinasi print-move sampai sel dengan nilai 0 ditemukan. Ini tidak mencetak apa pun dan meninggalkan kaset sebagai berikut.

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

Sekarang, kita menulis 10 ke sel saat ini, mencetak karakter yang sesuai (linefeed) dan nol sel dengan panggilan masuk getpada input kosong, meninggalkan rekaman tidak berubah.

Setelah itu, kami memindahkan konten sel ke kanan ke sel saat ini, lalu memindahkan kepala data ke unit di sebelah kanan.

      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

Iterasi berikutnya sedikit berbeda. Langkah pencetakan pertama mencetak BCDEFGHIJKLMNOPQRSTUVWXYZ, meninggalkan kaset sebagai berikut.

                                                                                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

Sekarang kita memindahkan data head 27 unit ke kiri.

 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

Lingkaran pencetakan berikutnya mencetak Adan meninggalkan kaset sebagai berikut.

   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

Sekali lagi, kami mencetak umpan baris, memindahkan konten sel ke kanan ke sel saat ini, lalu memindahkan kepala data ke unit ke kanan.

         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

Setelah 24 iterasi lagi, langkah terakhir memindahkan kepala data ke kanan meninggalkan rekaman dalam kondisi berikut.

                                                                                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

Sel di bawah kepala data sekarang 0 dan program berakhir.


TIO menggunakan versi Sesos yang lebih baru, yang kompatibel dengan SASM, tetapi menghasilkan kode SBIN yang lebih pendek.


6

Haskell, 56 53 52 Bytes

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

panjang yang sama: (menggunakan saran oleh @AndersKaseorg)

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

untuk melakukan hal-hal modular Anda harus mengimpor Data.Char untuk mendapatkan fungsi chr, 74 59 58 Bytes adalah yang terbaik yang bisa saya dapatkan dengan itu: (terima kasih kepada @nimi untuk menyarankan fungsi toEnum)

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

Ini mungkin bisa jauh lebih pendek, tapi saya tidak tahu ada trik golf Haskell.

mapM bekas, bukan mapM_ (lihat komentar @ Lynn)


1
Untuk −3 byte, ubah ['A'..x]menjadi ['A'..'Z'], yang sekarang digunakan dua kali, dan angkat ke definisi.
Anders Kaseorg

@AndersKaseorg: Terima kasih! Namun, saya mendapat ide lain yang menyimpan jumlah byte yang sama sambil tetap menjadi oneliner. Saya menambahkan saran Anda ke solusi alternatif.
KarlKastor

Jika Anda hanya perlu chrdari Data.Char, Anda dapat menggunakan toEnumbukan dan menghilangkan import.
nimi

1
Aku merasa seperti mengubah mapM_ke mapMharus baik-baik. Mungkin ini layak untuk sebuah meta post ...
Lynn



5

Brain-Flak , 222 byte

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

Cobalah online!

Saya baru mengenal Brain-Flak, jadi mungkin ini bisa banyak bermain golf, tapi setidaknya ini percobaan pertama. Ini menyimpan 27 huruf penuh pada tumpukan kiri, kemudian memindahkan huruf ke kanan dan mengganti setiap 27 huruf dengan baris baru.

Kode sumber saya agak membingungkan, tetapi saya akan menambahkannya.

(((()()()()){})
    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 byte

¬AZ25ñÙx$p

Cobalah online!

Ini menggunakan pengkodean "Latin1".

Penjelasan:

¬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

Pergi dan tambahkan itu;)
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Anda harus tahu sekarang bahwa satu-satunya cara apa pun dilakukan dalam bahasa ini adalah pada kecepatan siput. Saya mungkin akan menjalankan dan menjalankannya sekitar Januari mendatang. : P
DJMcMayhem

Oh, dalam 6-8 minggu ke depan?
Conor O'Brien

4

C #, 98 byte

Saya telah mencoba untuk melihat apakah saya dapat menghasilkan huruf lebih pendek dari sekadar menginisialisasi mereka sebagai string, tetapi itu tidak benar-benar mungkin. Huruf-hurufnya adalah 26 byte dan potongan ini saja

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

adalah 25 byte. Saya pikir menginisialisasi mereka dan kemudian menambahkannya dengan + = a adalah solusi yang baik, tetapi dengan C # Anda dibatasi oleh bytecount fungsi seperti Substring()dan Console.WriteLine().

Usaha saya di 98 byte:

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

4

Oktaf, 27 byte

Kami menambahkan baris dan vektor kolom, dan Oktaf dengan baik memperluas dimensi sigleton, tidak perlu bsxfun(seperti yang Anda perlukan di Matlab).

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


4

Jawa, 190 176 172 163 byte

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

Anda dapat dengan mudah memangkas beberapa byte lagi: System.out.printf("%c", ...)-> System.out.write(...), '\n'-> 10, 'A'-> 65. Perhatikan bahwa saran umpan baris baru / baris diizinkan, tetapi persyaratan output ideone . :)
MH.

@ MH. tips hebat! disimpan 9 byte :)
Master_ex

Saya tahu ini sudah lebih dari setahun sejak Anda menjawab ini, tetapi Anda masih bisa bermain golf beberapa hal: Ruang di String[]adapat dihapus; dan int s=0;while(s<26){p(s,26);p(0,s++);p(-1,0);}bisa for(int s=0;s<26;p(0,s++),p(0,s++))p(s,26);.
Kevin Cruijssen

4

Bash, 66 byte

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

Saya membuat alfabet penuh A, kemudian mencetak 26 versi yang diputar dengan mengambil karakter mulai ndan menambahkan posisi sebelumnya n.


4

Perl, 42 byte

Kredit penuh ke @Dom Hastings untuk ini.

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

Atau (jumlah byte yang sama):

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

Perlu -M5.010atau -Euntuk dijalankan, misalnya:

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



Jawaban lama saya (55 byte):

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

Perlu -M5.010dijalankan. Jadi jalankan dengan:

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

Mungkin mungkin untuk melakukan yang lebih pendek, tetapi saya belum mengetahui caranya ... belum


Berhasil menghasilkan beberapa solusi 42 byte: @l=A..Z;say@l[$_..25],@l[0..$_-1]for 0..25dan $_=join"",A..Z;eval'say;/./;$_=$\'.$&;'x26keduanya membutuhkan -E/ -M5.010.
Dom Hastings

Bagus sekali. Terlihat jauh lebih baik daripada coba saya! terima kasih
Dada
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.