Gere alfabeto com 4 cópias de cada letra


27

Observe que isso não é o mesmo que Imprimir o alfabeto quatro vezes .

Esta tarefa é escrever um programa para gerar quatro cópias de cada letra do alfabeto inglês, uma letra por linha, na saída padrão:

A
A
A
A
B
B
B
B

etc.

A saída deve incluir novas linhas após cada letra.

Letras maiúsculas sem saída extra são preferidas; no entanto, letras minúsculas e / ou espaços em branco extras são aceitáveis ​​se a capitalização / remoção prolongar sua solução.

EDITADO PARA ADICIONAR: A solução deve estar completa o suficiente para ser executada. Eu deveria conseguir invocar uma implementação do idioma, colar o código da resposta e obter resultados, sem digitar nenhum código adicional.

A questão acima sobre integridade surgiu no contexto de uma solução C. Certamente deve haver uma regra ou convenção permanente sobre isso em um site de golfe com código? Nesse caso, terei prazer em ceder às diretrizes da comunidade. Mas esta é a minha opinião:

  1. No que diz respeito especificamente ao C, você precisa incluir (e contar) o main(){... em }torno do código, pois ele não será compilado de outra forma. Os avisos porque não existem #include <stdio.h>são bons, desde que o código ainda seja compilado. Em geral, uma linguagem compilada requer uma unidade compilável.

  2. Uma expressão simples que produz os resultados desejados é aceitável se houver uma maneira de executar a expressão diretamente; por exemplo, se o idioma tiver um REPL. Portanto, você pode enviar o Haskell sem a main=condição de que ele realmente funcione conforme escrito, por exemplo, no ghciprompt. Mas como isso significa colocar letsuas declarações, pode ser uma vitória líquida manter o runhaskellformato.

  3. Da mesma forma, os awkscripts devem estar nos blocos BEGIN(ou END, com a suposição de que stdin está anexado /dev/null), já que não estamos processando nenhuma entrada.

etc.


4
Estou um pouco confuso. O desafio aqui é apenas gerar o alfabeto com cada letra repetida quatro vezes ou a saída também precisa ser armazenada em um arquivo?
Iszi 13/12

E eu tenho que imprimir apenas o alfabeto?
23713 Justin

@MarkReed Preciso imprimi-lo com novas linhas no meio? Por que não apenas imprimi-lo, mas as novas linhas são opcionais?
Justin

3
Além disso, recomendo reformular seu desafio para que ele se pareça mais com um desafio e menos com a história de como você inventou sua resposta.
23713 Justin

O último bit confunde o espaço em branco governa um pouco. Você poderia por favor esclarecer? Particularmente, estou lendo certo interpretar que espaço em branco extra é bom, mas a omissão de novas linhas não é?
Iszi 13/12

Respostas:


16

APL (5)

⍪4/⎕A

Formato de matriz ( ) de 4 réplicas ( 4/) do alfabeto ( ⎕A).


1
Parece improvável que seja derrotado. :)
Mark Reed


O APL usa uma página de código que mapeia cada um dos caracteres que usa para um byte. Esta página de código pode ser encontrada aqui, no site da IBM.
Steven H.

@StevenH. Fazer a ligação está morto
Stan Strum

@ StanStrum Eu acredito que o link está morto por causa da depreciação, mas por uma questão de código de golfe, essa meta resposta deve funcionar.
Steven H.

11

Python - 37

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

ivai de 0 a 104; é dividido por quatro e adicionado ao valor ascii para A, e o caractere resultante é impresso.


Presumo que Python usa divisão inteira por padrão? Seria bom se o PowerShell o fizesse agora. Como é, o código necessário para forçá-lo à divisão inteira é muito longo para que esse truque me ajude a salvar qualquer coisa no meu script.
Iszi

@lszi - Python usa sua sugestão do tipo dos operandos. 3/4é 0, enquanto 3.0/4.0é 0,75; range()gera números inteiros.
Mark Reed

1
Isso não funciona nas versões mais recentes do python. Primeiro, a função de impressão deve ser chamada entre colchetes e / não faz mais a divisão inteira por padrão (mesmo que os dois números sejam inteiros), que é o trabalho de // Tente:for i in range(104):print(chr(i//4+65))

3
@ Consciência eu sei disso. Eu escolhi deliberadamente usar uma versão antiga para poder jogar melhor. Se você fosse executar este em Ideone.com, você escolheria "Python" em vez de "Python 3"
Justin

3
@ Consciência - por "versões mais recentes do python", você está se referindo ao "Python 3", que está longe de ser universalmente adotado neste momento. Eu geralmente presumo que qualquer coisa que alega ser "Python" sem uma versão especificada é Python 2.x até que seja provado o contrário; O código Python 3 tende a ser explicitamente rotulado.
Mark Reed


7

C, 59

Eu envio isso, uma resposta longa e não competitiva, simplesmente porque ainda não vejo um envio em C. E isso me deixa triste. : - /

MAIS TARDE: Adota o @moala por fazer uma versão int "/ 4" disso, economizando 13 caracteres!

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

Eu editei minha resposta, agora economizando ainda mais 2 caracteres!
Moala

e um outro!
Moala

6

J: 18 13

4#u:65+i.26 1

Ainda estou bem instável com J, então isso provavelmente poderia ser melhorado


3
Você pode usar replicate ( #) em vez de divisão assim: 4#u:65+i.26 1. Além disso, ~alterna os argumentos de uma função; portanto, se você se encontrar fazendo (expression) F value, poderá substituí-lo por value F~ expressionpara salvar um caractere.
Marinus

Marinus @ Obrigado pela dica. Ainda estou aprendendo J e é difícil encontrar informações boas com esses tipos de truques.
Pwg #

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

5

Ruby, 23

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

Todo o crédito para @manatwork - votou positivamente no seu comentário, não neste. :)


