Eyfel Kuleleri: “A” lardan büyük bir “A” oluşturun


20

Bir dizi satır verilen bir fonksiyon oluşturun n, a bigA.

  • Yatay çubuğu bigAorta sırada olmalı n, hatta ikisinin altında olmalıdır
  • Çıktı için tek aralıklı yazı tipi olduğunu varsayın

Çıktı, satırları ayırmak için net satır satırlarına ve sol dolgu için doğru boşluklara sahip bir dize (veya benzeri, örneğin karakter dizisi) olmalıdır (4 boşluk olduğu varsayılır). Sağda herhangi bir boşluk olabilir.

Örnekler

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

Bu ilham daha küçük "H" s bir "H" oluşturma


Sağ tarafa boşluk ekleyebilir miyim? Ayrıca, sondaki yeni satıra izin verilir mi?
Bubbler

@Bubbler, Sağ taraftaki herhangi bir boşluk iyi, sondaki yeni satır yok
Budd

Dizeler yerine 2B karakter dizileri döndürmemize izin verilir mi? (ipucu: genellikle her türlü çıktıya izin verilmesi önerilir)
Olivier Grégoire

1
@ OlivierGrégoire Elbette, çizgiler için açık bir mola olduğu sürece (örneğin, bir "\ n" öğesi, iç içe diziler)
Budd

1
@TonHospel, Hayır, bunun anlamını gerçekten yeniyor
Budd

Yanıtlar:


12

05AB1E , 13 bayt

Kod:

Ð;î¹)'A1376SΛ

05AB1E kodlamasını kullanır . Çevrimiçi deneyin!

Açıklama:

Ð                  # 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.

Tuval

Muhtemelen tuvali biraz daha (ve diğer birçok işlevi) belgelemeliyim, ancak bu temel olarak özetliyor. Kanvas, verilen parametre türlerine göre farklı 'modlara' sahiptir. Canvas komutunun üç parametresi vardır: <length> <string> <direction> .

Uzunluk ve yön parametreleri listeler olduğundan, yürütülecek bir dizi talimat oluşturmak için bu listeleri 'fermuarlar'. String parametresi sadece A harfidir , bu nedenle tüm talimatlar tarafından kullanılan dolgu karakteri budur. Kanvas bunu aşağıdaki talimatlar grubu olarak yorumlar (giriş 7 için):

  • Uzunluğunda bir çizgi çizin 7 dize sahip A yönünde
  • Uzunluğunda bir çizgi çizin 7 dize sahip A yönünde
  • Uzunluğunda bir çizgi çizin 4 dize sahip A yönünde
  • A ipi yönünde 7 uzunluğunda bir çizgi çizin

Talimatlar aşağıdaki şekilde tercüme edilir:

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

Hiçbir çıktı alınmazsa, 05AB1E tuval sonucunu otomatik olarak verir.


1
Tuval açıklaması için çok teşekkür ederim, bu harika bir özellik :-)
Kaldo

TIL üç nüsha bir kelimedir
Quintec

@ thecoder16 dörtlü, beşli, ..., decuplicate
Sihirli Ahtapot Urn

Vay. Yinelemeden şüpheliydim, ama diğerleri gibi. Tabii ki İngilizce'de işe yaramaz kelimeler var xD
Quintec

1
@KevinCruijssen Hey, tüm geç cevaplar için özür dilerim, son birkaç hafta benim için inanılmaz derecede meşguldü (son 72 saatte sadece 8 saat uyuyabildim haha) bu yüzden yapabileceğimi sanmıyorum hemen şimdi istediğiniz bir şey var, ancak isterseniz bunu başlık sayfasına ekleyebilirsiniz.
Adnan

6

Kömür , 17 15 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

Nθ

Giriş n.

P×θA

Büyük yatay çubuğu yazdırın A. (Çift sayılar için, n+1th yine de sağ tarafla örtüşüyor.)

M⊘θ↗

Büyüklerin üstüne git A.

P^×θA

Büyüklerin iki yüzüne de yazdırın A.


4

Python 2 , 80 bayt

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

Çevrimiçi deneyin!

İstenen çıktıyı sol boşluk, sol Aartı orta boşluk veya As ve sağa bölün A. Sabit bir dize dilimleme kullanarak orta kısmı hesaplayın. Bu, ilk satırı oluşturmak için aynı şekilde kullanılmasına izin verir.


