Ahora que conozco mi ABC, ¿no quieres venir a jugar conmigo?

46

Escriba un programa o función que genere este texto exacto, sin distinción entre mayúsculas y minúsculas:

A, B, C, D, E, F, G,
H, I, J, K, L, M, N, O, P,
Q, R, S,
T, U, V,
W, X, Y, Z.

(Basado en la canción del alfabeto que muchos niños estadounidenses aprenden a memorizar el alfabeto, aunque editado para mayor compresibilidad).

El resultado debe verse exactamente igual que el anterior (de nuevo, sin distinción entre mayúsculas y minúsculas), pero puede contener espacios finales en cada línea y / o nuevas líneas finales. Observe el período al final.

Este es el código de golf, por lo que gana el código más corto en bytes.

ETHproducciones
fuente
44
Para expresiones regulares lenguajes basados consideran una búsqueda hacia delante 0 ancho .../(?=[HQTW])/
Magia pulpo Urna
29
Pensé que era H, I, J, K, LMNO, P?
Restablece a Monica el
77
¿No debería terminar la última línea con "Y y Z"?
KM.
@KM. Esto se discutió en el sandbox , y decidimos seguir con esta versión para que el desafío sea menos complicado.
ETHproductions
66
El golf parece aburrido. Cricket es mejor.
Manoj Kumar

Respuestas:

15

Vim, 42 , 40 pulsaciones de teclas / bytes

:h<_<cr>jjYZZP:s/./&, /g<cr>7f r<cr>9;.3;.3;.$ch.

Gracias a Lynn y su increíble respuesta vim por el consejo para obtener el alfabeto de la ayuda.

¡Gracias a RomanGräf por guardar dos bytes!

Explicación:

:h<_<cr>                                      " Open up vim-help
        jj                                    " Move down two lines
          Y                                   " Yank this line (containing the alphabet)
           ZZ                                 " Close this buffer
             P                                " Paste the line we just yanked
              :s/./&, /g<cr>                  " Replace every character with that character followed by a comma and a space
                            7f                " Find the seven space on this line
                               r<cr>          " And replace it with a newline
                                    9;        " Repeat the last search (space) 9 times
                                      .       " Repeat the last edit (replace with a newline)
                                       3;     " Third space
                                         .    " Replace with newline
                                          3;  " Third space
                                            . " Replace with newline

Luego, movemos el final de la línea con $, cambiamos un carácter con che insertamos un punto.

DJMcMayhem
fuente
2
No debes convertir a mayúsculas. El OP dijo "este texto exacto, sin distinción entre mayúsculas y minúsculas".
Roman Gräf
@ RomanGräf Gracias por la sugerencia!
DJMcMayhem
¡Decir ah! ¡Obtener el alfabeto de vim help es genial! ¿Sabía eso o lo buscó para este desafío?
Christian Rondeau
3
@christianRondeau No se me ocurrió. Lynn lo hizo en esta respuesta
DJMcMayhem
@ RomanGräf +1 por usar mustn't
FantaC
12

05AB1E , 16 bytes

Código

A',â79334S£»¨'.J

Explicación:

A                  # Push the alphabet.
 ',â               # Cartesian product with ','.
    79334S         # Push [7, 9, 3, 3, 4].
          £        # Contigious substring, pushes the substrings [0:7], [7:7+9], 
                     [7+9:7+9+3], [7+9+3:7+9+3+3], [7+9+3+3:7+9+3+3+4].
           »       # Gridify, join the inner arrays with spaces and join those arrays
                     with newlines.
            ¨      # Remove the last character.
             '.J   # Append a '.'-character.

Utiliza la codificación CP-1252 . Pruébalo en línea!

Adnan
fuente
11

Bash + utilidades GNU, 36

  • 5 bytes guardados gracias a Neil.
echo {A..Y}, Z.|sed 's/[HQTW]/\n&/g'

Ideona

Trauma digital
fuente
2
¿Por qué no solo echo {A..Y}, Z.|sed 's/[HQTW]/\n&/g'?
Neil
@Neil Ooh muy bien! ¡Gracias!
Trauma digital
11

