Tours Eiffel: Créez un grand «A» à partir de «A»

20

Créer une fonction qui, étant donné un certain nombre de lignes n, fait un bigA.

  • La barre horizontale de bigAdoit être au milieu, ou la plus basse des deux si elle nest paire
  • Supposons une police monospace pour la sortie

La sortie doit être une chaîne (ou similaire, par exemple un tableau de caractères) avec des sauts de ligne clairs pour séparer les lignes, et avec des espaces corrects pour le remplissage gauche (vous pouvez supposer que \ t est de 4 espaces). Il peut y avoir n'importe quel espace à droite.

Exemples

n = 1

A

n = 2

 A
AAA

n = 3

  A
 AAA
A   A

n = 4

   A
  A A
 AAAAA
A     A

n = 5

    A
   A A
  AAAAA
 A     A
A       A

Ceci est inspiré par Créer un "H" à partir de "H" plus petits

Budd
la source
Puis-je ajouter un espace à droite? De plus, le retour à la ligne est-il autorisé?
Bubbler
@Bubbler, tout espace sur le côté droit est très bien, mais pas de nouvelle ligne
Budd
Sommes-nous autorisés à renvoyer des tableaux de caractères 2D au lieu de chaînes? (indice: il est généralement recommandé d'autoriser tout type de sortie)
Olivier Grégoire
1
@ OlivierGrégoire Bien sûr, tant qu'il y a une rupture nette pour les lignes (par exemple un élément "\ n", des tableaux imbriqués)
Budd
1
@TonHospel, Non, cela va vraiment à l'encontre de l'achat de cela
Budd

Réponses:

12

05AB1E , 13 octets

Code:

Ð;î¹)'A1376SΛ

Utilise l' encodage 05AB1E . Essayez-le en ligne!

Explication:

Ð                  # Triplicate the input.
 ;î                # Compute ceiling(n / 2).
   ¹               # Push the first input again.
    )              # Wrap into an array. For input 7, this would result in:
                     [7, 7, 4, 7].
     'A            # Push the character 'A'
       1376S       # Push the array [1, 3, 7, 6]. These are the directions of the canvas.
                     This essentially translates to [↗, ↘, ↖, ←].
            Λ      # Write to canvas using the previous three parameters.

Toile

Je devrais probablement documenter le canevas un peu plus (et beaucoup d'autres fonctions), mais cela résume fondamentalement. Le canevas a différents «modes» en fonction des types de paramètres donnés. La commande canvas a trois paramètres: <longueur> <chaîne> <direction> .

Étant donné que les paramètres de longueur et de direction sont des listes, il zippe ces listes pour créer un ensemble d'instructions à exécuter. Le paramètre de chaîne n'est que la lettre A , c'est donc le caractère de remplissage utilisé par toutes les instructions. Le canevas interprète cela comme l'ensemble d'instructions suivant (pour l'entrée 7):

  • Tracez une ligne de longueur 7 avec la chaîne A dans la direction
  • Tracez une ligne de longueur 7 avec la chaîne A dans la direction
  • Tracez une ligne de longueur 4 avec la chaîne A dans la direction
  • Tracez une ligne de longueur 7 avec la chaîne A dans le sens

Les instructions sont traduites de la manière suivante:

7   0   1
  ↖ ↑ ↗
6 ← X → 2
  ↙ ↓ ↘
5   4   3

Si rien n'a été généré, 05AB1E génère automatiquement le résultat du canevas.

Adnan
la source
1
Merci beaucoup pour l'explication de la toile, c'est une fonctionnalité géniale :-)
Kaldo
TIL triplicate is a word
Quintec
@ thecoder16 quadruplicate, quintuplicate, ..., decuplicate
Magic Octopus Urn
Sensationnel. J'étais douteux de non-dupliqué, mais il existe comme tous les autres. Bien sûr, nous avons de tels mots inutiles en anglais xD
Quintec
1
@KevinCruijssen Hé, excuses pour toutes les réponses tardives, ça a été incroyablement occupé pour moi ces dernières semaines (j'ai réussi à dormir 8 heures seulement les 72 dernières heures haha) donc je ne pense pas que je suis capable de le faire quoi que ce soit en ce moment, mais n'hésitez pas à l'ajouter à la page de conseils si vous le souhaitez.
Adnan
6

Fusain , 17 15 octets

NθP×θAM⊘θ↗P^×θA

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

Nθ

Entrée n.

P×θA

Imprimez la barre horizontale du grand A. (Pour les nombres pairs, le n+1th chevauche quand même le côté droit.)

M⊘θ↗

Déplacez-vous au sommet du grand A.

P^×θA

Imprimez les deux côtés du grand A.

Neil
la source
4

Python 2 , 80 octets

lambda n:'\n'.join(' '*(n+~i)+('A'+' A'[i==n/2]*n*2)[:i*2]+'A'for i in range(n))

Essayez-le en ligne!

Divisez la sortie souhaitée dans le blanc de gauche, le blanc Aplus le milieu ou les blancs Aet le droit A. Calculez la partie centrale en utilisant le découpage sur une chaîne fixe. Cela permet d'utiliser de la même manière pour générer la première ligne.

Bubbler
la source
4

Stax , 15 octets

┴3╬*ôP^x'┌_╓J²♫

Exécuter et déboguer

Décompressé, non golfé et commenté, le programme ressemble à ceci.

m       map over [1 .. input] using rest of the program, output each result
'A      "A" literal
xhi=    is the iteration index equal to (integer) half the input?
65*     multiply by 65 (character code of "A")
]i*     repeat that character (" " or  "A") i times
+       concat to initial "A"
x)      left pad to the original input
|p      palindromize (concatenate the reverse minus the last character)

