Tạo một thành phố ABACABA


17

Đây là thành phố ABACABA thứ 3:

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

Nó được tạo ra từ trình tự ABACABA , về cơ bản là:

  • A (lần lặp thứ 1)
  • nơi B - AB
  • lặp lại A - ABA (lần lặp thứ 2)
  • Nơi C - ABAC
  • Lặp lại ABA - ABACABA (lần lặp thứ 3)

và bạn có được ý tưởng.

Các tòa nhà có chiều cao (tương ứng với số dưới của dấu gạch dưới) bằng với các chữ cái được chuyển đổi thành số là A = 1, B = 2, v.v.

Đầu vào

Số lặp 1 <= n <= 26.

Đầu ra

Thành phố ABACABA của đơn hàng n , bao gồm các chữ cái ở đầu dòng.


@DonMuesli Haha vâng. Sẽ siêu liên kết trong câu hỏi.

1
Chúng ta cần làm gì khi số lượng cao hơn 26?
Ad Nam

Có, xin vui lòng: D (mọi chuyện sẽ không dễ dàng phải không?)

1
Điều đó sẽ không được tính là đầu vào hợp lệ.

2
Đầu vào có thể bằng không, và nếu vậy, đầu ra phải là gì? Ngoài ra, sẽ không hại khi liệt kê 4 đầu vào và đầu ra dự kiến.
Zgarb

Câu trả lời:


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)

Tôi nhận thấy không ai đã đăng phương pháp đệ quy nhị phân và quyết định cho nó một shot ... và bây giờ với một mẹo mượn từ Sherlock9, đó là câu trả lời ngắn nhất về con trăn! (Ngoài ra, cảm ơn xnor vì đã rút ngắn thêm một lần nữa.) (Và sau đó Dennis, người đã cạo một số ít hơn ...)

Ung dung:

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

Tôi nghĩ rằng tôi hiểu điều này và nó khá thông minh. Tôi đã hoàn toàn bỏ lỡ đệ quy tốt đẹp này. Bạn có thể lưu một số ký tự bằng cách ghép vào cả hai bên thay vì lưu trữ svà bằng cách tạo dòng thứ hai thành hàm 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

Tôi đã suy nghĩ về việc làm tiếp theo ...
quintopia 30/03/2016

@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)nên làm việc.
Dennis

@Dennis tôi đề nghị thực hiện giải pháp trên trong Pyth. Tôi nghi ngờ nó có thể ngắn hơn 59 byte ... Tôi sẽ làm điều đó, nhưng tại thời điểm này, nó chỉ là một nửa của tôi ...
quintopia

1
81 byte là chương trình, cùng độ dài với hàm.
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

Để tìm isố thứ tự của chuỗi ABACABA, hãy viết inhị phân, đếm số lượng các số 0 ở cuối và thêm một số. Chúng tôi sử dụng thủ thuật bit cổ điển i&-iđể tìm ra sức mạnh lớn nhất của 2phép chia iđó, sau đó tính toán độ dài bit. Trên thực tế, chúng tôi đếm ingược từ 2**n-1đến 0, điều này là tốt vì trình tự ABACABA là đối xứng.

Chúng tôi theo dõi cả số hiện tại và số cuối cùng của chuỗi với sự trợ giúp của biến "trước" b. Điều này cho chúng ta biết có bao nhiêu dấu gạch dưới để in là "phần nhô ra". Tòa nhà cuối cùng được vẽ chính xác mà không cần nhô ra vì 0được coi là có chiều dài bit 1.

Định dạng chuỗi để in được lấy từ Sp3000 , như là mẹo sử dụng inputđể in dòng đầu tiên.


3

MATL , 59 byte

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

Điều này sử dụng bản phát hành hiện tại (15.0.0) của ngôn ngữ.

Hãy thử trực tuyến!


(Nếu các chữ cái không được đưa vào đầu ra: phần sau sẽ hoạt động, 48 byte):

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

Giải trình

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

Câu trả lời rất hay, nhưng bạn cũng cần xuất các chữ cái trước các tòa nhà: p.
Ad Nam

Giải quyết. Dù sao cũng đang chờ OP làm rõ
Luis Mendo

1
Tôi thực sự đã hỏi điều này, nhưng tôi đã xóa bình luận của tôi. Đây là phản hồi mặc dù: p.
Ad Nam

