Buat kota ABACABA


17

Inilah kota ke-3 ABACABA:

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

Itu dibuat dari urutan ABACABA , yang pada dasarnya adalah:

  • A (iterasi 1)
  • tempat B - AB
  • repeat A - ABA (iterasi ke-2)
  • Tempat C - ABAC
  • Ulangi ABA - ABACABA (iterasi ke-3)

dan Anda mendapatkan idenya.

Bangunan-bangunan memiliki ketinggian (sesuai dengan no. Garis bawah) sama dengan huruf yang dikonversi ke angka sebagai A = 1, B = 2 dll

Memasukkan

Angka iterasi 1 <= n <= 26.

Keluaran

Kota pesanan ABACABA n , termasuk huruf-huruf di awal baris.


@ DonMuesli Haha ya. Akan hyperlink yang dimaksud.

1
Apa yang perlu kita hasilkan ketika angkanya lebih tinggi dari 26?
Adnan

Ya tolong: D (itu tidak akan mudah kan?)

1
Itu tidak akan dihitung sebagai input yang valid.

2
Bisakah input menjadi nol, dan jika demikian, apa yang seharusnya menjadi output? Juga, tidak ada salahnya untuk mendaftar pertama, katakanlah, 4 input dan output yang diharapkan.
Zgarb

Jawaban:


6

Python 2, 82 byte

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

Saya perhatikan tidak ada yang memposting metode rekursi biner dan memutuskan untuk mencobanya ... dan sekarang dengan trik yang dipinjam dari Sherlock9, itu adalah jawaban python terpendek! (Juga, terima kasih kepada xnor untuk satu pemendekan lagi.) (Dan kemudian Dennis yang mencukur lebih banyak ...)

Tidak Disatukan:

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())

Saya pikir saya mengerti ini dan itu cukup pintar. Saya benar-benar melewatkan rekursi yang bagus ini. Anda dapat menyimpan beberapa karakter dengan menggabungkan ke kedua sisi daripada menyimpan s, dan dengan membuat baris kedua fungsi anon:f=lambda n:n*"?"and f(n-1)+"_"*(n-2)+"\n%c|%s|"%(64+n,"_"*n)+f(n-1);lambda n:" _"+f(n)
xnor

Saya sedang berpikir untuk melakukan itu selanjutnya ...
quintopia

@quintopia f=lambda n,s=1:n*"_"and" _"*s+f(n-1,0)+"_"*(n-2)+"\n%c|%s|"%(64+n,"_"*n)+f(n-1,0)seharusnya bekerja.
Dennis

@ Dennis saya sarankan menerapkan solusi di atas dalam Pyth. Saya menduga itu bisa lebih pendek dari 59 byte ... Saya akan melakukannya, tetapi pada titik ini, hanya setengah dari milik saya ...
quintopia

1
81 byte sebagai program, sama panjangnya dengan fungsi.
xnor

3

Python 2, 99 byte

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

Untuk menemukan inomor urutan ABACABA, tulis idalam biner, hitung jumlah nol yang tertinggal, dan tambahkan satu. Kami menggunakan trik bit klasik i&-iuntuk menemukan kekuatan terbesar dari 2pembagian itu i, lalu menghitung panjang bit. Sebenarnya, kami menghitung imundur dari 2**n-1ke 0, yang baik-baik saja karena urutan ABACABA simetris.

Kami melacak nomor saat ini dan terakhir dari urutan dengan bantuan variabel "sebelumnya" b. Ini memberitahu kita berapa banyak garis bawah untuk dicetak sebagai "overhang". Bangunan akhir digambar dengan benar tanpa overhang karena 0diperlakukan memiliki panjang bit 1.

Format string untuk pencetakan diambil dari Sp3000 , seperti trik menggunakan inputuntuk mencetak baris pertama.


3

MATL , 59 byte

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

Ini menggunakan rilis saat ini (15.0.0) dari bahasa.

Cobalah online!


(Jika huruf tidak harus dimasukkan dalam output: berikut ini akan berfungsi, 48 byte):

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

Penjelasan

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

Jawaban yang sangat bagus, tetapi Anda juga perlu menampilkan huruf-huruf di depan gedung: p.
Adnan

Terpecahkan. Menunggu klarifikasi OP
Luis Mendo