JavaScript (ES6), 66 65 bytes

Vencer a @Neil era imposible ... Por eso lo hice. :-)

f=(i=10)=>i>34?"z.":i.toString(++i)+","+` 
`[9568512>>i-9&1]+f(i)

Golfé 1 byte gracias a un truco de @LevelRiverSt . El uso String.fromCharCodees de 7 bytes más:

f=(i=65)=>i>89?"Z.":String.fromCharCode(i,44,i%86%83%80%71?32:10)+f(i+1)

Cómo funciona

Esto genera de forma recursiva cada carácter del alfabeto de aa y, usando .toString(). Se agrega una coma después de cada letra, más una nueva línea si 9568512>>i-9&1es 1, o un espacio en caso contrario. Cuando la recursividad pasa de 34, es decir z, a , la función simplemente regresa "z.".

ETHproducciones
fuente
Espera, ¿cómo funciona esto? ¿Explicación, por favor? : 3
Downgoat
10

Python 2.7, 67 66 63 bytes

a=65;exec"print'%c'%a+',.'[a>89]+'\\n'[a%42%39%9^2:],;a+=1;"*26

Dennis guardó un byte.

Lynn
fuente
Usar en execlugar de fordebería guardar un byte.
Dennis
6

Jalea , 19 18 bytes

ØAp”,ṁ79334DR¤GṖ”.

¡Gracias a @Adnan por jugar golf en 1 byte!

Pruébalo en línea!

Cómo funciona

ØAp”,ṁ79334DR¤GṖ”.  Main link. No arguments.

ØA                  Yield "ABCDEFGHIJKLMNOPQRSTUVWXYZ".
  p”,               Cartesian product with ','; append a comma to each letter.
             ¤      Combine the two links to the left into a niladic chain.
      79334D          Decimal; yield [7, 9, 3, 3, 4].
            R         Range; yield [[1, 2, 3, 4, 5, 6, 7], ..., [1, 2, 3, 4]].
     ṁ              Mold; reshape the array of letters with commata like the
                    generated 2D array.
              G     Grid; separate rows by spaces, columns by linefeeds.
               Ṗ    Pop; discard the last comma.
                ”.  Print the previous result and set the return value to '.'.
                     (implicit) Print the return value.
Dennis
fuente
11
31 segundos? Dang ...
ETHproductions
5

JavaScript (ES6), 80 74 bytes

_=>[...`ABCDEFGHIJKLMNOPQRSTUVWXYZ`].join`, `.replace(/[HQTW]/g,`
$&`)+`.`

Probablemente sea posible acortar esto con atob / btoa si puede averiguar cómo usar la codificación ISO-8859-1. Editar: guardado 6 bytes gracias a @RickHitchcock.

Neil
fuente
1
@RickHitchcock Sí, me di cuenta de eso después de leer la respuesta de PHP.
Neil
@RickHitchcock ¿Querías .join`, `? Ponga barras diagonales inversas antes de las comillas. (Sí, la rebaja de comentarios es diferente, suspiro ...)
Neil
5

Pyke, 23 19 17 bytes

G\,J\.+2cu  /P

Pruébalo aquí!

G\,J\.+        -    ",".join(alphabet)+"."
       2c      -   split(^, size=2)
            /  -  split_sized(^, V)
         u     -   yield list [7,9,3,3] (actual bytes `u%04%07%09%03%03`)
             P - print(^)
Azul
fuente
5

R, 83 71 bytes

a=rbind(LETTERS[-26],","," ");a[3,7+3*c(0,3:5)]="\n";cat(a,"Z.",sep="")

Pruébalo en línea!

Hace una matriz de 3 filas (una con las letras, una con las comas y la otra con un espacio o una nueva línea).

Editar : Gracias Billywob!

plannapus
fuente
cat(a,sep="")guarda algunos bytes:a=rbind(LETTERS,","," ");a[3,7+3*c(0,3:5)]="\n";cat(a[,-26],"Z.",sep="")
Billywob
¡Gracias! Eso ayudó mucho! El uso de [-26]on LETTERSguarda directamente otro byte.
plannapus
4

