Generar alfabeto con 4 copias de cada letra.


27

Tenga en cuenta que esto no es lo mismo que Imprimir el alfabeto cuatro veces .

Esta tarea es escribir un programa para generar cuatro copias de cada letra del alfabeto inglés, una letra por línea, en la salida estándar:

A
A
A
A
B
B
B
B

etc.

El resultado debe incluir nuevas líneas después de cada letra.

Se prefieren letras mayúsculas sin salida adicional; sin embargo, las letras minúsculas y / o los espacios en blanco adicionales son aceptables si las mayúsculas / despojo alargarían su solución.

EDITADO PARA AGREGAR: La solución debe ser lo suficientemente completa como para ejecutarse. Debería poder invocar una implementación del lenguaje, pegar el código de la respuesta y obtener resultados, sin escribir ningún código adicional.

La pregunta anterior de completitud surgió en el contexto de una solución C. ¿Seguramente debe haber una regla o convención permanente sobre esto en un sitio de golf de código? Si es así, con gusto cederé a las pautas de la comunidad. Pero esta es mi opinión:

  1. Con respecto a C específicamente, debe incluir (y contar) el main(){... }alrededor del código, ya que de lo contrario no se compilará. Las advertencias porque no hay #include <stdio.h>están bien siempre y cuando el código aún se compile. En general, un lenguaje compilado requiere una unidad compilable.

  2. Una expresión desnuda que produce los resultados deseados es aceptable si hay una manera de ejecutar la expresión directamente; por ejemplo, si el idioma tiene un REPL. Por lo tanto, puede enviar Haskell sin una main=, siempre y cuando realmente funcione como está escrito, por ejemplo, en el ghciindicador. Pero dado que eso significa poner letsus declaraciones, puede ser una ganancia neta quedarse con el runhaskellformato.

  3. Del mismo modo, los awkscripts deben estar en bloques BEGIN(o ENDcon el supuesto de que stdin está adjunto /dev/null) ya que no estamos procesando ninguna entrada.

etc.


44
Estoy un poco confundido ¿Es el desafío aquí solo dar salida al alfabeto con cada letra repetida cuatro veces, o la salida realmente necesita almacenarse también en un archivo?
Iszi

¿Y tengo que generar solo el alfabeto?
Justin

@ MarkReed ¿Necesito imprimirlo con líneas nuevas en el medio? ¿Por qué no solo imprimirlo, pero las líneas nuevas son opcionales?
Justin

3
Además, recomiendo reformular su desafío para que sea más como un desafío y menos como contar la historia de cómo inventó su respuesta.
Justin

El último bit enturbia las reglas del espacio en blanco solo un poco. ¿Podrías aclararlo por favor? En particular, ¿estoy leyendo bien para interpretar que los espacios en blanco adicionales están bien, pero la omisión de líneas nuevas no?
Iszi

Respuestas:


16

APL (5)

⍪4/⎕A

Formato matricial ( ) de 4 réplicas ( 4/) del alfabeto ( ⎕A).


1
Parece poco probable que lo golpeen. :)
Mark Reed


APL usa una página de códigos que asigna cada uno de los caracteres que usa a un byte. Esta página de códigos se puede encontrar aquí, en el sitio web de IBM.
Steven H.

@StevenH. Link está muerto
Stan Strum

@StanStrum Creo que el enlace está muerto debido a la depreciación, pero por el bien del código de golf, esta meta respuesta debería funcionar.
Steven H.

11

Python - 37

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

iva de 0 a 104; se divide entre cuatro y se agrega al valor ascii para A, y se imprime el carácter resultante.


¿Supongo que Python usa la división de enteros por defecto? Sería bueno si PowerShell lo hiciera ahora. Tal como está, el código necesario para forzarlo a la división de enteros es demasiado largo para que este truco me ayude a guardar algo en mi script.
Iszi

@lszi - Python toma su señal del tipo de operandos. 3/4es 0, mientras que 3.0/4.0es 0,75; range()genera enteros.
Mark Reed

1
Esto no funciona en versiones más recientes de python. Primero, la función de impresión debe llamarse entre paréntesis, y / ya no hace la división de enteros por defecto (incluso si ambos números son enteros), que es el trabajo de // Pruebe:for i in range(104):print(chr(i//4+65))

3
@ Conciencia lo sé. Deliberadamente elegí usar una versión antigua para poder jugar mejor. Si tuviera que ejecutar esto en Ideone.com, elegiría "Python" en lugar de "Python 3"
Justin

3
@Conciencia - por "versiones más nuevas de python", te refieres a "Python 3", que está lejos de ser universalmente adoptado en este momento. En general, supongo que cualquier cosa que afirme ser "Python" sin una versión especificada es Python 2.x hasta que se demuestre lo contrario; El código de Python 3 tiende a etiquetarse explícitamente.
Mark Reed


7

C, 59

Presento esto, una respuesta poco competitiva, simplemente porque todavía no veo una presentación en C. Y eso me pone triste. : - /

MÁS TARDE: ¡Apoya a @moala por hacer una versión int "/ 4" de esto, ahorrando 13 caracteres!

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

¡He editado mi respuesta, ahora ahorrando incluso 2 caracteres más!
moala

¡y otro!
moala

6

J: 18 13

4#u:65+i.26 1

Todavía estoy bastante tembloroso con J, por lo que esto probablemente podría mejorarse


3
Puede utilizar la réplica ( #) en lugar de la división, así: 4#u:65+i.26 1. Además, ~intercambia los argumentos de una función, por lo que si alguna vez te encuentras haciendo (expression) F valueeso, puedes reemplazarlo con value F~ expressionpara guardar un personaje.
marinus

@marinus Gracias por el consejo. Todavía estoy aprendiendo J y es difícil encontrar buena información con ese tipo de trucos.
pswg

1
4#65{26,.\a.por 12 bytes.
FrownyFrog

5

Ruby, 23

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

Todo el crédito a @manatwork - votó su comentario, no esto. :)


