Segitiga alfabet menyerang lagi


24

Tugas

Tugas Anda adalah mencetak teks ini:

A
BCD
EFGHI
JKLMNOP
QRSTUVWXY
ZABCDEFGHIJ
KLMNOPQRSTUVW
XYZABCDEFGHIJKL
MNOPQRSTUVWXYZABC
DEFGHIJKLMNOPQRSTUV
WXYZABCDEFGHIJKLMNOPQ
RSTUVWXYZABCDEFGHIJKLMN
OPQRSTUVWXYZABCDEFGHIJKLM
NOPQRSTUVWXYZABCDEFGHIJKLMN
OPQRSTUVWXYZABCDEFGHIJKLMNOPQ
RSTUVWXYZABCDEFGHIJKLMNOPQRSTUV
WXYZABCDEFGHIJKLMNOPQRSTUVWXYZABC
DEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL
MNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVW
XYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJ
KLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXY
ZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOP
QRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHI
JKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCD
EFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZA
BCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ

Spesifikasi

  • Anda dapat melakukannya dalam huruf kapital semua dan bukan huruf kapital semua.
  • Membuntuti baris baru di ujung segitiga diizinkan.
  • Membuntuti spasi setelah setiap baris diizinkan.
  • Anda harus mencetak ke STDOUT alih-alih mengeluarkan serangkaian string.

Mencetak gol

Ini adalah . Program dengan kemenangan jumlah byte terendah.


1
Apa yang Anda maksud dengan "menyerang lagi"? Apakah ada tantangan lain yang Anda buat seperti ini?
haykam


1
Tampaknya sepele, apakah kita benar-benar membutuhkan tantangan alfabet (lain)?
Rohan Jhunjhunwala

2
Ini adalah tantangan yang baik, tetapi saya pikir kami telah melampaui saturasi tantangan alfabet ini, bukan masalah pribadi.
Rohan Jhunjhunwala

Sebenarnya mencari tantangan alfabet bahwa huruf pada posisi tidak dapat dihitung dengan ekspresi sederhana dari koordinatnya yang melibatkan modfungsi. Mungkin membuat sendiri jika aku punya waktu.
Weijun Zhou

Jawaban:


39

Vim, 29 byte

:h<_↵↵↵y$ZZ26P0qqa↵♥βjllq25@q

Di mana mewakili kunci Return, tombol Escape, dan βtombol Backspace.

masukkan deskripsi gambar di sini


3
Bagaimana Anda selalu mengalahkan saya untuk jawaban vim pada ini? Lagi pula, Aargh +1, saya tidak bisa membatalkan vim! :)
DJMcMayhem

7
Saya masih berpikir Anda harus menggunakan bukan . Dan bukannya β. Itulah tujuan dibuatnya Unicode ini. utf8icons.com/subsets/control-pictures
mbomb007

9

Python 2, 65 byte

i=1
a=bytearray(range(65,91))*26
while a:print a[:i];a=a[i:];i+=2

1
Saya telah mengubah tajuk menjadi Python 2 karena kode tidak akan berfungsi dalam Python 3.
Leaky Nun

7

Jelly , 10 byte

26RḤ’RØAṁY

Cobalah online!

Bagaimana itu bekerja

26RḤ’RØAṁY  Main link. No Arguments.

26          Set the return value to 26.
  R         Range; yield [1, 2, ..., 25, 26].
   Ḥ        Unhalve; yield [2, 4, ..., 50, 52].
    ’       Decrement; yield [1, 3, ..., 49, 51].
     R      Range; yield [[1], [1, 2, 3], ..., [1, ..., 49], [1, ..., 51]].
      ØA    Yield the uppercase alphabet.
        ṁ   Mold the alphabet as the array of ranges. This repeats the uppercase
            letters over an over again, until all integers in the range arrays
            have been replaced with letters.
         Y  Join, separating by linefeeds.

Apakah "Double" disebut "Unhalve" saat itu? Juga bagus !! [menunggu untuk mengucapkan selamat untuk 100 ribu perwakilan]
Erik the Outgolfer

Itu hanya mnemonik. Hadalah separuh dan kebalikannya (tidak bernafas ).
Dennis

Saya hanya memikirkan /2atau *2, jadi "Membagi dua" atau "Double". Itu sebabnya saya bingung.
Erik the Outgolfer

Juga 10 byte:27Ḷ²IRØAṁY
Leaky Nun

