Wygeneruj alfabet z 4 kopiami każdej litery

27

Pamiętaj, że to nie to samo, co Wydrukuj alfabet cztery razy .

To zadanie polega na napisaniu programu do generowania czterech kopii każdej litery alfabetu angielskiego, po jednej literze na wiersz, na standardowym wyjściu:

A
A
A
A
B
B
B
B

itp.

Wynik powinien zawierać znaki nowej linii po każdej literze.

Preferowane są wielkie litery bez dodatkowego wyjścia; jednak małe litery i / lub dodatkowe białe znaki są dopuszczalne, jeśli wielkie litery / striping wydłużyłyby twoje rozwiązanie.

Zredagowano, aby dodać : Rozwiązanie musi być wystarczająco kompletne, aby wykonać. Powinienem móc wywołać implementację języka, wkleić kod z odpowiedzi i uzyskać wyniki bez wpisywania dodatkowego kodu.

Powyższe pytanie kompletności pojawiło się w kontekście rozwiązania C. Czy na pewno musi istnieć stała zasada lub konwencja na stronie gry w golfa? Jeśli tak, chętnie skorzystam z wytycznych społeczności. Ale to jest moje zdanie:

  1. W szczególności w odniesieniu do C musisz uwzględnić (i policzyć) main(){... }wokół kodu, ponieważ inaczej nie skompiluje się. Ostrzeżenia, ponieważ nie ma nic #include <stdio.h>złego, dopóki kod się kompiluje. Ogólnie rzecz biorąc, skompilowany język wymaga kompilowalnej jednostki.

  2. Nagie wyrażenie dające pożądane wyniki jest dopuszczalne, jeśli istnieje sposób bezpośredniego wykonania wyrażenia; na przykład, jeśli język ma REPL. Możesz więc przesłać Haskell main=tak długo, jak faktycznie działa tak, jak napisano np. W ghcimonicie. Ponieważ jednak oznacza letto, że będziesz składać deklaracje, trzymanie się tego runhaskellformatu może być wygraną netto .

  3. Podobnie awkskrypty powinny znajdować się w blokach BEGIN(lub ENDprzy założeniu, że stdin jest dołączony /dev/null), ponieważ nie przetwarzamy żadnych danych wejściowych.

itp.

Mark Reed
źródło
4
Jestem trochę zdezorientowany. Czy wyzwaniem jest po prostu wypisywanie alfabetu z każdą literą powtarzaną czterokrotnie, czy też dane wyjściowe muszą być również przechowywane w pliku?
Iszi
Czy muszę wyprowadzać tylko alfabet?
Justin
@MarkReed Czy muszę drukować z nowymi liniami pomiędzy nimi? Dlaczego nie tylko wydrukować, ale opcjonalne nowe linie?
Justin
3
Polecam także przeformułować swoje wyzwanie, aby było bardziej jak wyzwanie, a mniej opowiadanie historii o tym, jak wymyśliłeś swoją odpowiedź.
Justin
Ostatni kawałek zamazuje białe znaki rządzą tylko odrobiną. Czy mógłbyś wyjaśnić? W szczególności, czy czytam to dobrze, aby zinterpretować, że dodatkowe białe znaki są w porządku, ale pominięcie nowych linii nie jest?
Iszi

Odpowiedzi:

16

APL (5)

⍪4/⎕A

Format macierzowy ( ) 4-replikacji ( 4/) alfabetu ( ⎕A).

marinus
źródło
1
Wydaje się mało prawdopodobne, aby zostać pobitym. :)
Mark Reed,
APL używa strony kodowej, która odwzorowuje każdy ze znaków, których używa, na jeden bajt. Tę stronę kodową można znaleźć tutaj, na stronie internetowej IBM.
Steven H.,
@StevenH. Link nie żyje
Stan Strum
@StanStrum Wierzę, że link jest martwy z powodu wycofania, ale ze względu na kodowanie w golfa ta meta odpowiedź powinna zadziałać.
Steven H.
11

Python - 37

for i in range(104):print chr(i/4+65)

izmienia się od 0 do 104; jest dzielony przez cztery i dodawany do wartości ascii dla A, a wynikowy znak jest drukowany.

