Trójkąt alfabetu uderza ponownie

24

Zadanie

Twoim zadaniem jest wydrukowanie tego dokładnego tekstu:

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

Okular

  • Możesz to zrobić małymi literami zamiast wielkimi literami.
  • Dozwolone są końcowe znaki nowej linii na końcu trójkąta.
  • Końcowe spacje po każdej linii są dozwolone.
  • Musisz wydrukować do STDOUT zamiast wypisywać tablicę ciągów.

Punktacja

To jest . Program z najmniejszą liczbą wygranych bajtów.

Leaky Nun
źródło
1
Co rozumiesz przez „uderzenie ponownie”? Czy podjąłeś inne wyzwanie?
haykam
1
Wydaje się dość trywialne, czy naprawdę potrzebujemy (kolejnego) wyzwania alfabetycznego?
Rohan Jhunjhunwala
2
To dobre wyzwanie, ale myślę, że wyprzedziliśmy nasycenie tych alfabetycznych wyzwań, nic osobistego.
Rohan Jhunjhunwala
W rzeczywistości szukamy wyzwania alfabetu, że litery na pozycji nie można obliczyć za pomocą prostych wyrażeń z jej współrzędnych obejmujących modfunkcję. Może sam go stworzę, jeśli będę miał czas.
Weijun Zhou

Odpowiedzi:

39

Vim, 29 bajtów

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

Gdzie reprezentuje klawisz Return, klawisz Escape i βklawisz Backspace.

enter image description here

Lynn
źródło
3
Jak zawsze bijesz mnie na te odpowiedzi? Aargh +1 tak czy inaczej, nie mogę nie głosować vim! :)
DJMcMayhem
7
Nadal uważam, że powinieneś użyć zamiast . I zamiast β. Po to zostały stworzone te znaki Unicode. utf8icons.com/subsets/control-pictures
mbomb007
9

Python 2, 65 bajtów

i=1
a=bytearray(range(65,91))*26
while a:print a[:i];a=a[i:];i+=2
xsot
źródło
1
Zmieniłem nagłówek na Python 2, ponieważ kod nie działałby w Pythonie 3.
Leaky Nun
7

Galaretka , 10 bajtów

26RḤ’RØAṁY

Wypróbuj online!