Juga 10 byte:51Rm2RØAṁY
HyperNeutrino

7

VBA Excel (80 byte, 1742 byte)


Excel, 1742 byte

Terinspirasi oleh jawaban kreatif ugoren , saya berhasil menemukan formula Excel untuk membuat pola seperti yang ditunjukkan dalam OP.

=MID(REPT("ABCDEFGHIJKLMNOPQRSTUVWXYZ",26),(ROW()-1)^2+1,2*ROW()-1)

Rekatkan rumus ini di sel A1, lalu seret ke seluruh rentang A1: A26.

Panjang rumus adalah 67 byte tetapi Anda harus mengulanginya 26 kali, jadi itu sama dengan 67 * 26 = 1742 byte. Berikut ini hasilnya:

masukkan deskripsi gambar di sini


Excel VBA, 80 byte

Sekarang mungkin kami mengintegrasikan Excel dengan VBA untuk mengotomatiskan proses dan menyimpan banyak byte karena VBA dibangun di sebagian besar aplikasi Microsoft Office, termasuk Excel. Tulis dan jalankan kode berikut di Jendela Segera (gunakan tombol kombinasi CTRL+ Guntuk menampilkannya di Editor Visual Basic):

[A1:A26]="=MID(REPT(""ABCDEFGHIJKLMNOPQRSTUVWXYZ"",26),(ROW()-1)^2+1,2*ROW()-1)"

Program ini bekerja dengan mencetak rumus Excel di atas ke rentang A1: A26. Sayangnya, baik Excel dan VBA tidak memiliki alfabet bawaan.


Nama kolom terlihat seperti alfabet bawaan untuk saya. Gunakan 26 nama kolom pertama.
mbomb007

1
@ mbomb007 Jadi apa? Saya pikir akan lebih sulit untuk menggunakannya daripada string.
Erik the Outgolfer

@EriktheGolfer Jadi? Maksud saya adalah bahwa ada adalah alfabet builtin.
mbomb007

1
@ mbomb007 Anda mengatakan "Gunakan 26 nama kolom pertama", yang saya anggap "Gunakan 26 nama kolom pertama dan bukan apa yang saat ini Anda gunakan", itulah sebabnya saya menjawab.
Erik the Outgolfer

@EriktheGolfer Ini saran. Idk berapa byte yang akan terjadi.
mbomb007

5

Haskell, 67 byte

_#53=[]
s#i=take i s:drop i s#(i+2)
mapM putStrLn$cycle['A'..'Z']#1

Rekursi sederhana sepanjang igaris. Dalam setiap langkah, ikarakter berikutnya diambil dari pengulangan alfabet tanpa batas.


4

Mathematica, 90 byte