Justin
źródło
Rozumiem, że Python domyślnie używa dzielenia liczb całkowitych? Byłoby miło, gdyby PowerShell zrobił to teraz. W tej chwili kod niezbędny do wymuszenia podziału na liczby całkowite jest zbyt długi, aby ta sztuczka pomogła mi zapisać cokolwiek w skrypcie.
Iszi
@lszi - Python bierze swój sygnał od typu operandów. 3/4wynosi 0, podczas gdy 3.0/4.0wynosi 0,75; range()generuje liczby całkowite.
Mark Reed,
1
To nie działa na nowszych wersjach Pythona. Po pierwsze, funkcja drukowania musi być wywoływana w nawiasach i / / nie wykonuje już domyślnie podziału na liczby całkowite (nawet jeśli obie liczby są liczbami całkowitymi), co jest zadaniem //. Spróbuj:for i in range(104):print(chr(i//4+65))
3
@ Świadomość wiem o tym. Celowo wybrałem starą wersję, aby można ją było lepiej grać w golfa. Jeśli miałbyś uruchomić to na Ideone.com, wybrałbyś „Python” zamiast „Python 3”
Justin
3
@ Świadomość - przez „nowsze wersje Pythona” masz na myśli „Python 3”, który w tym momencie nie jest powszechnie przyjęty. Ogólnie zakładam, że wszystko, co twierdzi, że jest „Python” bez określonej wersji, to Python 2.x, chyba że udowodniono inaczej; Kod w Pythonie 3 jest zazwyczaj tak wyraźnie oznaczony.
Mark Reed,
8

R, 30 28 27

write(rep(LETTERS,e=4),1,1)

Poprzednia wersja z 30 bajtami:

cat(rep(LETTERS,e=4),sep="\n")
Sven Hohenstein
źródło
Myślę, że dosłowna nowa linia jest o bajt krótsza :)
Giuseppe,
@Giuseppe Czy możesz określić ten pomysł?
Sven Hohenstein,
1
Wypróbuj online!
Giuseppe,
@Giuseppe Naprawdę dobry pomysł! Dzięki za wskazanie.
Sven Hohenstein
Możesz użyć 1zamiast, ""aby określić również stdout write, co oszczędza kolejny bajt.
Giuseppe,
7

C, 59

Podaję tę, niekonkurencyjnie długą odpowiedź, po prostu dlatego, że nie widzę jeszcze zgłoszenia C. I to mnie smuci. : - /

PÓŹNIEJ: Wspiera @moala za wykonanie int wersji „/ 4”, oszczędzając 13 znaków!

float i;main(){while(i<26)printf("%c\n",65+(int)i),i+=.25;}
Darren Stone
źródło
Zredagowałem swoją odpowiedź, teraz oszczędzając jeszcze 2 znaki!
moala
i kolejny!
moala
6

J: 18 13

4#u:65+i.26 1

Nadal jestem dość niepewny z J, więc prawdopodobnie można to poprawić

pswg
źródło
3
Można użyć replikacji ( #) zamiast podziału tak: 4#u:65+i.26 1. Ponadto ~zamienia argumenty funkcji, więc jeśli kiedykolwiek będziesz to robił (expression) F value, możesz zastąpić value F~ expressionto znakiem, aby zapisać znak.
marinus
@marinus Dzięki za wskazówkę. Wciąż uczę się J i ciężko jest znaleźć dobre informacje z tego rodzaju sztuczkami.
pswg
1
4#65{26,.\a.dla 12 bajtów.
FrownyFrog
5

Ruby, 23 lata

puts ([*?A..?Z]*4).sort

Podziękowania dla @manatwork - głosujcie na jego komentarz, a nie na to. :)

Darren Stone
źródło
Olbrzymi. @manatwork, dokonam edycji, ale oczywiście nie zasługuję na żadne uznanie!
Darren Stone,
5
Lepiej to zrób puts [*?A..?Z].map{|i|[i]*4}lub puts ([*?A..?Z]*4).sort, żeby litery były uporządkowane jak w przykładzie.
manatwork,
2
@manatwork: puts (?A..?Z).map{|i|[i]*4}jest postacią krótszą. Możesz zadzwonić mapbezpośrednio na Range, więc w tym przypadku nie potrzebujesz ikony.
Mark Reed,
5

PowerShell: 32 23

Kod do gry w golfa:

[char[]](65..90*4)|Sort

Przewodnik:

[char[]](... )pobiera tablicę obiektów i konwertuje je na znaki ASCII.
65..90to kody ASCII dla AZ.
*4powtarza serię 4 razy.
|Sortsortuje dane wyjściowe.

Uwaga:

Jeśli chcesz to zapisać do pliku, po prostu rzuć >, a następnie nazwę pliku na końcu.

Iszi
źródło
5

Haskell, 46

x a=a++a
main=putStr$['A'..'Z']>>=x.x.(:"\n")
MtnViewMark
źródło
1
putStr$['A'..'Z']>>=("golf">>).(:"\n")zapisuje 8 bitów
Angs
5

Befunge 98-18

1+::'g`#@_4/'A+,a,

Działa poprzez zapisywanie liczby i kończenie jej, gdy osiągnie 104. Drukuje odpowiedni znak alfabetu dla liczby podzielonej przez 4, a następnie nowej linii. Ale jeśli nie muszę dodawać nowego wiersza po każdej literze, to jest 16 znaków:

