ABACABA şehri oluşturun


17

İşte 3. ABACABA şehri:

  _
A|_|
B|__|
A|_|_
C|___|
A|_|
B|__|
A|_|

Temel olarak ABACABA dizisinden yapılır :

  • A (1. yineleme)
  • yer B - AB
  • tekrar A - ABA (2. yineleme)
  • Yer C - ABAC
  • ABA - ABACABA'yı tekrarlayın (3. yineleme)

ve fikri anladınız.

Binaların sayıları A = 1, B = 2 vb.

Giriş

Yineleme sayısı 1 <= n <= 26.

Çıktı

ABACABA sipariş n şehri , satırların başındaki harfler dahil.


@DonMuesli Haha evet. Söz konusu köprü olacak.

1
Sayı 26'dan yüksek olduğunda ne çıkarmamız gerekir?
Adnan

Evet lütfen: D (kolay olmayacak mıydı?)

1
Bu geçerli girdi olarak sayılmaz.

2
Girdi sıfır olabilir ve öyleyse, çıktı ne olmalıdır? Ayrıca, ilk 4 girişi ve beklenen çıktıları listelemek zarar vermez.
Zgarb

Yanıtlar:


6

Python 2, 82 bayt

f=lambda n,s=1:n*"'"and"  _"*s+f(n-1,0)+"_"*(n-2)+"\n%c|%s|"%(64+n,"_"*n)+f(n-1,0)

Kimsenin ikili özyineleme yöntemini yayınlamadığını fark ettim ve denemeye karar verdim ... ve şimdi Sherlock9'dan ödünç alınan bir numarayla, en kısa python cevabı! (Ayrıca, bir kısaltma için xnor'a teşekkürler.) (Ve sonra bir avuç daha tıraş olan Dennis ...)

Ungolfed:

def f(n,s=1):
    if n>0:
        strsofar = "  _" if s==1 else ""        #prepend overhang for top-level call
        strsofar += f(n-1,0)                    #build the city above the current line
        strsofar += "_"*(n-2)                   #add the overhang to reach the current tower
        strsofar += "\n%c|%s|" % (64+n, "_"*n)  #write the current (center) line
        strsofar += f(n-1,0)                    #build the city below the current line
        return strsofar
    else: 
        return ""                               #only this line will be executed when n==0 (base case)

print "  _"+f(input())

Sanırım bunu anlıyorum ve oldukça zekice. Bu güzel özyinelemeyi tamamen kaçırmıştım. Saklamak yerine her iki tarafa da birleştirerek sve ikinci satırı anon fonksiyonu yaparak bazı karakterleri kaydedebilirsiniz :f=lambda n:n*"?"and f(n-1)+"_"*(n-2)+"\n%c|%s|"%(64+n,"_"*n)+f(n-1);lambda n:" _"+f(n)
xnor

Bunu bir sonraki adımda yapmayı düşünüyordum ...
quintopia

@kintopia f=lambda n,s=1:n*"_"and" _"*s+f(n-1,0)+"_"*(n-2)+"\n%c|%s|"%(64+n,"_"*n)+f(n-1,0)çalışmalıdır.
Dennis

@Dennis ben yukarıdaki çözümü Pyth içinde uygulamak öneririz. 59 bayttan daha kısa olabileceğinden şüpheliyim ...
Yapardım

1
Program olarak 81 bayt , işlevle aynı uzunlukta .
xnor

3

Python 2, 99 bayt

b=1;i=2**input('  _\n')-1
while i:i-=1;a=len(bin(i&-i))-2;print'%c|%s|'%(64+b,'_'*b)+'_'*(a+~b);b=a

iABACABA dizisinin th sayısını bulmak için iikili olarak yazın, sondaki sıfır sayısını sayın ve bir tane ekleyin. Biz klasik bit hile kullanmak i&-ien büyük güç bulmak için 2bu bölünmeden isonra hesaplama bit uzunluğu. Aslında, sayısı iaşağı 2**n-1için 0ABACABA sekansı simetrik olduğu için iyi olan.