StringRiffle[Flatten[Alphabet[]&~Array~26]~Internal`PartitionRagged~Range[1,51,2],"
",""]&

Fungsi anonim. Tidak mengambil input dan mengembalikan string sebagai output. Saran bermain golf diterima. Contoh apa yang Internal`PartitionRaggeddilakukan:

In[1]:= Internal`PartitionRagged[{2, 3, 5, 7, 11, 13}, {2, 3, 1}]               

Out[1]= {{2, 3}, {5, 7, 11}, {13}}

Mathematica memiliki built-in untuk segitiga alfabet?
Buffer Over Read

4

C, 79 byte

main(i,j){for(i=0,j=1;i<676;i++){putchar(i%26+65);if(j*j==i+1){puts("");j++;}}}

Jawaban pertama saya di C \ o /

Saran bermain golf lebih dari diterima.


62:i;main(j){while(i<676)printf("\n%c"+(j*j^i++||!j++),i%26+65);}
xsot

@ xsot Terima kasih, tetapi saya khawatir baris baru tidak diizinkan.
Leaky Nun

1
Tetapi tidak ada baris baru terkemuka?
xsot

60:i;main(j){for(;j<27;j*j^++i||puts("",j++))putchar(i%26+65);}
xsot

@ imibis saya kira saya harus mempostingnya kalau begitu.
xsot

4

Brachylog , 37 byte

26~l<:1aLc~j[@A:I],L~@nw
=:2%1,.#@l?,

Cobalah online!

Penjelasan

  • Predikat utama:

    26~l         Let there be a list of 26 elements
    <            This list is an ascending list of integers
    :1aL         Apply predicate 1 to that list ; the resulting list of strings is L
    c            Concatenate the list of strings into one big string
    ~j[@A:I],    That big string is the result of juxataposing the alphabet I times to itself
    L~@n         Create a string which when splitted on line breaks results in L
    w            Write that string to STDOUT
    
  • Predikat 1: digunakan untuk menghasilkan string variabel dengan panjang ganjil.

    =            Assign a value to the Input
    :2%1,        That value must be odd
    .#@l?,       Output is a string of length Input
    

Akhirnya Anda melakukan tantangan seni-seni
Leaky Nun

@LeakyNun Akan mengklasifikasikan itu sebagai manipulasi string lebih dari ASCII art imo
Fatalize

Haruskah saya menambahkannya ke tag?
Leaky Nun

Penggunaan fakta bahwa baris terakhir adalah satu-satunya jalur yang berakhir Zkarena 26bebas persegi.
Leaky Nun


3

JavaScript (ES6), 77 82 88

Diperlukan EcmaScript 6 hanya untuk menghemat 1 byte menggunakan string string literal untuk baris baru.

for(i=r=l=o='';l+52;r++||(r=l-=2,o+=`
`))o+=(i++%26+10).toString(36);alert(o)

Kurang golf

for(i = r = l = o = '';
    l + 52;
    r++ || (r = l -= 2, o += `\n`))
  o += (i++ % 26 + 10).toString(36);
alert(o);

Uji

for(i=r=l=o='';l+52;r++||(r=l-=2,o+=`
`))o+=(i++%26+10).toString(36);alert(o)


\ o / jawaban ES6 yang bisa saya jalankan di browser saya
Downgoat

Saya mencuri logika .toString (36) Anda ... sekarang Anda harus mengalahkan 80 byte !!
applejacks01

Ahh aku mengakui, aku tidak bisa memikirkan cara apa pun untuk mengalahkan ini dengan perpustakaanku. Terima kasih atas tantangannya!
applejacks01

3

Perl, 42 41 39 byte

perl -E '@b=(A..Z)x26;say splice@b,0,$#a+=2for@b'

Hanya kode:

@b=(A..Z)x26;say splice@b,0,$#a+=2for@b

Versi yang lebih pendek jelas memicu masalah perl internal (Penggunaan nilai yang dibebaskan dalam iterasi):

say splice@b,0,$#a+=2for@b=(A..Z)x26

2

JavaScript, 129 byte

z=1,i=0,g=a=>{b=0,c="";while(a+a-1>b){c+='ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split``[i>26?i=0:i++];b++}console.log(c)};while(z<26)g(z++)

1
Menggunakan operator spread dapat menghemat 3 byte : [...'ABCDEFGHIJKLMNOPQRSTUVWXYZ']alih-alih 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split``.
masukkan nama pengguna


2

Pergi, 133 byte

package main
import S "strings"
func main(){s:=S.Repeat("ABCDEFGHIJKLMNOPQRSTUVXXYZ",26)
for i:=1;s!="";i+=2{println(s[:i]);s=s[i:]}}

2

MATLAB, 112 109 95 79 77 byte

Ini juga akan bekerja dengan Octave , Anda dapat mencoba online di sini .

a=['' 65:90 65:90]';j=0;for i=1:2:52;b=circshift(a,j);j=j-i;disp(b(1:i)');end

Jadi setelah beberapa perubahan besar, saya telah menyimpan 14 32 byte lebih lanjut . Yang ini menjadi lebih seperti panjang yang saya harapkan dari MATLAB. Saya telah meninggalkan versi lama di bawah karena ini sangat berbeda.

a=['' 65:90 65:90]';        %Create 2 copies of the upper case alphabet
j=0;                        %Initialise cumulative sum
for i=1:2:52;               %For each line length
    b=circshift(a,j);       %Rotate the alphabet string by the cumulative offset
    j=j-i;                  %Update cumulative negative sum of offsets.
    disp(
         b(1:i)'            %Extract first 'line length' characters from rotated alphabet.
               );           %Display next line (disp adds newline automatically)
end

Versi asli:

a=['' repmat(65:90,1,26)];c=cumsum(1:2:51);disp(cell2mat(arrayfun(@(s,f)[a(s:f) 10],[1,c(1:25)+1],c,'Un',0)))

Wow, yang satu ternyata lebih panjang dari yang saya kira. Saya akan melihat apakah saya tidak bisa menjatuhkan beberapa byte darinya.

Versi ungolfed untuk menjelaskan:

a=['' repmat(65:90,1,26)]; %Create 26 copies of the upper case alphabet
c=cumsum(1:2:51);          %Calculate the end index of each row in the above array, by cumulatively summing the length of each line
disp(
     cell2mat(
              arrayfun(@(s,f)
                             [a(s:f) 10], %Extract the part of the alphabet and insert a new line.
                                         [1,c(1:25)+1],c, %start index is the previous end of line plus 1. End index is as calculated by cumsum.
                       'Un',0 %The returned values are not all the same length
                       )   %Do this for each line
              )            %Convert back to a matrix now new lines inserted
     )                     %And display it

Ucapan Terima Kasih

  • 3 byte disimpan - terima kasih @LuisMendo

2

XPath 3.0 (dan XQuery 3.0), 84 byte

codepoints-to-string((0 to 25)!(subsequence(((1 to 26)!(65 to 90)),.*.+1,2*.+1),10))

Penjelasan:

(1 to 26)!(65 to 90) adalah alfabet 26 kali

(0 to 25)!(subsequence(XX, start, len),10) membutuhkan 26 berikutnya, masing-masing diikuti oleh baris baru

subsequence(X, .*.+1, 2*.+1) mengambil urutan berikutnya dengan posisi awal dan panjang: (1, 1), (2, 3), (5, 5), (10, 9) dll.

codepoints-to-string() mengubah Unicode codepoint menjadi karakter


Bravo. Saya pikir saya tahu apa itu XQuery. Ternyata saya tidak tahu.
Jordan

Saya ragu bahwa banyak posting di sini bercerita banyak tentang bahasa tempat mereka ditulis.
Michael Kay


2

05AB1E (alternatif) 15 byte

A2×52µ¼D¾£,¾¼FÀ

Cobalah online!

Penjelasan:

A2×              # push a string containing a-za-z
   52µ           # Loop the rest of the program until counter = 52
      ¼          # increment counter (it's 0 initially)
       D         # Duplicate the alpha string on the stack
        ¾£       # Replace alpha with alpha[0..counter]
          ,      # Pop the substring and print it
           ¾¼FÀ  # rotate the alpha string left counter++ times.

2

R, 120 115 111 byte

v=c();for(i in 1:26){v=c(v,c(rep(LETTERS,26)[(sum((b=seq(1,51,2))[1:i-1])+1):sum(b[1:i])],"\n"))};cat(v,sep="")

Tidak Terkumpul:

a=rep(LETTERS,26)
b=seq(1,51,2)
v=vector()

for(i in 1:26)
    {
    v=c(v,c(a[(sum(b[1:i-1])+1):sum(b[1:i])],"\n"))
    }

cat(v,sep="")

Pada dasarnya, badalah vektor dari angka ganjil di antara 1dan 51, sehingga memberikan panjang setiap baris. Jelas, sumfungsinya menjumlahkan angka dari vektor ini, dan memberikan indeks awal dan akhir.

-5 byte terima kasih kepada @plannapus!
-4 byte terima kasih kepada @plannapus!


1
arf, maaf saya tidak melihat itu sebelumnya, tetapi karena Anda hanya menggunakan asekali Anda sebenarnya tidak perlu mendefinisikannya, artinya Anda dapat mencukur beberapa byte lagi: b=seq(1,51,2);v=c();for(i in 1:26){v=c(v,c(rep(LETTERS,26)[(sum(b[1:i-1])+1):sum(b[1:i])],"\n"))};cat(v,sep="")works.
plannapus

@plannapus Silly me! Terima kasih lagi ! Saya juga mengintegrasikan b=seqbagian dalam tubuh utama, sehingga bahkan lebih mudah dibaca!
Frédéric

2

R, 81 73 65 63 byte

forPendekatan loop sederhana . Ulangi alfabet 26 kali dan loop melalui rentang indeks geser yang dihitung menggunakan (i^2-2*i+2):i^2.

for(i in 1:26)cat(rep(LETTERS,26)[(i^2-2*i+2):i^2],"\n",sep="")

2

Sekam , 10 byte

Cİ1ṠṁK…"AZ

Cobalah online!

Penjelasan

Cİ1ṠṁK…"AZ
      …"AZ    Get the alphabet
   ṠṁK        Replace each letter with the whole alphabet
C             Cut the resulting string into lines with lengths
 İ1            equal to the list of odd numbers

1

Batch, 123 byte

@set s=
@for /l %%i in (1,2,51)do @call set s=%%s%%ABCDEFGHIJKLMNOPQRSTUVWXYZ&call echo %%s:~0,%%i%%&call set s=%%s:~%%i%%

1

05AB1E , 18 17 byte

26FA26×N>n£NnF¦},

Penjelasan

26F                 # for N in range(0, 26) do
   A26×             # the alphabet repeated 26 times
       N>n£         # take (N+1)^2 letters
           NnF¦}    # throw away the first N^2 letters
                ,   # print with newline

Cobalah online!


1

Rexx, 74 72 byte

i=1;m=1;do 26;say substr(copies(xrange('A','Z'),26),i,m);i=i+m;m=m+2;end

Tidak Disatukan:

i=1
m=1
do 26
  say substr(copies(xrange('A','Z'),26),i,m)
  i=i+m
  m=m+2
end

1

TSQL, 129 byte

GUNAKAN MASTER di awal skrip adalah untuk memastikan bahwa kueri dijalankan di database master yang default untuk banyak pengguna (tidak termasuk byte untuk itu).

Golf:

USE MASTER

SELECT SUBSTRING(REPLICATE('ABCDEFGHIJKLMNOPQRSTUVWXYZ',26),number*number+1,number*2+1)FROM spt_values WHERE number<26and'P'=type

Tidak Disatukan:

USE MASTER

SELECT SUBSTRING(REPLICATE('ABCDEFGHIJKLMNOPQRSTUVWXYZ',26),number*number+1,number*2+1)
FROM spt_values
WHERE number<26and'P'=type

Biola

Biola untuk versi yang lebih lama menggunakan jalur xml


1

PowerShell, 68 byte

$a=-join(65..90|%{[char]$_})*26;26..1|%{$a=$a.Insert($_*$_,"`n")};$a

Bagian sebelum titik koma pertama menghasilkan string yang berisi 26 salinan huruf besar. Bagian berikutnya menyuntikkan linebreak pada indeks setiap angka kuadrat (bekerja mundur jadi saya tidak harus memperhitungkan pergeseran). Akhirnya, $apada akhirnya hanya mendorong variabel string ke PowerShell STDOUT.



1

C, 60 byte

i;main(j){for(;j<27;j*j^++i||puts("",j++))putchar(i%26+65);}

putshanya butuh satu argumen. (Beberapa perilaku tidak terdefinisi diizinkan dalam codegolf secara normal tetapi ini agak terlalu jauh di luar jalur yang biasa)
MM

@ MM Perilaku yang tidak terdefinisi dieksploitasi setiap saat. Aturannya adalah bahwa kiriman valid selama itu bekerja di beberapa kompiler, jika tidak kita harus secara eksplisit mengesampingkan daftar panjang pengecualian. Kode ini berfungsi dalam gcc sehingga merupakan pengiriman yang valid.
xsot

1

C ++, 111 byte

void a(){int c=65,i,j;for(i=0;i<26;i++){for(j=0;j<=2*i;j++){std::cout<<(char)c;c++;if(c==91)c=65;}std::cout<<'\n';}}

Coba pertama di salah satu dari ini. Menggunakan "c" untuk merekam surat mana yang perlu dicetak pada waktu tertentu. Setelah "c" melewati 90 ('Z') ia akan direset ke 65 ('A'). Mencetak piramida menggunakan untuk loop.


Jawaban bagus! Anda bisa melakukan if(c<92)c=65untuk mengambil satu byte off, dan Anda mungkin juga dapat melakukan int a()bukan void a(), tapi aku tidak positif jika yang bekerja tanpa pengembalian. Selain itu, saya pikir Anda perlu memasukkan #include <iostream>dalam jumlah byte Anda.
DJMcMayhem

Saya percaya maksud Anda if(c>90)c=65, tapi terima kasih atas sarannya, itu ide yang bagus. Juga, saya kira saya akan memasukkannya, terima kasih.
limelier

1

PHP, 76 69 byte

for(;$i<26&&$a.=join(range(A,Z));)echo substr($a,$i**2,1+2*$i++)."
";
  • Buat 26 alfabet (lebih dari cukup) dan hubungi mereka dalam $ a
  • lingkaran untuk i <26
  • tampilkan $ a mulai substring i ^ 2, end 2 * i + 1
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.