Jak to działa

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.
Dennis
źródło
Czy wtedy „Double” nazywało się „Unhalve”? Również jest świetny !! [czeka, aby powiedzieć gratulacje za 100
000
To tylko mnemonik. Hjest o połowę i jest odwrotnością ( unhalve ).
Dennis
Właśnie myśleć /2albo *2, więc jest to „Przepolawiac” lub „Double”. Właśnie dlatego byłem zdezorientowany.
Erik the Outgolfer,
Również 10 bajtów:27Ḷ²IRØAṁY
Leaky Nun
Również 10 bajtów:51Rm2RØAṁY
HyperNeutrino
7

VBA Excel (80 bajtów, 1742 bajtów)


Excel, 1742 bajtów

Zainspirowany twórczą odpowiedzią ugorena udało mi się znaleźć formułę programu Excel, aby utworzyć wzór, jak pokazano w PO.

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

Wklej tę formułę do komórki A1, a następnie przeciągnij w całym zakresie A1: A26.

Długość formuły wynosi 67 bajtów, ale musisz ją powtórzyć 26 razy, więc jest równa 67 * 26 = 1742 bajtów. Oto wynik:

enter image description here


Excel VBA, 80 bajtów

Teraz możliwe jest zintegrowanie programu Excel z VBA, aby zautomatyzować proces i zaoszczędzić wiele bajtów, ponieważ VBA jest wbudowany w większość aplikacji Microsoft Office, w tym Excel. Napisz i uruchom następujący kod w oknie natychmiastowym (użyj kombinacji klawiszy CTRL+, Gaby wyświetlić go w edytorze Visual Basic):

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

Program działa, drukując powyższą formułę Excel do zakresu A1: A26. Niestety zarówno Excel, jak i VBA nie mają wbudowanego alfabetu.

Anastasiya-Romanova 秀
źródło
Nazwy kolumn wyglądają dla mnie jak wbudowany alfabet. Użyj pierwszych 26 nazw kolumn.
mbomb007
1
@ mbomb007 Co z tego? Myślę, że trudniej byłoby użyć ich zamiast łańcuchów.
Erik the Outgolfer,
@EriktheGolfer So? Chodzi mi o to, że nie jest alfabet wbudowane.
mbomb007
1
@ mbomb007 Powiedziałeś „Użyj pierwszych 26 nazw kolumn”, co odebrałem jako „Użyj pierwszych 26 nazw kolumn zamiast tego, czego obecnie używasz”, dlatego odpowiedziałem.
Erik the Outgolfer,
@EriktheGolfer To sugestia. Nie wiem, ile by to było bajtów.
mbomb007,
5

Haskell, 67 bajtów

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

Prosta rekurencja na całej długości ilinii. Na każdym kroku ipobierane są kolejne znaki z nieskończonej liczby powtórzeń alfabetu.

nimi
źródło
4

Mathematica, 90 bajtów

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

Funkcja anonimowa. Nie pobiera danych wejściowych i zwraca ciąg wyjściowy. Sugestie dotyczące gry w golfa mile widziane. Przykład tego, co Internal`PartitionRagged:

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

Out[1]= {{2, 3}, {5, 7, 11}, {13}}
LegionMammal978
źródło
Mathematica ma wbudowane trójkąty alfabetu?
Bufor
4

C, 79 bajtów

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

Moja pierwsza odpowiedź w C \ o /

Sugestie dotyczące gry w golfa są mile widziane.

Leaky Nun
źródło
62:i;main(j){while(i<676)printf("\n%c"+(j*j^i++||!j++),i%26+65);}
xsot
@xsot Dzięki, ale obawiam się, że wprowadzanie nowych linii jest niedozwolone.
Leaky Nun
1
Ale nie ma wiodącej nowej linii?
xsot
60:i;main(j){for(;j<27;j*j^++i||puts("",j++))putchar(i%26+65);}
xsot
@immibis Chyba powinienem to opublikować.
xsot
4

Brachylog , 37 bajtów

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

Wypróbuj online!

Wyjaśnienie

  • Główny predykat:

    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
    
  • Predykat 1: służy do generowania zmiennych ciągów o nieparzystych długościach.

    =            Assign a value to the Input
    :2%1,        That value must be odd
    .#@l?,       Output is a string of length Input
    
Fatalizować
źródło
Wreszcie wykonujesz wyzwanie ascii-art
Leaky Nun
@LeakyNun Sklasyfikowałbym to jako manipulację łańcuchem bardziej niż ASCII art imo
Fatalize
Czy powinienem to dodać do tagu?
Leaky Nun
Fajne wykorzystanie faktu, że ostatnia linia jest jedyną linią, która się kończy, Zponieważ 26jest wolna od kwadratów.
Leaky Nun
3

JavaScript (ES6), 77 82 88

EcmaScript 6 wymagał jedynie zapisania 1 bajtu przy użyciu literału ciągu szablonu dla znaku nowej linii.

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

Mniej golfa

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

Test

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

edc65
źródło
\ o / odpowiedź ES6 Mogę uruchomić w przeglądarce
Downgoat
Ukradłem twoją logikę .toString (36) ... teraz musisz pokonać 80 bajtów !!
applejacks01
Achh przyznaję, nie mogę wymyślić żadnego sposobu na pokonanie tego w mojej bibliotece. Dzięki za wyzwanie!
applejacks01
3

Perl, 42 41 39 bajtów

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

Tylko kod:

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

Oczywista krótsza wersja niestety powoduje wewnętrzny problem z perlem (użycie zwolnionej wartości w iteracji):

say splice@b,0,$#a+=2for@b=(A..Z)x26
Ton Hospel
źródło
2

JavaScript, 129 bajtów

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++)
Lotka
źródło
1
Korzystanie z operatora rozkładania może zaoszczędzić 3 bajty : [...'ABCDEFGHIJKLMNOPQRSTUVWXYZ']zamiast 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split``.
inserttusernamehere
2

Idź, 133 bajty

package main
import S "strings"
func main(){s:=S.Repeat("ABCDEFGHIJKLMNOPQRSTUVXXYZ",26)
for i:=1;s!="";i+=2{println(s[:i]);s=s[i:]}}
Roland Illig
źródło
2

MATLAB, 112 109 95 79 77 bajtów

Będzie to również działać z Octave , możesz spróbować online tutaj .

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

Więc po kilku poważnych zmianach zaoszczędziłem jeszcze 14 32 bajtów. Ten będzie coraz bardziej podobny do długości, jakiej spodziewałbym się po MATLAB. Zostawiłem starą wersję poniżej, ponieważ jest ona zasadniczo inna.

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

Orginalna wersja:

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, ten okazał się dłuższy, niż się spodziewałem. Zobaczę, czy nie mogę zrzucić kilku bajtów.

Wersja bez golfa do wyjaśnienia:

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

Podziękowanie

  • 3 bajty zapisane - dzięki @LuisMendo
Tom Carpenter
źródło
2

XPath 3.0 (i XQuery 3.0), 84 bajtów

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

Wyjaśnienie:

(1 to 26)!(65 to 90) jest alfabetem 26 razy

(0 to 25)!(subsequence(XX, start, len),10) pobiera 26 podciągów tego, po których następuje nowa linia

subsequence(X, .*.+1, 2*.+1) przyjmuje kolejne podsekwencje z pozycją początkową i długością: (1, 1), (2, 3), (5, 5), (10, 9) itd.

codepoints-to-string() zamienia znaki kodowe Unicode w znaki

Michael Kay
źródło
Brawo. Myślałem, że wiem, czym jest XQuery. Okazuje się, że nie miałem pojęcia.
Jordan
Wątpię, aby wiele zamieszczonych tutaj postów mówiło wiele o języku, w którym są napisane.
Michael Kay,
2

05AB1E (alternatywnie) 15 bajtów

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

Wypróbuj online!

Wyjaśnienie:

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.
strzępy
źródło
2

R, 120 115 111 bajtów

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

Nie golfowany:

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

Zasadniczo bjest wektorem liczb nieparzystych między 1i 51, co daje długość każdej linii. Oczywiście sumfunkcja sumuje liczby tego wektora i daje indeksy początkowe i końcowe.

-5 bajtów dzięki @plannapus!
-4 bajty dzięki @plannapus!

Frédéric
źródło
1
arf, przepraszam, nie widziałem tego wcześniej, ale ponieważ używasz tylko araz, nie musisz go definiować, co oznacza, że ​​możesz ogolić jeszcze kilka bajtów: 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="")działa.
plannapus
@plannapus Silly me! Dzięki jeszcze raz ! Zintegrowałem również b=seqczęść z korpusem głównym, więc jest jeszcze mniej czytelna!
Frédéric
2

R, 81 73 65 63 bajtów

Prosty for podejście do pętli. Powtórz alfabet 26 razy i przejdź przez przesuwany zakres indeksu, który jest obliczany za pomocą (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="")
Billywob
źródło
2

Łuska , 10 bajtów

Cİ1ṠṁK…"AZ

Wypróbuj online!

Wyjaśnienie

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
Lew
źródło
1

Partia, 123 bajty

@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%%
Neil
źródło
1

05AB1E , 18 17 bajtów

26FA26×N>n£NnF¦},

Wyjaśnienie

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

Wypróbuj online!

Emigna
źródło
1

Rexx, 74 72 bajty

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

Nie golfowany:

i=1
m=1
do 26
  say substr(copies(xrange('A','Z'),26),i,m)
  i=i+m
  m=m+2
end
aja
źródło
1

TSQL, 129 bajtów

USE MASTER na początku skryptu ma zapewnić, że zapytanie zostanie uruchomione w głównej bazie danych, która jest domyślna dla wielu użytkowników (nie licząc bajtów).

Gra w golfa:

USE MASTER

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

Nie golfowany:

USE MASTER

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

Skrzypce

Fiddle dla starszej wersji przy użyciu ścieżki xml

t-clausen.dk
źródło
1

PowerShell, 68 bajtów

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

Sekcja przed pierwszym średnikiem tworzy ciąg zawierający 26 kopii wielkich liter alfabetu. Następna sekcja wprowadza łamanie linii na indeks każdego numeru kwadratu (działa wstecz, więc nie muszę brać pod uwagę przesunięcia). Wreszcie, $ana końcu po prostu umieszcza zmienną łańcuchową w ekwiwalencie programu PowerShell STDOUT.

Ben N.
źródło
1

C, 60 bajtów

i;main(j){for(;j<27;j*j^++i||puts("",j++))putchar(i%26+65);}
xsot
źródło
putsbierze tylko jeden argument. (Niektóre niezdefiniowane zachowanie jest normalnie dozwolone w codegolf, ale jest to trochę za daleko poza zwykłe pasy)
MM
@MM Niezdefiniowane zachowanie jest cały czas wykorzystywane. Reguła jest taka, że ​​przesłanie jest ważne, dopóki działa w pewnym kompilatorze, w przeciwnym razie musielibyśmy wyraźnie wykluczyć długą listę wyjątków. Ten kod działa w gcc, więc jest to poprawne przesłanie.
xsot
1

C ++, 111 bajtów

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

Najpierw spróbuj jednego z nich. Używa int "c", aby zapisać, którą literę musi wydrukować w danym momencie. Gdy „c” minie 90 („Z”), resetuje się do 65 („A”). Drukuje piramidę za pomocą pętli.

limelier
źródło
Niezła odpowiedź! Możesz zrobić, if(c<92)c=65aby zdjąć jeden bajt, a int a()zamiast tego możesz to zrobić void a(), ale nie jestem pewien, czy to zadziała bez zwrotu. Poza tym myślę, że musisz uwzględnić #include <iostream>w swojej liczbie bajtów.
DJMcMayhem
Myślę, że miałeś na myśli if(c>90)c=65, ale dziękuję za sugestię, to dobry pomysł. Ponadto, chyba to uwzględnię, dzięki.
limelier
1

PHP, 76 69 bajtów

for(;$i<26&&$a.=join(range(A,Z));)echo substr($a,$i**2,1+2*$i++)."
";
  • Utwórz 26 alfabetów (więcej niż wystarczająco) i skontaktuj się z nimi w $ a
  • pętla dla i <26
  • wyświetl $ a substring początek i ^ 2, koniec 2 * i + 1
Crypto
źródło