1+::'g`#@_4/'A+,

Można zmniejszyć, jeśli mogę wydrukować więcej znaków (tj. Wszystkie cztery razy) ( 7 6 znaków, nawet działa w Befunge 93):

1+:4/,

Z nową linią:

1+:4/,a,
Justin
źródło
4

GolfScript: 17 15 znaków

26,{65+...}%+n*
człowiek w pracy
źródło
4

Perl 5, 21

map{print"$_
"x4}A..Z
Dom Hastings
źródło
2
Nigdy nie przyszło mi do głowy, aby umieścić dosłownie nowy wiersz w cudzysłowie w Perlu. +1.
Mark Reed,
Powinienem zauważyć, że ja też nie, ale @manatwork wspomniał o tym w innej mojej odpowiedzi i utknęło!
Dom Hastings
4

C, 46 44 43

46 :

i;main(){while(i<104)printf("%c\n",65+i++/4);}

44 :

i=260;main(j){for(;(j=i++>>2)<91;puts(&j));}

44 też:

i=260;main(j){while(j=i++>>2,j<91)puts(&j);}

Dzięki @marinus, 43:

i=260;main(j){while(j=i++/4,j<91)puts(&j);}

Czy powinienem dodać nagrodę za dotarcie do 42? :)

moala
źródło
6
50 powtórzeń jest potrzebny do komentowania czegokolwiek, a masz 101 w chwili opublikowania tego komentarza.
syb0rg
Świetny! Dzięki! Odpowiedź edytowana!
moala
1
Można zastąpić >>2przez /4.
marinus
4

Java: 56

for(int i=0;i<104;)System.out.println((char)(i++/4+65));

edycja: zmieniono z „print” na „println”

reblerebel
źródło
Wynik powinien zawierać znaki nowej linii po każdej literze.
Pierre Arlaud,
dzięki za zwrócenie na to uwagi, za każdym razem powinien wypisać nową linię
reblerebel,
2
The solution must be complete enough to execute. I should be able to invoke an implementation of the language, paste the code from the answer, and get results, without typing any additional code. myślę, że twoje rozwiązanie narusza ten warunek
użytkownik902383
2
@ user902383 Jeśli wkleisz go do JShell (Java REPL w Javie 9), zadziała i nawet nie potrzebujesz końcowego średnika.
David Conrad,
@DavidConrad To niesamowite, więc myślę, że mógłbym zacząć używać REPL / JShell.
user902383,
4

Czwarty, 37

'h 0 [do] [i] 4 / 'A + emit cr [loop]
Darren Stone
źródło
35 bajtów , unikając +.
Bubbler,
4

Właściwie 6 bajtów

4ú*SÖi

Wypróbuj tutaj!

Wyjaśnienie

4ú*SÖi

4 *         Do 4 times
 ú          Create string of alphabet in lowercase
   S        Sort it
    Ö       Switch Case
     i      Push each character of string

4 bajty małymi literami i bez nowej linii:

4ú*S
Okład wilgotny z lekiem
źródło
1
Witamy w PPCG!
Erik the Outgolfer
4

16-bitowy kod maszynowy x86 MS-DOS COM, 25 bajtów

W hex:

B409BA160189D7B96800F6C1037502FE05CD21E2F5C3400A24

Jest to kompletny program MS-DOS .COM. Skopiuj sekwencję bajtów do pliku z rozszerzeniem .com i uruchom ją z DOSBox

Demontaż:

00: B4 09        mov    ah,0x09         ;INT 21h "Write string to STDOUT" function
02: BA 16 01     mov    dx,0x116        ;Address of the string s ('$'-terminated)
05: 89 D7        mov    di,dx           ;Because there's no way to dereference address in DX
07: B9 68 00     mov    cx,104          ;CX=26*4
_0000000A:
0A: F6 C1 03     test   cl,0x03         ;When lower two bits are zero...
0D: 75 02        jne    _00000011       ;...do not skip the next instruction
0F: FE 05        inc    b,[di]          ;*s++
_00000011:
11: CD 21        int    21              ;Print the string
13: E2 F5        loop   _0000000A       ;Until --CX==0
15: C3           retn
16: 40           db     0x40            ;s[0], starts with 'A'-1
17: 0A           db     0x0A            ;'\n'
18: 24           db     '$'             ;Terminator required by the print function
meden
źródło
3

BrainF * , 79 60

+++++++++++++[->++>+>+++++<<<]>>---<[->>>++++[-<.<.>>]<+<<]
AShelly
źródło
4
+++++++++++++[>+>+++++>++<<<-]>--->>[<.<.>.<.>.<.>.<.>+>-]
alephalpha
3

AWK, 48

Spróbujmy z AWK ...

END{s=65;for(i=104;i--;s+=0==i%4)printf"%c\n",s}