CJam, 26 bytes

'A79333Ab{{',S2$)}*N\}/'.@

Intérprete en línea

'A                             Push 'A'
  79333Ab                      Push [7 9 3 3 3]
         {           }/        For each number n in the previous array...
          {      }*              Execute n times...
           ',S                     Push a comma and a space
              2$)                  Copy last letter and increment
                   N\            Place a newline under the letter on top
                       '.@     Push '.' and rotate
Sp3000
fuente
4

Brainfuck, 117 bytes

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

Cada una de las primeras cuatro líneas tiene un espacio final, y el programa asume celdas de 8 bits. Pruébalo en línea!

(Manejar la última línea es complicado ...)

Sp3000
fuente
4

Perl, 37 bytes

Créditos a @Dom Hastings para esta solución (3 bytes más cortos que los míos, ver más abajo).

say+(map"$_, ".$/x/[GPSV]/,A..Y),"Z."

Ejecutar con -E(o -M5.010) bandera:

perl -E 'say+(map"$_, ".$/x/[GPSV]/,A..Y),"Z."'

Mi versión anterior, 3 bytes más (total de 40 bytes):

perl -E '$_=join", ",A..Z;s/[HQTW]/\n$&/g;say"$_."'
Dada
fuente
1
Enfoque ligeramente diferente (todavía usa la expresión regular ...) para 37 bytes:say+(map"$_, ".$/x/[GPSV]/,A..Y),"Z."
Dom Hastings
@DomHastings Buen uno, bien hecho. ¡Y es más hermoso tener una declaración en lugar de tres! ;-)
Dada
4

JavaScript (ES6), 66 64 bytes

_=>`ABCDEFG
HIJKLMNOP
QRS
TUV
WXY`.replace(/./g,"$&, ")+"Z."

Regex coincide con los caracteres pero no con los retornos de carro, por lo que, usando el reemplazo de expresiones regulares, puedo agregar el "," a cada carácter.

Editar: se eliminaron 2 caracteres gracias a ETHProductions

Grax32
fuente
1
No tengo idea de por qué los otros golfistas de JS no buscaron esta solución primero. Aquí, ten un voto a favor.
Mama Fun Roll
1
Dang, linda! Creo que puedes eliminar los parens en la expresión regular si cambias $1a $&.
ETHproductions
3

Cheddar, 70 bytes

->[65@"71,72@"80,"QRS","TUV","WXYZ"].map(@.chars.join(", ")).vfuse+'.'

Parece que no se está acortando más que esto. He hecho otras versiones de esto que usan métodos bastante interesantes, pero esto es más corto

Pruébalo en línea!

Explicación

->                        // Function with no arguments
  [                       // Array, each item represents a line
   65@"71,                // See below on what @" does
   72@"80,
   "QRS",
   "TUV",
   "WXYZ"
  ].map(                  // On each item...
    @.chars.join(", ")    // Join the characters on ", "
  ).vfuse                 // Vertical fuse or join by newlines
  + '.'                   // The period at the end

El @"operador se utiliza para generar cadenas a distancia. Genera una cadena que comienza desde el código de caracteres izquierdo al código de caracteres derecho.

Por ejemplo, 65es el código char para Ay 90para Z. Hacerlo 65 @" 90generaría de la A a la Z o el alfabeto.

Downgoat
fuente
3

C, 112 102 81 bytes

Gracias a cleblanc y LevelRiverSt!

i,c;main(){for(c=64;++c<91;)printf("%c%c%c",c,44+c/90*2,c=="‌​GPSVZ"[i]?++i,10:32)‌​;}
musaritmia
fuente
Buena solución puede guardar algunos bytes, ya que 44 es 1 menos que ',' y 46 1 menos que '.'
cleblanc
No hay necesidad de declarar int y también puedes hacer entradas implícitas, esto es solo 101 bytesi,c,d;main(){for(c=65;c<91;++c){if(c-"GPSVZ"[i])d=32;else d=10,++i;printf("%c%c%c",c,c-90?44:46,d);}}
cleblanc
Usted puede obtener este enfoque hasta 82 bytes: i,c;main(){for(c=64;++c<91;)printf("%c%c%c",c,44+c/90*2,c=="GPSVZ"[i]?++i,10:32);}. Tenga en cuenta que puede pegar absolutamente cualquier cosa entre ?:un operador ternario, incluso varias expresiones separadas por comas (se evalúa como la última).
Level River St
3