1
Saya sebenarnya sudah menanyakan hal ini, tetapi saya menghapus komentar saya. Ini adalah responsnya: p.
Adnan

Solusi yang sangat elegan.

2

CJam, 37 35 byte

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

Ini adalah implementasi berulang dari algoritma rekursif dari jawaban @ quintopia .

Cobalah online!

Bagaimana itu bekerja

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 byte

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`

Di mana \nkarakter baris baru literal.


\npada akhirnya, kalau ada yang bertanya-tanya.
CalculatorFeline

1

Python 2, 123 121 byte

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)

tautan ideone (-2 bytes berkat @xsot)

fmenghasilkan urutan ABACABA sebagai daftar angka, misalnya f(3) = [1, 2, 1, 3, 1, 2, 1]. Offset input dengan 1 dibandingkan dengan tantangan urutan ABACABA memungkinkan kita bermain golf dalam satu byte f.

Baris pertama dicetak secara terpisah, setelah itu semua baris lainnya dicetak menggunakan ekspresi yang memperhitungkan angka saat ini dan angka berikutnya. Hanya untuk bersenang-senang, baris pertama dicetak menggunakan input().


Anda bisa menggantinya [0]dengan L.
xsot

@ xsot Ah terima kasih, itu bekerja dengan cukup baik :) (seperti halnya xnor mengirim jawaban!)
Sp3000

1

Pyth - 64 62 byte

Mungkin bisa bermain golf lebih banyak, tetapi cukup bagus untuk saat ini.

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

Coba di sini!

Penjelasan:

            |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 byte:

-16 byte terima kasih kepada @CatsAreFluffy! Seluruh fungsi saya sekarang akhirnya bisa dalam satu baris! :)

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

Mungkin agak panjang, dan mungkin mencetak baris baru di antara membangun, tetapi dalam melakukan apa yang dibutuhkan. Anda dapat mengujinya sendiri untuk mengonfirmasi.

EDIT:

Kode golf saya sebelumnya tidak mencetak pola yang tepat sama sekali. Namun, sekarang yang ditunjukkan di atas tidak, dan itu baik menurut saya. Anda juga dapat menjalankannya sendiri untuk mengonfirmasi hal itu.

Catatan: Program ini mencetak semua huruf kecil di belakang setiap "bangunan". Saya harap tidak apa-apa.

Versi tidak dikolomisasi dengan Penjelasan:

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! :) )

Pada dasarnya apa yang saya lakukan adalah pertama-tama mengimpor fungsi Kamus Urutan modul koleksi, dan kemudian membuat kamus berurutan, dengan masing-masing huruf kecil dalam daftar "j" ditugaskan ke bangunan yang sesuai, dengan panjang yang sesuai di garis bawah. Kemudian saya menghitung urutan, berdasarkan input pengguna, menggunakan f=lambda w:"a"[w:]or f(w-1)+j[w]+f(w-1)fungsi, dan kemudian berdasarkan urutan yang dikembalikan oleh itu, bangunan, dengan huruf yang sesuai masing-masing di belakangnya, dicetak.


Bisakah Anda mengimpor OrderedDictsebagai ogantinya? Dan mengubah opke pdan itemuntuk jjuga bekerja.
Rɪᴋᴇʀ

Anda dapat menghapus if(semua input adalah 1≤v≤26), ubah range(26)ke range(v), dan gunakan return"\n".join(f(v))sebagai ganti for.
CalculatorFeline

-2bytes: gunakan from collections import*dan o=OrderedDictbukannyafrom collections import OrderedDict as o
CalculatorFeline

@CatsAreFluffy Sebenarnya, berganti range(26)ke range(v)hasil dalam Index Error. Juga, melakukan return"\n".join(f(v))HANYA akan mengembalikan urutan, tetapi bukan bangunan itu sendiri. Selain itu, tips Anda cukup bagus. Terima kasih! :)
R. Kap

Yah, saya tidak punya Python 3.5 (saya punya 3.4.1), mungkin sekarang saatnya untuk meningkatkan ...
CalculatorFeline

0

Ruby, 129 byte

Fungsi anonim, mengembalikan string multiline.

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

Ada 2 baris baru di dalam backticks yang signifikan dan dihitung.

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

... atau 138 jika hurufnya bisa huruf kecil.

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`

Kurang 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')
}

Uji

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>


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.