Jak sugeruje manatwork , możemy pozbyć się 2 znaków

AWK, 46 (Edytuj)

END{for(i=104;i--;s+=0==i%4)printf"%c\n",s+65}

AWK, 40 (edycja kodu MarkReeda )

END{for(;i<104;){printf"%c\n",i++/4+65}}
Czy byłem
źródło
Usuwając inicjalizacji zmiennych s można oszczędzić 2 znaki: END{for(i=104;i--;s+=0==i%4)printf"%c\n",s+65}.
manatwork
1
Umieszczenie kodu w ENDbloku oznacza, że ​​wymaga on strumienia wejściowego (nawet jeśli jest /dev/null) do działania. Czy to zmienia liczbę znaków? W każdym razie BEGIN{for(;++i<104;){printf"%c\n",i/4+65}}jest o 5 znaków krótszy.
Mark Reed,
@MarkReed Twój kod nie działa. Sprawdź to
Wasi
Nie. Tak blisko! :) Ale nadal nie podoba mi się ENDwymóg wzorca dla strumienia wejściowego ...
Mark Reed,
3

PowerShell, 21

65..90|%{,[char]$_*4}

Nieco inne podejście do Isziego. I krócej :-)

Joey
źródło
3

C # LINQ 115 bajtów 110 bajtów

Enumerable.Range(65, 26).SelectMany(i => Enumerable.Repeat(i,4))
.ToList().ForEach(i=> Console.WriteLine((char)i));
supermeerkat
źródło
1
Witamy w PPCG! Miły pierwszy post!
Rɪᴋᴇʀ
3

05AB1E, 6 bajtów

A4×{S»

Wyjaśnienie:

A       # Push 'abcdefghijklmnopqrstuvwxyz'
 4×     # Repeat four times
   {    # Sort
    S   # Split into list
     »  # Join by newlines
        # Implicit print

Bez nowego wiersza 4 bajty

A4×{

Wypróbuj online!

Oliver Ni
źródło
3

Galaretka , 5 bajtów (niekonkuruje?)

ØAx4Y

Wypróbuj online!

Wyjaśnienie:

ØAx4Y Main link
ØA    “ABCDEFGHIJKLMNOPQRSTUVWXYZ”
   4  4
  x   Repeat each element of x y times
    Y Join x with newlines
Erik the Outgolfer
źródło
3

Perl 6, 32

.say for (('A'..'Z') »xx»4)[*;*]
Mark Reed
źródło
Myślę, że po raz pierwszy Perl 6 był pierwszym rozwiązaniem, o którym myślałem, ale hiperoperator wydawał się po prostu naturalny.
Mark Reed,
3

Płótno , 5 bajtów

Z41*⟳

Wypróbuj tutaj!

Wyjaśnienie:
Code        | Explanation                                  | Stack
------------+----------------------------------------------+------------------------------
Z          | The uppercase alphabet                       | "ABC..."
  41*     | Stretched by 4 horizontally and 1 vertically | "AAAABBBBCCCC..."
        ⟳  | Rotated clockwise                            | "A¶A¶A¶A¶B¶B¶B¶B¶C¶C¶C¶C¶..."
            | Print ToS (implicit)                         |

Z zastąpiony \nprzy drukowaniu.

hakr14
źródło
3

Kotlin , 66 59 bajtów

Zaoszczędź 7 bajtów usuwając pętlę.

fun main(a:Array<String>){repeat(104){println('A'+(it/4))}}

Wypróbuj online!

JohnWells
źródło
3

pieprzenie mózgu , 48 bajtów

+++[[-<+>>++<]+>]<<<<<<+[->,++++[->.<<<.>>]>+<<]

Wypróbuj online!

Drukuje małymi literami, oddzielone znakami powrotu karetki. Używa owijania 8-bitowych komórek, a także komórek pozostawionych od początku, chociaż możesz dodać a, >aby przeciwdziałać temu ostatniemu.

Jo King
źródło
Właśnie miałem opublikować nowy, ale udało ci się całkowicie wyprzedzić moje starania, mam 71 bajtów z ++++++ [-> ++> ++++> ++++++++ ++ <<<] ++++> +> ++> +++++ <[->. <<. >>. <<. >>. <<. >>. + <<.>]
KrystosTheOverlord
2

Bash: 24 znaki

printf %s\\n {A..Z}{,,,}
człowiek w pracy
źródło
2

Dc: 35 znaków

[rdP10Pr1-d1<p]sp65[5lpx+d91>l]dslx
człowiek w pracy
źródło
2

Scala, 42

('A'to'Z')map(x=>List.fill(4)(println(x)))
pt2121
źródło
2

Julia, 39 , 36

println([char(i/4+64.5)for i=0:103])
Sven Hohenstein
źródło