Brainfuck, 157 bytes

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

Pruébalo en línea

gtwebb
fuente
3

Ruby, 56 54 bytes

$><<(?A..?Y).map{|c|c+('GPSV'[c]?",
":", ")}.join+"Z."

La primera línea termina con una nueva línea literal.

Editar: guardado dos bytes reemplazando 'A'..'Y'con ?A..?Y.

pgks
fuente
3

Vim, 32 bytes

26o<C-V><C-V>64,<Esc>r.V{g<C-A>8Jj9Jj3Jj.j4JcH<C-R>"

Deja una línea en blanco al final, lo que estaba permitido, pero es extraño ser tan torpe. Peor aún, estoy terminando en modo de inserción. He visto a otras personas hacerlo aquí, ¿así que supongo que está permitido? Se siente sucio

  • 26o<C-V><C-V>64,<Esc>: El primero <C-V>hace que el segundo se inserte literalmente. Los <C-V>64mensajes que esto deja en el búfer se convertirán en puntos de código ASCII y luego en letras. Comas ya en.
  • r.: Nunca volveré a estar al final, así que hazlo .ahora.
  • V{g<C-A>: Utiliza el incremento visual para convertir todos los 64s en los puntos de código ASCII de las letras mayúsculas.
  • 8Jj9Jj3Jj.j4J: La línea arbitraria se une. El primero es en 8Jlugar de 7Jporque estamos lidiando con la línea en blanco. Los 3Js repetidos son elegibles para una repetición de puntos.
  • cH<C-R>": Las personas generalmente piensan i<C-R>como un modo de inserción pegar, pero es más como una macro de modo de inserción. Las cosas como <C-V>65se ejecutarán como si estuvieran escritas e interpretadas como un punto de código decimal. Esto deja una línea adicional (permitida) al final y permanece en modo de inserción.
udioica
fuente
44
Si tienes un problema con una política (o falta de ella), tómala en meta, no en una respuesta.
Mego
2

PowerShell v3 +, 60 78 67 bytes

-join(65..90|%{[char]$_+'.,'[$_-le89]+" "+"`n"*($_-in71,80,83,86)})

OKAY. Esta vez he leído, entendido y seguido las especificaciones. Promesa. :RE

Toma la matriz 65..90y recorre cada elemento |%{...}. Cada iteración, estamos construyendo una nueva cadena usando concatenación, indexación y multiplicación.

Primero, tomamos el número actual y lo charemitimos para convertirlo en una letra ASCII. Eso se concatena con otro carácter, basado en la indexación en la cadena '.,'si estamos 90o no (es decir, para tener en cuenta Z.mientras todo el resto son comas). Esa es una cadena concatenada " "para separar las letras en el espacio y la multiplicación de cadenas "`n"basada en el valor booleano para determinar si el elemento actual es -inla matriz especificada (es decir, si necesitamos concatenar en un carácter de nueva línea). La cadena resultante se deja en la tubería.

Esas cadenas se encapsulan en parens y se -joineditan juntas en una nueva cadena, que luego también se deja en la tubería e implícita Write-Outputal final imprime el resultado. Como tenemos `nen la cadena, se convierte automáticamente en nuevas líneas al imprimir.

Requiere v3 + para el -inoperador. Tiene un espacio final en cada línea, lo cual está bien según las especificaciones del desafío.

Ejemplo

PS C:\Tools\Scripts\golfing> .\now-i-know-my-abc.ps1
A, B, C, D, E, F, G, 
H, I, J, K, L, M, N, O, P, 
Q, R, S, 
T, U, V, 
W, X, Y, Z. 
AdmBorkBork
fuente
1
Falta el período al final.
Downgoat
¿No debería haber una coma al final de las primeras cuatro líneas?
Neil
@Neil Buena salsa. Voy a eliminar esto hasta que pueda entender la especificación.
AdmBorkBork
2

PHP, 62 bytes

<?=preg_filter("# ([HQTW])#","\n$1",join(", ",range(A,Z)));?>.

solo para comparación 87 Bytes

<?="A, B, C, D, E, F, G,\nH, I, J, K, L, M, N, O, P,\nQ, R, S,\nT, U, V,\nW, X, Y, Z.";
Jörg Hülsermann
fuente
Puede guardar un byte utilizando una nueva línea real en lugar de \n.
Alex Howansky
Como se le permiten espacios finales en cada línea, puede guardar un byte soltando el espacio de la expresión regular. También puede guardar un byte utilizando el ereg_replace (obsoleto y eliminado en 7.0), ya que le permite omitir los delimitadores en la expresión regular.
user59178
@ user59178 Podría guardar 3 Bytes pero evitaría esto. Sí, el espacio final está permitido. Podría escribir como regex "# (?=[HQTW])#"y acortar el reemplazo a los "\n"mismos bytes y hacerlo más claro. Usar una función obsoleta puede confundir a los principiantes. Y la ruptura física se puede interpretar mal en otros sistemas luego de Unix. Puedes publicarlo como tu propia sugerencia.
Jörg Hülsermann
2

MATL, 38 29 bytes

¡9 bytes guardados gracias a @Luis!

1Y2X{', '&Zc46h1[CEII]I*11hY{

Pruébalo en línea!

Explicación

1Y2     % Push the upper-case alphabet to the stack
X{      % Break the character array into a cell array (similar to a list)
        % where each element is a letter
', '&Zc % Combine back into a string with ', ' between each element
46h     % Append '.' (via ASCII code) to the end of the string
1       % Push the number 1
[CEII]  % Push the array: [7, 9, 3, 3]
I*      % Multiply this array by 3: [21, 27, 9, 9]  
llh     % Append an 11 to this array: [21, 27, 9, 9, 11] 
Y{      % Break our comma-separated list of characters into groups of this size
        % Implicitly display the result
Suever
fuente
2

R, 146 bytes

L=LETTERS
f=function(x,y=""){paste(x,collapse=paste0(", ",y))}
cat(f(c(f(L[1:7]),f(L[8:16]),f(L[17:19]),f(L[20:22]),f(L[23:26])),"\n"),".",sep="")

Explicación:

LETTERSestá predefinido para letras mayúsculas.
La ffunción es para concatenar el vector x ,con adicional y(usado para líneas nuevas).
El gato es el utilizado, ya que imprime \ncomo líneas nuevas. fse llama en las letras para formar filas y luego en las filas nuevamente para formar toda la salida.

Probablemente golfable - No me gustan las múltiples llamadas de f ...

pajonk
fuente
3
La salida sin formato tiene solo 77 bytes de longitud. Impresión que directamente podría ser más corta ...
Lynn
@ Lynn, lo sé, pero aquí veo algunas posibilidades de golf.
pajonk
2

CJam, 31 bytes

'[,65>", "*7933Ab{3*/(\:+}%N*'.

Explicación:

'[,65>                             push uppercase alphabet
      ", "*                        ", " between all letters
           7933Ab                  push [7 9 3 3]
                 {3*/(\:+}%        slices of lengths 21, 27, 9, 9
                           N*'.    join slices with newlines, add final "."

Pruébalo en línea

Neorej
fuente
2

Julia, 71 bytes

f()=join(join.(['A':'G','H':'P',"QRS","TUV","WXYZ"],[", "]),",\n")*"."

Requiere 0.5 o mejor para transmitir .()

Lyndon White
fuente
Por un lado, esto actualmente no tiene un período final, y ¿no necesita una printdefinición de función /? Por otro lado, no guardar joinen una variable guarda un byte.
Sp3000
Mi mala palabra falta el ".", Y gracias por el puntero encendido join. He contado mal. La ejecución del programa devuelve la cadena. ¿No es un programa que devuelve una cadena una salida válida? (¿O son solo las funciones que pueden devolver cosas para que cuenten como salida? Si f()=es más corto print())
Lyndon White
Claro, f()=o ()->está bien: creo que la idea es que las funciones son asignables y se pueden ejecutar varias veces, y en contraste esto sería un fragmento de código.
Sp3000
2

Cheddar, 57 bytes

->(65@"90).sub(/[GPSV]/g,"$0
").sub(/[^Z\n]/g,"$0, ")+"."

Pruébalo en línea! ¿No es eso hermoso? Es un bonito rectángulo.

Dos sustituciones de expresiones regulares. (65@"90)es el alfabeto en mayúscula, se .sub(/[GPSV]/g,"$0\n")reemplaza GPSVa sí mismo y "\n", .sub(/[^Z\n]/g,"$0, ")reemplaza a todos los Zcaracteres que no son de nueva línea y a sí mismo ", "y "."agrega un final ..

Conor O'Brien
fuente
1
Buena técnica, y buen trabajo superando a Downgoat;)
ETHproductions
2

Japt, 24 bytes

;B¬qJ+S r"[HQTW]"@R+XÃ+L

¡Pruébelo en línea!

Cómo funciona

;                        // Reset various variables. B is set to "ABC...XYZ", J is set to ",", and L is set to ".".
 B¬                      // Take the uppercase alphabet and split into chars.
   qJ+S                  // Join with ", ".
        r"[HQTW]"        // Replace each H, Q, T, or W with
                 @R+XÃ   //   a newline plus the character.
                      +L // Append a period to the result.
                         // Implicit: output last expression
ETHproducciones
fuente
2

Java, 116 109 105 104

String f(){String s="";for(char c=65;c<91;)s=s+c+(c>89?46:',')+("GPSV".indexOf(c++)<0?' ':10);return s;}

Sin golf:

String f() {
  String s = "";
  for (char c = 65; c < 91;) {
    s = s + c
      + (c > 89 ? 46 : ',')
      + ("GPSV".indexOf(c++) < 0 ? ' ' : 10);
  }
  return s;
}

fuente
Puede jugar golf por 7 bytes: los tres ||a |(-3); cambiando c==90a c>89(-1); cambiando '.'a 46(-1); y cambiando '\n'a 10(-2).
Kevin Cruijssen
@KevinCruijssen gracias, intenté usar decimales pero parece que si reemplazo ambas constantes de caracteres en un ternario, cambia el tipo de expresión a entero, lo que lo rompió. Cambiar una constante funcionó y exprimió algunos bytes.
2
@KevinCruijssen gracias. Si tuviera suficiente café en mí, habría recordado actualizarlo yo mismo.
1
2 bytes más: en "GPSV".contains(""+c)lugar de c==71|c==80|c==83|c==86.
TNT
1
@TNT Pude hacerlo un poco mejor. Sabía que esa parte podía mejorarse, gracias por empujar en la dirección correcta.
1

q, 46 bytes

-1@'(", "sv/:0 7 16 19 22_,:'[.Q.A]),'",,,,.";
skeevey
fuente
1

Retina, 43 bytes


Z
{2`
$`
}T01`L`_L
.
$&, 
[HQTW]
¶$&
, $
.

La nueva línea principal es significativa. Pruébalo en línea!

Esta es la primera vez que uso Retina, por lo que se agradece cualquier consejo de golf ...

ETHproducciones
fuente
1

Pyth, 25 bytes

+Pjmj\ dc*G\,j94092 23)\.

Un programa que imprime el resultado en STDOUT.

Pruébalo en línea

Cómo funciona

+Pjmj\ dc*G\,j94092 23)\.  Program. Input: none
          G                Yield string literal'abcdefghijklmnopqrstuvwxyz'
         * \,              Cartesian product of that with ',', yielding a list of
                           characters with appended commas
             j94092 23)    Yield the integer 94092 in base-23, giving [7, 16, 19, 22]
        c                  Split the comma-appended character list at those indices
   mj\                     Join each element of that on spaces
  j                        Join that on newlines
 P                         All but the last element of that, removing trailing ','
+                      \.  Append '.'
                           Implicitly print
TheBikingViking
fuente