Exécutez celui-ci

récursif
la source
4

Python 3.6 , 79 octets ou 73 octets

Utilisation de chaînes f pour aligner les parties horizontales de la lettre:

lambda n:'\n'.join(f"{'A'+' A'[i==n//2]*2*i:>{n+i}}"[:-1]+'A'for i in range(n))

Avec \butilisé pour en supprimer un A(éventuellement tricher):

lambda n:'\n'.join(f"{'A'+' A'[i==n//2]*2*i:>{n+i}}\bA"for i in range(n))
Radek
la source
3

J , 65 octets

f=:3 :''' A''{~1(([:(<@;]+i.@+:)<.@-:)y)}([:(}:@|."1,.])=/~@i.)y'

Essayez-le en ligne!

Il peut être réduit d'env. 12 octets en rendant simplement le verbe tacite, mais j'ai du mal à le faire.

Explication:

3 : '...' désigne un verbe explicite à une ligne

y est l'argument

=/~@i. crée une matrice d'identité avec la taille de l'argument

    =/~@i. 4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

([:(}:@|."1,.]) ajoute la matrice d'identité à sa copie miroir avec les derniers éléments de chaque ligne supprimés.

    ]a =. ([:(}:@|."1,.])=/~@i.) 4
0 0 0 1 0 0 0
0 0 1 0 1 0 0
0 1 0 0 0 1 0
1 0 0 0 0 0 1

1(...)}(...) change à 1 les positions dans son argument de droite, sélectionné par celui de gauche

([:(<@;]+i.@+:)<.@-:) - prépare la sélection en procédant comme suit:

               <.@-: - halves the argument and finds the floor (finds the row number)
    <@;              - box the row, followed by a list of columns:  
        ]+i.@+:      - a list form the argumnt to the doubled row number

    ([:(<@;]+i.@+:)<.@-:) 4
┌───────────┐
│┌─┬───────┐│
││2│2 3 4 5││
│└─┴───────┘│
└───────────┘

    1(([:(<@;]+i.@+:)<.@-:) 4)}a
0 0 0 1 0 0 0
0 0 1 0 1 0 0
0 1 1 1 1 1 0
1 0 0 0 0 0 1

' A'{~ rend un espace aux endroits de 0 et «A» où il y a 1

    ' A'{~1(([:(<@;]+i.@+:)<.@-:) 4)}a
   A   
  A A  
 AAAAA 
A     A
Galen Ivanov
la source
2

Rubis , 66 octets

->n{(0...n).map{|i|(s=(i==n/2??A:?\s)*2*i+?A)[0]=?A;?\s*(n+~i)+s}}

Essayez-le en ligne!

Renvoie sous forme de tableau de lignes

Kirill L.
la source
2

SOGL V0.12 , 12 octets

 A*:╚╥≤.»I:ž

Essayez-le ici!

Explication:

 A*           repeat "A" input times
   :          duplicate it
    ╚         create a "/" diagonal of one of the copies of As
     ╥        palindromize it horizontally
      ≤       get the other copy of the "A"s on top
       .»I:   push floor(input/2)+1 twice
           ž  and at those coordinates in the palindromized diagonals place in the row of As
dzaima
la source
2

Japt -R , 20 19 octets

Çç" A"gZ¶Uz¹i'A êÃû

Essayez-le


Explication

                        :Implicit input of integer U
Ç                       :Create the range [0,U) and pass each Z through a function
         Uz             :  Floor divide U by 2
       Z¶               :  Test for equality with Z (true=1, false=0)
  " A"g                 :  Get the character in the string " A" at that index
 ç                      :  Repeat Z times
           ¹            :  (Closes a few nested methods)
            i'A         :  Prepend an "A"
                ê       :  Palindromise
                 Ã      :End function
                  û     :Centre pad each element to the length of the longest element
                        :Implicitly join with newlines and output

Alternative

(Dans l'espoir que cela pourrait m'aider à repérer des économies!)

Æ'AúXÄ" A"gX¶Uz¹êÃû
Hirsute
la source
1
Un autre substitut qui est un octet de plus:ç h'AUz)¬íp ®i'A êÃû
ETHproductions
@ETHproductions Remplacez p par ²et c'est aussi 19 octets.
Shaggy
+1 bien mieux que ma monstruosité .
Oliver
1

Gelée , 23 20 19 18 octets

=þ`o\L‘HĊƲ¦UŒBị⁾A 

Essayez-le en ligne!

=þ`crée une matrice d'identité de taille n.

L‘HĊƲtrouve l'index de ligne de la barre horizontale en ¦sélectionnant cette ligne et en l'appliquant, o\ce qui crée la barre.

Uinverse chaque ligne afin que nous n'ayons pas un "A" à l'envers et ŒB(palindromise; vectorise) fait la seconde moitié du "A".

ị⁾A(avec un espace qui est coupé dans la mise en forme) remplace 0s par des espaces et 1s par As.

dylnan
la source
1

T-SQL , 182 177 octets

DECLARE @n INT=5DECLARE @ INT=0a:DECLARE @s VARCHAR(9)=STR(POWER(10,@),@n)PRINT REPLACE(REPLACE(@s+REVERSE(LEFT(@s,@n-1)),'1','A'),'0',IIF(@=@n/2,'A',' '))SET @+=1IF @<@n GOTO a

Première version (avec 182 octets):

DECLARE @n INT=5DECLARE @ INT=0WHILE @<@n BEGIN DECLARE @s VARCHAR(9)=STR(POWER(10,@),@n)PRINT REPLACE(REPLACE(@s+REVERSE(LEFT(@s,@n-1)),'1','A'),'0',IIF(@=@n/2,'A',' '))SET @+=1 END

La version ci-dessus fonctionne jusqu'à @ n = 9.

Voici une autre version, qui fonctionne jusqu'à @ n = 23, mais a 2 octets supplémentaires:

DECLARE @n INT=5DECLARE @ INT=0WHILE @<@n BEGIN DECLARE @s VARCHAR(23)=STR(POWER(10.,@),@n)PRINT REPLACE(REPLACE(@s+REVERSE(LEFT(@s,@n-1)),'1','A'),'0',IIF(@=@n/2,'A',' '))SET @+=1 END

Non golfé:

DECLARE @n INT=5

DECLARE @i INT=0
WHILE @i<@n BEGIN
    DECLARE @s VARCHAR(9)=STR(POWER(10,@i),@n)
    PRINT REPLACE(REPLACE(@s+REVERSE(LEFT(@s,@n-1)),'1','A'),'0',IIF(@i=@n/2,'A',' '))
    SET @i+=1
END
Razvan Socol
la source
1

Haskell , 98 97 95 octets et 109 octets

Deux approches très différentes. Premier (95 octets):

c!n=([1..n]>>c)++"A"
f n=unlines[" "!(n-x)++drop 3([" "!(abs$n`div`2-x+1)!!0]!(2*x))|x<-[1..n]]

et deuxième (109 octets):

m True='A'
m _=' '
g n=unlines[[m(abs(n-j)==l||l==q&&elem j[q+1..q+n])|j<-[1..2*n]]|l<-[0..n-1],q<-[n`div`2]]

Essayez-les ici! ; Essayez la version modifiée ici!

Essayez la troisième version ici!

Radek
la source
Bienvenue chez PPCG! Vous pouvez enregistrer un octet sur votre première approche en définissant lcomme opérateur infixe .
Laikoni
m True='A'un être raccourci m b|b='A'.
Laikoni
Il s'est avéré que même deux octets pouvaient être enregistrés. Merci! :)
Radek
1

Python 2 , 70 octets ou 65 octets

La liste des chaînes est un résultat acceptable, comme @Budd l'a déclaré dans les commentaires.

lambda n:['%*sA\n'%(n+i,('A'+i*2*' A'[i==n/2])[:-1])for i in range(n)]

Essayez-le en ligne!


Solution apparemment tricheuse, en utilisant \b. Il a l'air génial dans TIO, dans la console, il fait le travail.

lambda n:['%*s\bA\n'%(n+i,'A'+i*2*' A'[i==n/2])for i in range(n)]

Essayez-le en ligne!

Possum mort
la source
0

Javascript, 124 octets

Une solution assez naïve, lui a donné un coup de feu pour pratiquer les compétences js.

for(i=-1,p=" ".repeat(n-1)+"A ";++i<n;console.log(i-~~(n/2)?p:p.slice(0,i)+"A".repeat(n)),p=p.slice(1,n)+" "+p.slice(n-1)){}

Déballé

for(
 //create the first line
 i=-1, p=" ".repeat(n-1)+"A "; 
 ++i<n;
 console.log( 
 //if we are not at the bar
      i-~~(n/2)?
 //otherwise, use the modified previous line
      p
 //slice the start of the previous line and add As
      :p.slice(0,i)+"A".repeat(n)), 
 //add a space in between the previous line and remove padding on each side
 p=p.slice(1,n)+" "+p.slice(n-1)){}
Budd
la source
0

Python 3 , 93 , 88 octets

lambda n:'\n'.join(f"{'A'+(x>0)*('A '[x!=n//2]*(x*2-1)+'A'):^{n*2-1}}"for x in range(n))

Essayez-le en ligne!

-3 par @ovs en utilisant f-string

Rick Rongen
la source