Enorme. @ manatwork, vou fazer a edição, mas obviamente não mereço nenhum crédito!
Darren Pedra

5
Melhor fazê-lo puts [*?A..?Z].map{|i|[i]*4}ou puts ([*?A..?Z]*4).sort, para que as letras sejam ordenadas como no exemplo.
Manatwork

2
@ manatwork: puts (?A..?Z).map{|i|[i]*4}é um personagem mais curto. Você pode ligar mapdiretamente em um intervalo, para não precisar do splat nesse caso.
Mark Reed

5

PowerShell: 32 23

Código de golfe:

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

Passo a passo:

[char[]](... )pega uma matriz de objetos e os converte em caracteres ASCII.
65..90são os códigos ASCII para AZ.
*4repete a série 4 vezes.
|Sortclassifica a saída.

Nota:

Se você quiser que isso seja gravado em um arquivo, basta jogar >, seguido por um nome de arquivo, no final.


5

Haskell, 46

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

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

5

Befunge 98-18

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

Funciona armazenando um número e terminando quando atingir 104. Imprime o caractere correspondente do alfabeto para o número dividido por 4, seguido por uma nova linha. Mas se eu não precisar adicionar uma nova linha após cada letra, serão 16 caracteres:

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

Pode ser reduzido se eu conseguir imprimir mais caracteres (ou seja, todos eles quatro vezes) ( 7 6 caracteres, até funciona no Befunge 93):

1+:4/,

Com nova linha:

1+:4/,a,


4

Perl 5, 21

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

2
Nunca me ocorreu colocar uma nova linha literal dentro de uma string de aspas duplas no Perl. +1.
Mark Reed

Devo notar que também não, mas o @manatwork mencionou isso em outra resposta minha e está preso!
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 também:

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

Graças a @marinus, 43:

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

Devo adicionar uma recompensa por chegar aos 42? :)


6
50 rep. é necessário comentar sobre qualquer coisa, e você tem 101 no momento de postar esse comentário.
syb0rg

Ótimo! Obrigado! Resposta editada!
Moala

1
Você pode substituir >>2por /4.
Marinus

4

Java: 56

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

edit: alterado de 'print' para 'println'


A saída deve incluir novas linhas após cada letra.
Pierre Arlaud

obrigado por apontar isso, ele deve imprimir uma nova linha de cada vez agora
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. Eu acho que a sua solução viola essa condição #
22490 jul83

2
@ user902383 Se você colar no JShell (o Java REPL no Java 9), ele funcionará e você nem precisará do ponto e vírgula final.
David Conrad

@DavidConrad É incrível, então, acho que posso começar a usar o REPL / JShell.
user902383


4

Na verdade, 6 bytes

4ú*SÖi

Experimente aqui!

Explicação

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 com letras minúsculas e sem nova linha:

4ú*S

1
Bem-vindo ao PPCG!
Erik the Outgolfer

4

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

Em hexadecimal:

B409BA160189D7B96800F6C1037502FE05CD21E2F5C3400A24

Este é um programa completo do MS-DOS .COM. Copie a sequência de bytes para o arquivo com extensão .com e execute-a no DOSBox

Desmontagem:

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

AWK, 48

Vamos tentar com AWK ...

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

Como sugerido por manatwork , podemos nos livrar de 2 caracteres

AWK, 46 (Editar)

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

AWK, 40 (editando o código do MarkReed )

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

Ao remover a inicialização da variável s você pode poupar 2 caracteres: END{for(i=104;i--;s+=0==i%4)printf"%c\n",s+65}.
manatwork

1
Colocar o código em um ENDbloco significa que ele requer um fluxo de entrada (mesmo que seja /dev/null) para funcionar. Isso modifica a contagem de caracteres? Enfim, BEGIN{for(;++i<104;){printf"%c\n",i/4+65}}é 5 caracteres mais curtos.
Mark Reed

@MarkReed Seu código não está funcionando. Verifique isso
Wasi

D'oh. Tão perto! :) Mas eu ainda não sei como a ENDexigência do padrão para um fluxo de entrada ...
Mark Reed

3

PowerShell, 21

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

Uma abordagem ligeiramente diferente da de Iszi. E mais curto :-)


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
Bem-vindo ao PPCG! Bom primeiro post!
Rɪᴋᴇʀ

3

05AB1E, 6 bytes

A4×{S»

Explicação:

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

Sem novas linhas, 4 bytes

A4×{

Experimente online!



3

Perl 6, 32

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

Acho que foi a primeira vez que o Perl 6 foi a primeira solução em que pensei, mas o hiperoperador parecia um ajuste natural.
Mark Reed

3

Tela , 5 bytes

Z41*⟳

Experimente aqui!

Explicação:
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)                         |

Com substituído por \napós a impressão.



3

brainfuck , 48 bytes

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

Experimente online!

Imprime em letras minúsculas, separadas por retornos de carro. Usa quebra automática de células de 8 bits, bem como células deixadas na origem, embora você possa acrescentar a >para contrariar a última.


Eu estava prestes a publicar um novo, mas você conseguiu superar completamente o meu melhor, obtive 71 bytes com ++++++ [-> ++> ++++> ++++++++ ++ <<<] ++++> +> ++> +++++ <[->. <<. >>. <<. >>. <<. >>. + <<.>]
KrystosTheOverlord 31/01



2

Scala, 42

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.