Enorme. @manatwork, haré la edición, ¡pero obviamente no merezco ningún crédito!
Darren Stone

55
Mejor hazlo puts [*?A..?Z].map{|i|[i]*4}o puts ([*?A..?Z]*4).sort, para que las letras se ordenen como en el ejemplo.
manatwork

2
@manatwork: puts (?A..?Z).map{|i|[i]*4}es un personaje más corto. Puede llamar mapdirectamente en un rango, por lo que no necesita el splat en este caso.
Mark Reed

5

PowerShell: 32 23

Código de golf:

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

Tutorial:

[char[]](... )toma una matriz de objetos y los convierte en caracteres ASCII.
65..90son los códigos ASCII para AZ.
*4repite la serie 4 veces.
|Sortordena la salida.

Nota:

Si desea que esto se escriba en un archivo, simplemente arroje >, seguido de un nombre de archivo, al final.


5

Haskell, 46

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

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

5

Befunge 98-18

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

Funciona almacenando un número y terminando cuando llega a 104. Imprime el carácter correspondiente del alfabeto para el número dividido por 4, seguido de una nueva línea. Pero si no necesito agregar una nueva línea después de cada letra, entonces son 16 caracteres:

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

Se puede reducir si puedo imprimir más caracteres (es decir, todos ellos cuatro veces) ( 7 6 caracteres, incluso funciona en Befunge 93):

1+:4/,

Con nueva línea:

1+:4/,a,


4

Perl 5, 21

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

2
Nunca se me ha ocurrido poner una nueva línea literal dentro de una cadena entre comillas dobles en Perl. +1.
Mark Reed

Debo señalar que yo tampoco, pero @manatwork lo mencionó en otra respuesta mía y está atascado.
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 también:

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

Gracias a @marinus, 43:

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

¿Debo agregar una recompensa por llegar a 42? :)


66
50 rep. es necesario para comentar cualquier cosa, y tienes 101 al momento de publicar este comentario.
syb0rg

¡Excelente! ¡Gracias! Respuesta editada!
moala

1
Puedes reemplazar >>2por /4.
marinus

4

Java: 56

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

editar: cambiado de 'print' a 'println'


El resultado debe incluir nuevas líneas después de cada letra.
Pierre Arlaud

gracias por señalarlo, debería imprimir una nueva línea cada vez ahora
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. Creo que su solución viola esta condición
user902383

2
@ user902383 Si lo pega en JShell (Java REPL en Java 9) funciona, y ni siquiera necesita el punto y coma final.
David Conrad

@DavidConrad Es increíble entonces, creo que podría comenzar a usar REPL / JShell.
user902383


4

En realidad, 6 bytes

4ú*SÖi

Pruébalo aquí!

Explicación

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 bytes con minúsculas y sin nueva línea:

4ú*S

1
Bienvenido a PPCG!
Erik the Outgolfer

4

Código de máquina x86 de 16 bits COM de MS-DOS, 25 bytes

En hexadecimal:

B409BA160189D7B96800F6C1037502FE05CD21E2F5C3400A24

Este es un programa completo de MS-DOS .COM. Copie la secuencia de bytes al archivo con extensión .com y ejecútelo desde DOSBox

Desmontaje

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

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

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

3

AWK, 48

Vamos a probarlo con AWK ...

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

Como sugiere manatwork , podemos deshacernos de 2 caracteres

AWK, 46 (Editar)

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

AWK, 40 (editando el código de MarkReed )

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

Mediante la eliminación de la inicialización de variables s le sobran 2 caracteres: END{for(i=104;i--;s+=0==i%4)printf"%c\n",s+65}.
manatwork

1
Poner el código en un ENDbloque significa que requiere una secuencia de entrada (incluso si es /dev/null) para funcionar. ¿Eso modifica el recuento de caracteres? De todos modos, BEGIN{for(;++i<104;){printf"%c\n",i/4+65}}es 5 caracteres más corto.
Mark Reed

@ MarkReed Su código no funciona. Mira esto
Wasi

D'oh ¡Tan cerca! :) Pero todavía no me gusta el ENDrequisito del patrón para una secuencia de entrada ...
Mark Reed

3

PowerShell, 21

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

Un enfoque ligeramente diferente al de Iszi. Y más corto :-)


3

C # LINQ 115 Bytes 110 Bytes

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

1
Bienvenido a PPCG! Bonito primer post!
Rɪᴋᴇʀ

3

05AB1E, 6 bytes

A4×{S»

Explicación:

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

Sin saltos de línea, 4 bytes

A4×{

Pruébalo en línea!



3

Perl 6, 32

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

Creo que esta es la primera vez que Perl 6 fue la primera solución que pensé, pero el hiperoperador parecía un ajuste natural.
Mark Reed

3

Lienzo , 5 bytes.

Z41*⟳

Pruébalo aquí!

Explicación:
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)                         |

Con reemplazado por \nal imprimir.



3

brainfuck , 48 bytes

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

Pruébalo en línea!

Imprime en minúsculas, separadas por retornos de carro. Utiliza envolver celdas de 8 bits y celdas a la izquierda del origen, aunque puede anteponer a >para contrarrestar la última.


Estaba a punto de publicar uno nuevo, pero lograste superar mi mejor esfuerzo, obtuve 71 bytes con ++++++ [-> ++> ++++> ++++++++ ++ <<<] ++++> +> ++> +++++ <[->. <<. >>. <<. >>. <<. >>. + <<.>]
KrystosTheOverlord



2

Scala, 42

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.