Một giải pháp rất thanh lịch.

2

CJam, 37 35 byte

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

Đây là một triển khai lặp lại của thuật toán đệ quy từ câu trả lời của @ quintopia .

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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`

Đâu \nlà nhân vật dòng chữ mới.


\nlà cuối cùng, nếu bất cứ ai đã tự hỏi.
Máy

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)

liên kết ideone (-2 byte nhờ @xsot)

ftạo ra chuỗi ABACABA dưới dạng danh sách các số, vd f(3) = [1, 2, 1, 3, 1, 2, 1]. Độ lệch của đầu vào bằng 1 so với thử thách chuỗi ABACABA cho phép chúng ta bỏ qua một byte f.

Dòng đầu tiên được in riêng, sau đó tất cả các dòng khác được in bằng biểu thức có tính đến số hiện tại và số tiếp theo. Chỉ để cho vui, dòng đầu tiên được in bằng cách sử dụng input().


Bạn có thể thay thế [0]bằng L.
xsot

@xsot À, cảm ơn, nó hoạt động khá tốt :) (giống như xnor đăng câu trả lời!)
Sp3000

1

Pyth - 64 62 byte

Có lẽ có thể được chơi golf nhiều hơn, nhưng đủ tốt cho bây giờ.

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

Hãy thử nó ở đây!

Giải trình:

            |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 nhờ @CatsAreFluffy! Toàn bộ chức năng của tôi cuối cùng có thể nằm trong một dòng duy nhất! :)

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

Nó có thể hơi dài, và nó có thể in các dòng mới ở giữa tòa nhà, nhưng thực hiện những gì nó cần. Bạn có thể tự kiểm tra để xác nhận nó.

BIÊN TẬP:

Mã đánh gôn trước đây của tôi không in đúng mẫu nào. Tuy nhiên, bây giờ cái được hiển thị ở trên, và nó làm nó tốt theo quan điểm của tôi. Bạn cũng có thể chạy nó cho chính mình để xác nhận điều đó.

Lưu ý: Chương trình in tất cả các chữ cái thường phía sau mỗi "tòa nhà". Tôi hy vọng điều đó ổn.

Phiên bản Ungolfed với Giải thích:

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

Về cơ bản những gì tôi đang làm trước tiên là nhập chức năng Từ điển theo thứ tự của mô-đun bộ sưu tập, sau đó tạo một từ điển theo thứ tự, với mỗi chữ cái viết thường trong danh sách "j" được gán cho tòa nhà tương ứng của nó, với độ dài tương ứng ở dưới. Sau đó, tôi tính toán chuỗi, dựa trên đầu vào của người dùng, sử dụng f=lambda w:"a"[w:]or f(w-1)+j[w]+f(w-1)hàm và sau đó dựa trên chuỗi được trả về bởi đó, các tòa nhà, với mỗi chữ cái tương ứng phía sau nó, được in ra.


Bạn có thể nhập OrderedDictnhư ođể thay thế? Và thay đổi opđến pitemđể jcũng làm việc.
Rɪᴋᴇʀ

Bạn có thể thả if(tất cả các đầu vào là 1≤v≤26), thay đổi range(26)đến range(v), và sử dụng return"\n".join(f(v))thay cho for.
Máy

-2byte: sử dụng from collections import*o=OrderedDictthay vìfrom collections import OrderedDict as o
Máy

@CatsAreFluffy Trên thực tế, thay đổi range(26)để range(v)kết quả trong một Index Error. Ngoài ra, làm return"\n".join(f(v))sẽ CHỈ trả về chuỗi, nhưng không phải chính các tòa nhà. Khác với những điều đó, lời khuyên của bạn là khá tốt. Cảm ơn! :)
R. Kap

Chà, tôi hoàn toàn không có Python 3.5 (Tôi đã có 3.4.1), có lẽ đã đến lúc nâng cấp ...
CalculatorFeline

0

Ruby, 129 byte

Hàm ẩn danh, trả về một chuỗi nhiều dòng.

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

Có 2 dòng mới bên trong backticks có ý nghĩa và được tính.

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

... Hoặc 138 nếu các chữ cái có thể viết thường.

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`

Ít chơi gôn

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

Kiểm tra

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>


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.