4

Stax , 15 bayt

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

Çalıştır ve hata ayıkla

Paketten çıkarılmış, çözülmemiş ve yorum yapılmış, program böyle görünüyor.

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)

Bunu çalıştır



4

Python 3.6 , 79 bayt veya 73 bayt

Mektubun yatay kısımlarını hizalamak için f-dizeleri kullanma :

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

İle \bbirini silmek için kullanılan A(muhtemelen hile):

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


3

J , 65 bayt

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

Çevrimiçi deneyin!

Yakl. 12 byte'lık basitçe fiili zımni yaparak, ama bunu yaparken problemlerim var.

Açıklama:

3 : '...' açık bir tek katlı fiil anlamına gelir

y argüman

=/~@i. argümanı boyutlandıran bir kimlik matrisi oluşturur

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

([:(}:@|."1,.]) her bir satırın son öğeleri düştüğünde ayna kopyası ile kimlik matrisini önler.

    ]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(...)}(...) sol bağımsız değişken tarafından seçilen, sağ bağımsız değişkenindeki konumlar 1 olarak değişir

([:(<@;]+i.@+:)<.@-:) - aşağıdakileri yaparak seçimi hazırlar:

               <.@-: - 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'{~ olduğu yerlerde 0 ve 'A' yerlerinde bir boşluk oluşturur 1

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



2

SOGL V0.12 , 12 bayt

 A*:╚╥≤.»I:ž

Buradan Deneyin!

Açıklama:

 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

2

Japt -R , 20 19 bayt

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

Dene


açıklama

                        :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

Alternatif

(Umarım bazı tasarrufları tespit etmeme yardımcı olabilir!)

Æ'AúXÄ" A"gX¶Uz¹êÃû

1
Bayt daha uzun olan başka bir alternatif:ç h'AUz)¬íp ®i'A êÃû
ETHproductions 23:18

@ETHproductions değiştirin p ile ²ve aynı zamanda 19 bayt var.
Shaggy

Daha iyi 1 yolu benim ucube .
Oliver


1

Jöle , 23 20 19 18 bayt

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

Çevrimiçi deneyin!

=þ`boyutta bir kimlik matrisi oluşturur n.

L‘HĊƲyatay çubuğun satır dizinini, ¦o satırı seçerek o\ve çubuğu oluşturan uygulayıcıya uygulayarak bulur .

Uher satırı tersine çevirir, böylece baş aşağı "A" yok ve ŒB(palindromize; vectorize eder) "A" nın ikinci yarısını yapar.

ị⁾A(biçimlendirmede kırpılan bir 0boşlukla ), s ile boşlukları ve 1s ile As'yi değiştirir.


1

T-SQL , 182177 bayt

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

İlk sürüm (182 bayt ile):

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

Yukarıdaki sürüm @ n = 9'a kadar çalışır.

@ N = 23'e kadar çalışan ancak 2 ekstra bayta sahip başka bir sürüm:

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

Ungolfed:

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

1

Haskell , 98 97 95 bayt ve 109 bayt

Çok farklı iki yaklaşım. İlk (95 bayt):

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]]

ve ikinci (109 bayt):

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]]

Burada deneyin! ; Değiştirilmiş sürümü burada deneyin!

Burada üçüncü sürümü deneyin!


PPCG'ye Hoşgeldiniz! Infix operatörü olarak tanımlayarakl ilk yaklaşımınızda bir bayt kaydedebilirsiniz .
Laikoni

m True='A'kısaltılmalıdır m b|b='A'.
Laikoni

İki baytın bile kurtarılabileceği ortaya çıktı. Teşekkürler! :)
Radek

1

Python 2 , 70 bayt veya 65 bayt

@Budd yorumlarda belirtildiği gibi dizelerin listesi kabul edilebilir sonuçtur.

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

Çevrimiçi deneyin!


Görünüşte ucuz bir çözüm \b. TIO'da korkak görünüyor, konsolda işi yapıyor.

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

Çevrimiçi deneyin!


0

Javascript, 124 bayt

Oldukça naif bir çözüm, js becerilerini uygulamak için bir şans verdi.

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)){}

Paketlenmemiş

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)){}


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.