Bir "önceki" değişken yardımıyla dizinin hem güncel hem de son sayısını izleriz b. Bu bize "çıkıntı" olarak kaç alt çizgi yazdırılacağını söyler. Son bina çıkıntı olmadan doğru şekilde çizilir, çünkü 0bit uzunluğu olarak kabul edilir1 .

Yazdırma için dize biçimi , ilk satırı yazdırmak için kullanılan numara gibi Sp3000'den alınırinput .


3

MATL , 59 bayt

vi:"t@wv]!-1hPXJtPvX>"'|'@Z"63+h6MJ2+X@)(]XhcJ64+!wh!32H:(!   

Bu , dilin geçerli sürümünü (15.0.0) kullanır .

Çevrimiçi deneyin!


(Harflerin çıktıya dahil edilmesi gerekmiyorsa: aşağıdakiler işe yarar, 48 bayt):

vi:"t@wv]!-1hPXJtPvX>"' |'X@1=o)@Z"63+h6MJ2+X@)(

açıklama

v        % vertically concatenate the stack contents: gives an empty array
i:       % input number n. Generate [1,2,...,n]
"        % for each k in [1,2,...n]
  t      %   duplicate
  @      %   push k
  wv     %   swap, vertically concatenate
]        % end. Poduces the numeric ABACABA: [1 2 1 3 1 2 1]: ceiling heights
!        % transpose into a row
-1h      % append -1
PXJ      % reverse array. Copy into clipboard J
tP       % duplicate. Reverse again, so undo the reversing
v        % vertically concatenate reversed and non-reversed row arrays
X>       % max of each column. Gives array of wall heights: [1 2 2 3 3 2 2 1]
"        % for each value in that array
  '|'    %   push "floor" char
  @      %   push height
  Z"     %   create string with that many spaces
  63+    %   transform spaces into "wall" chars, '_'
  h      %   concatenate horizontally
  6M     %   push "floor" char '|' again, to be used as ceiling
  J      %   push array of ceiling heights
  2+X@)  %   index into that to get height of current building
  (      %   at that position, overwrite the string with '|'
]        % end
Xhc      % concatenate all strings into a 2D char array, padding with spaces
J        % push array of ceiling heights (numeric ABACABA sequence)
64+      % add 64 to transform into letters
!        % transpose into column array
wh       % swap, concatenate horizontally. This appends letters below the floor
!        % transpose
32H:(    % overwrite first two positions (in linear order) with spaces
!        % transpose back. Implicitly display

Çok güzel bir cevap, ama aynı zamanda binaların önündeki harfleri de çıkarmanız gerekiyor: s.
Adnan

Çözüldü. Yine de OP açıklama bekliyor
Luis Mendo

1
Aslında bunu zaten sordum, ama yorumumu sildim. Bu p: gerçi tepki oldu.
Adnan

Çok zarif bir çözüm.

2

CJam, 37 35 bayt

SS'_Lri{[H)'_*_2>N@H'A+'|@'|6$]+}fH

Bu, @ quintopia'nın cevabından yinelemeli algoritmanın yinelemeli bir uygulamasıdır .

Çevrimiçi deneyin!

Nasıl çalışır

SS'_     e# Push two spaces and an underscore.
L        e# Push "".
ri       e# Read an integer I from STDIN.
{        e# For each H in [0 ... I-1]:
  [      e#   Set an array marker.
    H)   e#     Push Push H+1.
    '_*  e#     Push a string of that many underscores.
    _2>  e#   Push a copy and remove the first two underscores.
    N    e#   Push a linefeed.
    @    e#   Rotate the longer string of underscores on top of it.
    h'A+ e#   Add H to the character 'A', pushing the corresponding letter.
    '|  e#    Push a vertical bar.
    @   e#    Rotate the string of underscores on top of it.
    '|  e#    Push another vertical bar.
    6$  e#    Push a copy of the previous iteration (initially "").
  ]     e#   Wrap everything up to the former marker in an array.
}fH     e#

1

JavaScript (ES6), 162 bayt

