Générez l'alphabet avec 4 copies de chaque lettre


27

Notez que ce n'est pas la même chose que Imprimer l'alphabet quatre fois .

Cette tâche consiste à écrire un programme pour générer quatre copies de chaque lettre de l'alphabet anglais, une lettre par ligne, sur la sortie standard:

A
A
A
A
B
B
B
B

etc.

La sortie doit inclure des retours à la ligne après chaque lettre.

Les lettres majuscules sans sortie supplémentaire sont préférées; cependant, les lettres minuscules et / ou les espaces blancs supplémentaires sont acceptables si la mise en majuscule / suppression allongerait votre solution.

MODIFIÉ POUR AJOUTER: La solution doit être suffisamment complète pour être exécutée. Je devrais pouvoir invoquer une implémentation de la langue, coller le code de la réponse et obtenir des résultats, sans taper de code supplémentaire.

La question ci-dessus de l'exhaustivité s'est posée dans le contexte d'une solution C. Il doit sûrement y avoir une règle ou une convention permanente à ce sujet sur un site de golf à code? Si c'est le cas, je me plierai volontiers aux directives de la communauté. Mais c'est mon point de vue:

  1. En ce qui concerne spécifiquement C, vous devez inclure (et compter) le main(){... }autour du code, car il ne compilera pas autrement. Les avertissements car il n'y a pas de #include <stdio.h>problème tant que le code compile toujours. En général, un langage compilé nécessite une unité compilable.

  2. Une expression nue qui donne les résultats souhaités est acceptable s'il existe un moyen d'exécuter directement l'expression; par exemple, si la langue a un REPL. Vous pouvez donc soumettre Haskell sans un main=tant qu'il fonctionne réellement comme écrit, par exemple à l' ghciinvite. Mais puisque cela signifie mettre letvos déclarations, ce peut être une victoire nette de s'en tenir au runhaskellformat.

  3. De même, les awkscripts doivent être dans BEGIN(ou END, avec l'hypothèse que stdin est attaché à /dev/null) des blocs car nous ne traitons aucune entrée.

etc.


4
Je suis un peu confus. Le défi ici est-il simplement de sortir l'alphabet avec chaque lettre répétée quatre fois, ou la sortie doit-elle également être stockée dans un fichier?
Iszi

Et dois-je sortir uniquement l'alphabet?
Justin

@MarkReed Dois-je l'imprimer avec des retours à la ligne entre les deux? Pourquoi ne pas simplement l'imprimer, mais des retours à la ligne en option?
Justin

3
Aussi, je vous recommande de reformuler votre défi afin qu'il ressemble plus à un défi et moins comme racontant l'histoire de la façon dont vous avez inventé votre réponse.
Justin

Le dernier bit brouille les règles des espaces blancs juste un peu. Pourriez-vous clarifier? En particulier, est-ce que je lis bien pour interpréter que les espaces supplémentaires sont corrects, mais l'omission de nouvelles lignes n'est pas?
Iszi

Réponses:


16

APL (5)

⍪4/⎕A

Format matriciel ( ) de 4 réplications ( 4/) de l'alphabet ( ⎕A).


1
Semble peu susceptible d'être battu. :)
Mark Reed


APL utilise une page de codes qui mappe chacun des caractères qu'il utilise sur un octet. Cette page de codes se trouve ici, sur le site Web d'IBM.
Steven H.

@StevenH. Link is dead
Stan Strum

@StanStrum Je crois que le lien est mort à cause de la dépréciation, mais pour le plaisir de jouer au code, cette méta-réponse devrait fonctionner.
Steven H.

11

Python - 37

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

iva de 0 à 104; il est divisé par quatre et ajouté à la valeur ascii pour A, et le caractère résultant est imprimé.


Je suppose que Python utilise la division entière par défaut? Ce serait plutôt bien si PowerShell le faisait maintenant. En l'état, le code nécessaire pour le forcer en division entière est trop long pour que cette astuce m'aide à enregistrer quoi que ce soit sur mon script.
Iszi

@lszi - Python s'inspire du type des opérandes. 3/4est 0, tandis que 3.0/4.0est 0,75; range()génère des entiers.
Mark Reed

1
Cela ne fonctionne pas sur les nouvelles versions de python. Tout d'abord, la fonction d'impression doit être appelée avec des crochets, et / ne fait plus la division entière par défaut (même si les deux nombres sont des nombres entiers), ce qui est le travail de // Essayez:for i in range(104):print(chr(i//4+65))

3
@Conscience, je le sais. J'ai délibérément choisi d'utiliser une ancienne version pour mieux la jouer au golf. Si vous deviez exécuter ceci sur Ideone.com, vous choisiriez "Python" au lieu de "Python 3"
Justin

3
@Conscience - par "nouvelles versions de python", vous faites référence à "Python 3", qui est loin d'être universellement adopté à ce stade. Je suppose généralement que tout ce qui prétend être "Python" sans une version spécifiée est Python 2.x jusqu'à preuve du contraire; Le code Python 3 a tendance à être explicitement étiqueté ainsi.
Mark Reed

8

R, 30 28 27

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

Ancienne version avec 30 octets:

cat(rep(LETTERS,e=4),sep="\n")

Je pense qu'une nouvelle ligne littérale est un octet plus court :)
Giuseppe

@Giuseppe Pouvez-vous préciser cette idée?
Sven Hohenstein


@Giuseppe Vraiment une bonne idée! Merci d'avoir souligné.
Sven Hohenstein

Vous pouvez également utiliser 1au lieu de ""pour spécifier stdout dans write, ce qui enregistre un autre octet.
Giuseppe

7

C, 59

Je soumets ceci, une réponse non compétitive, simplement parce que je ne vois pas encore de soumission C. Et cela me rend triste. : - /

PLUS TARD: Props à @moala pour avoir fait une version int "/ 4" de ceci, économisant 13 caractères!

float i;main(){while(i<26)printf("%c\n",65+(int)i),i+=.25;}

J'ai édité ma réponse, enregistrant maintenant encore 2 caractères supplémentaires!
moala

et un autre!
moala

6

J: 18 13

4#u:65+i.26 1

Je suis encore assez fragile avec J, donc cela pourrait probablement être amélioré


3
Vous pouvez utiliser replicate ( #) au lieu de la division comme ceci: 4#u:65+i.26 1. En outre, ~permute les arguments d'une fonction, donc si jamais vous vous trouvez en train de le faire (expression) F value, vous pouvez le remplacer par value F~ expressionpour enregistrer un caractère.
marinus

@marinus Merci pour le conseil. J'apprends toujours J et il est difficile de trouver de bonnes informations avec ce genre de trucs.
pswg

1
4#65{26,.\a.pour 12 octets.
FrownyFrog

5

Rubis, 23

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

Tout le crédit à @manatwork - voter pour son commentaire, pas celui-ci. :)


Énorme. @manatwork, je ferai le montage mais évidemment je ne mérite aucun crédit!
Darren Stone

5
Mieux vaut le faire puts [*?A..?Z].map{|i|[i]*4}ou alors puts ([*?A..?Z]*4).sort, les lettres sont ordonnées comme dans l'exemple.
manatwork

2
@manatwork: puts (?A..?Z).map{|i|[i]*4}est un caractère plus court. Vous pouvez appeler mapdirectement sur une plage, vous n'avez donc pas besoin du splat dans ce cas.
Mark Reed

5

PowerShell: 32 23

Code golf:

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

Procédure pas à pas:

[char[]](... )prend un tableau d'objets et les convertit en caractères ASCII.
65..90sont les codes ASCII pour AZ.
*4répète la série 4 fois.
|Sorttrie la sortie.

Remarque:

Si vous voulez que cela soit écrit dans un fichier, jetez simplement >, suivi d'un nom de fichier, à la fin.


5

Haskell, 46

x a=a++a
main=putStr$['A'..'Z']>>=x.x.(:"\n")

1
putStr$['A'..'Z']>>=("golf">>).(:"\n")enregistre 8 bits
Angs

5

Befunge 98-18

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

Fonctionne en stockant un nombre et en terminant quand il atteint 104. Imprime le caractère correspondant de l'alphabet pour le nombre divisé par 4, suivi d'une nouvelle ligne. Mais si je n'ai pas besoin d'ajouter une nouvelle ligne après chaque lettre, alors c'est 16 caractères:

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

Peut être réduit si je peux imprimer plus de personnages (c'est-à-dire tous quatre fois) ( 7 6 caractères, fonctionne même dans Befunge 93):

1+:4/,

Avec newline:

1+:4/,a,


4

Perl 5, 21

map{print"$_
"x4}A..Z

2
Il ne m'est jamais venu à l'esprit de mettre un saut de ligne littéral dans une chaîne entre guillemets doubles en Perl. +1.
Mark Reed

Je devrais noter que je ne l'ai pas fait non plus, mais @manatwork l'a mentionné dans une autre de mes réponses et c'est coincé!
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 aussi:

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

Merci à @marinus, 43 ans:

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

Dois-je ajouter une prime pour arriver à 42? :)


6
50 rep. est nécessaire pour commenter quoi que ce soit, et vous en avez 101 au moment de publier ce commentaire.
syb0rg

Génial! Merci! Réponse modifiée!
moala

1
Vous pouvez remplacer >>2par /4.
marinus

4

Java: 56

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

edit: changé de 'print' en 'println'


La sortie doit inclure des retours à la ligne après chaque lettre.
Pierre Arlaud

merci de l'avoir signalé, il devrait imprimer une nouvelle ligne à chaque fois maintenant
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. Je pense que votre solution viole cette condition
user902383

2
@ user902383 Si vous le collez dans JShell (Java REPL dans Java 9), cela fonctionne, et vous n'avez même pas besoin du point-virgule final.
David Conrad

@DavidConrad C'est génial alors, je pense que je pourrais commencer à utiliser REPL / JShell.
user902383


4

En fait, 6 octets

4ú*SÖi

Essayez-le ici!

Explication

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 octets en minuscules et sans nouvelle ligne:

4ú*S

1
Bienvenue chez PPCG!
Erik the Outgolfer

4

Code machine MS-DOS 16 bits x86 COM, 25 octets

En hex:

B409BA160189D7B96800F6C1037502FE05CD21E2F5C3400A24

Il s'agit d'un programme MS-DOS .COM complet. Copiez la séquence d'octets dans le fichier avec l'extension .com et exécutez-la à partir de DOSBox

Démontage:

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

3

BrainF * , 79 60

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

4
+++++++++++++[>+>+++++>++<<<-]>--->>[<.<.>.<.>.<.>.<.>+>-]
alephalpha

3

AWK, 48

Essayons avec AWK ...

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

Comme suggéré par manatwork, nous pouvons nous débarrasser de 2 caractères

AWK, 46 (modifier)

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

AWK, 40 (modification du code de MarkReed )

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

En supprimant l'initialisation de s variables que vous pouvez épargner 2 caractères: END{for(i=104;i--;s+=0==i%4)printf"%c\n",s+65}.
manatwork

1
Mettre le code dans un ENDbloc signifie qu'il nécessite un flux d'entrée (même s'il est /dev/null) pour fonctionner. Est-ce que cela modifie le nombre de caractères? Quoi qu'il en soit, BEGIN{for(;++i<104;){printf"%c\n",i/4+65}}est 5 caractères plus court.
Mark Reed

@MarkReed Votre code ne fonctionne pas. Vérifiez cela
Wasi

D'oh. Si proche! :) Mais je n'aime toujours pas l' ENDexigence du modèle pour un flux d'entrée ...
Mark Reed

3

PowerShell, 21

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

Une approche légèrement différente de celle d'Iszi. Et plus court :-)


3

C # LINQ 115 octets 110 octets

Enumerable.Range(65, 26).SelectMany(i => Enumerable.Repeat(i,4))
.ToList().ForEach(i=> Console.WriteLine((char)i));

1
Bienvenue chez PPCG! Bon premier post!
Rɪᴋᴇʀ

3

05AB1E, 6 octets

A4×{S»

Explication:

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

Sans nouvelle ligne, 4 octets

A4×{

Essayez-le en ligne!



3

Perl 6, 32

.say for (('A'..'Z') »xx»4)[*;*]

Je pense que c'est la première fois que Perl 6 était la première solution à laquelle j'ai pensé, mais l'hyperopérateur semblait juste un ajustement naturel.
Mark Reed

3

Canevas , 5 octets

Z41*⟳

Essayez-le ici!

Explication:
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)                         |

Avec remplacé par \nlors de l'impression.



3

brainfuck , 48 octets

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

Essayez-le en ligne!

Imprime en minuscules, séparés par des retours chariot. Utilise le wrapping de cellules 8 bits ainsi que les cellules restantes de l'origine, bien que vous puissiez ajouter un >pour contrer ce dernier.


J'étais sur le point d'en publier un nouveau, mais vous avez réussi à faire de mon mieux, j'ai obtenu 71 octets avec ++++++ [-> ++> ++++> ++++++++ ++ <<<] ++++> +> ++> +++++ <[->. <<. >>. <<. >>. <<. >>. + <<.>]
KrystosTheOverlord



2

Scala, 42

('A'to'Z')map(x=>List.fill(4)(println(x)))

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.