n=>(a=[...Array(1<<n)]).map((_,i)=>i?(a[i]=String.fromCharCode(64+(n=1+Math.log2(i&-i)))+`|${"_".repeat(n)}|`,a[i-1]+='_'.repeat(--n&&--n)):a[i]='  _')&&a.join`\n`

\nDeğişmez satırsonu karakteri nerede .


\nmerak ediyor olsaydı, sonunda.
CalculatorFeline

1

Piton 2, 123 121 bayt

f=lambda n:n*[n]and f(n-1)+[n]+f(n-1)
L=f(input('  _\n'))
for i,j in zip(L,L[1:]+L):print'%c|%s|'%(64+i,'_'*i)+'_'*(j+~i)

ideone bağlantısı ( @xsot sayesinde -2 bayt)

fABACABA dizisini bir sayılar listesi olarak oluşturur, örn f(3) = [1, 2, 1, 3, 1, 2, 1]. ABACABA sekans zorluğuyla karşılaştırıldığında girişin 1 ile dengelenmesi, bir bayt girişine izin vermemizi sağlar f.

İlk satır ayrı olarak yazdırılır, daha sonra diğer tüm satırlar geçerli sayı ve sonraki sayı dikkate alınarak bir ifade kullanılarak yazdırılır. Sadece eğlence için ilk satır kullanılarak yazdırılır input().


Sen yerini alabilir [0]ile L.
xsot

@xsot Ah teşekkürler, bu oldukça iyi çalışıyor :) (tıpkı
xnor'ın

1

Pyth - 64 62 bayt

Muhtemelen daha fazla golf olabilir, ama şimdilik yeterince iyi.

Lsl.&Jhb_J"  _"Vtt^2Qpr@G=ZyN1p"|_"p*\_Zp\|W<=hZyhNp\_)d)"A|_|

Burada deneyin!

Açıklama:

            |Predefined vars: Q = evaluated input, G = lowercase alphabet
L           |Lambda definition. y(b) = return (following code)
   .&       |bitwise and
     Jhb    |J = b + 1, pass b + 1 to the bitwise and
        _J  |-J
  l         | base 2
 s          |̲c̲o̲n̲v̲e̲r̲t̲ ̲t̲o̲ ̲i̲n̲t̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲
          "  _"                              |print "  _" with a trailing newline
               Vtt^2Q                        |For N in 2^Q - 2
                     pr      1               |print in caps
                         =ZyN                |Z = y(N) remember the first lambda?
                       @G                    |G[Z], basically convert 1-26 to A-Z
                              p"|_"          |print "|_", no trailing newline
                                   p*\_Z     |print "_" Z times
                                        p\|  |̲p̲r̲i̲n̲t̲ ̲"̲|̲"̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲
                                           W<=hZyhN             |While ++Z<y(N+1)
                                                   p\_          |print "_"
                                                      )k        |end while,
                                                                |print newline
                                                        )"A|_|  |end for,
                                                                |print "A|_|"

0

Python 3,5 - 262 236 220 bayt:

@CatsAreFluffy sayesinde -16 bayt! Tüm fonksiyonum artık tek bir satırda olabilir! :)

from collections import*
def a(v):o=OrderedDict;j=[chr(i+97)for i in range(26)];d=o((j[i],('  '+'_'*(i+1)+'\n'+j[i]+'|'+'_'*(i+1)+'|'))for i in range(26));f=lambda w:'a'[w:]or f(w-1)+j[w]+f(w-1);[print(d[g])for g in f(v)]

Biraz uzun olabilir ve bina arasında yeni satırlar basabilir, ancak ihtiyaç duyduğu şeyi yapar. Onaylamak için kendiniz test edebilirsiniz.

DÜZENLE:

Önceki golf kodum ne olursa olsun doğru desen baskı vermedi. Ancak, şimdi yukarıda gösterilen ve benim görüşüme göre iyi yapıyor. Bunu onaylamak için kendiniz de çalıştırabilirsiniz.

Not: Program her "binanın" arkasındaki tüm küçük harfleri yazdırır. Umarım herşey yolundadır.

Açıklama ile birlikte yorum yapılmamış sürüm:

from collections import*
def a(v):
    o=OrderedDict # Assign the OrderedSict function to "o"
    j=[chr(i+97)for i in range(26)] # Create a list with all 26 lowercase letters of the alphabet
    d=o((j[i],('  '+'_'*(i+1)+'\n'+j[i]+'|'+'_'*(i+1)+'|'))for i in range(26)) # Create a dict assigning each letter it's corresponding building with its corresponding length
    f=lambda w:'a'[w:]or f(w-1)+j[w]+f(w-1) # Return the ABACABA sequence based on the user input
    [print(d[g])for g in f(v)] # Print out the building according to the sequence returned by the above lambda function (thanks to @CatsAreFluffy for this method to print it! :) )

Temelde yaptığım şey, önce koleksiyon modülünün Sıralı Sözlük işlevini içe aktarmak ve daha sonra sıralı bir sözlük oluşturmaktır. Daha sonra diziyi, kullanıcının girdisine göre, f=lambda w:"a"[w:]or f(w-1)+j[w]+f(w-1)işlevi kullanarak hesaplar ve daha sonra bunun döndürdüğü diziye dayanarak, her birinin arkasında karşılık gelen harf bulunan binalar yazdırılır.


Can you import OrderedDict as o instead? And changing op to p and item to j also works.
Rɪᴋᴇʀ

You can drop the if (all inputs are 1≤v≤26), change range(26) to range(v), and use return"\n".join(f(v)) instead of the for.
CalculatorFeline

-2bytes: use from collections import* and o=OrderedDict instead of from collections import OrderedDict as o
CalculatorFeline

@CatsAreFluffy Actually, changing range(26) to range(v) results in an Index Error. Also, doing return"\n".join(f(v)) will ONLY returns the sequence, but not the buildings themselves. Other than those, your tips were pretty good. Thanks! :)
R. Kap

Well, I don't quite have Python 3.5 (I've got 3.4.1), maybe it's time to upgrade...
CalculatorFeline

0

Ruby, 129 bytes

Anonymous function, returns a multiline string.

->x{a=->n{n<1?[]:(b=a[n-1];b+[n]+b)}
r="  _
"
a[x].zip(a[x][1,9**x]<<0).map{|n,m|r+=(64+n).chr+"|#{?_*n}|#{?_*(m+~n)if m>n}
"}
r}

0

JavaScript (ES6), 143

Çenelerin içinde önemli ve sayılan 2 yeni satır vardır.

n=>`  _
`+(r=n=>n?[...r(n-1),n,...r(n-1)]:[])(n).map((x,i,t,u=n=>'|'+'_'.repeat(n>0&&n))=>String.fromCharCode(x+64)+u(x)+u(t[i+1]-x-1)).join`
`

... ya da 138 harfler küçük olabilir.

n=>`  _
`+(r=n=>n?[...r(n-1),n,...r(n-1)]:[])(n).map((x,i,t,u=n=>'|'+'_'.repeat(n>0&&n))=>(x+9).toString(36)+u(x)+u(t[i+1]-x-1)).join`

Daha az golf

n=>{
  // recursive function for ABACABA returning an array of integers
  var r=n=>n?[...r(n-1),n,...r(n-1)]:[]
  // function to build "|__..."
  // if argument <=0 just returns the vertical bar
  var u=n=>'|'+'_'.repeat(n>0&&n)
  var t = r(n)
  t = t.map((x,i)=>
    // current building + extension to the len of next building if needed
    String.fromCharCode(x+64)+u(x)+u(t[i+1]-x-1)
  )
  return ' _\n' // the top line is fixed
    + t.join('\n')
}

Ölçek

solution=
n=>`  _
`+(r=n=>n?[...r(n-1),n,...r(n-1)]:[])(n).map((x,i,t,u=n=>'|'+'_'.repeat(n>0&&n))=>String.fromCharCode(x+64)+u(x)+u(t[i+1]-x-1)).join`
`

function update() {
  var n=+N.value
  if (n>=0 && n<=26) O.textContent=solution(n)
}

update()
#N { width: 2em }
N:<input id=N value=4 oninput='update()'><pre id=O></pre>


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.