The Note of Destiny - đặt một ghi chú cho nhân viên


19

Ngày tận thế zombie đã đến, và thế giới sắp kết thúc. Đột nhiên, một người nào đó phát hiện ra một công thức lấy giờ, phút và ngày hiện tại và phát ra nốt nhạc hoàn hảo để chơi trên cây đàn piano giết chết ngay lập tức mọi thây ma nghe thấy nó. Thật không may, chỉ có một người chơi đàn piano trên thế giới và anh ta đã quên cách đọc ghi chú, nhưng anh ta vẫn biết cách đọc bản nhạc. Tất nhiên, đây là một điều rất nhạy cảm với thời gian, vì vậy có vẻ tự nhiên khi có một máy tính làm điều đó. 1

Thách thức của bạn là ghi chú, chẳng hạn như G, và đưa ra ghi chú được đặt trên một nhân viên (trong khóa của âm bổng), như thế này:

-----

-----
   |
---|-
   |
--O--

-----

Đặc điểm kỹ thuật:

  • Bạn phải xuất ra một đội ngũ xen kẽ -----(5 dấu gạch ngang) và một dòng trống. Sẽ có -----tổng cộng 5 giây. Các ghi chú phải được đặt lên trên của nhân viên này.
  • Đầu vào sẽ chỉ định nơi ghi chú được đặt. Đầu vào sẽ là:
    • một tùy chọn Hhoặc L, chỉ định "cao" hoặc "thấp"
    • một lá thư từ Ađến G, chỉ định cao độ
    • một tùy chọn #hoặc b, chỉ định sắc nét hoặc bằng phẳng.
  • "Ghi chú" được định nghĩa là:
    • Một O(chữ O) thẳng hàng ở giữa của nhân viên, nằm ở vị trí của ghi chú. (Dòng trên cùng là HF(F cao) và dòng dưới cùng là E(E bình thường).)
    • Ba |s (thanh dọc), thân cây, sẽ là:
      • một khoảng trắng ở bên trái của ghi chú và đi xuống dưới (bắt đầu một khoảng trắng bên dưới ghi chú) nếu ghi chú nằm ở đường giữa ( B) trở lên, hoặc
      • một khoảng trắng ở bên phải của ghi chú và đi lên (bắt đầu một khoảng trắng phía trên ghi chú) nếu ghi chú nằm dưới đường giữa.
    • Một #hoặc bmột khoảng trắng trực tiếp bên trái của ghi chú nếu được chỉ định trong đầu vào.
  • Các dòng sổ cái phải được thêm vào nếu ghi chú quá cao hoặc thấp. Các dòng này sẽ có ---(chỉ có 3 dấu gạch ngang, trái ngược với 5) và sẽ chỉ xuất hiện nếu ghi chú ở trên hoặc trên / dưới (đối với các dòng sổ cái trên / dưới tương ứng) các dòng sổ cái.
  • Không gian bên ngoài có thể được đặt bất cứ nơi nào bạn muốn; ví dụ: bạn có thể làm cho các dòng trống có khoảng trắng hoặc có khoảng trắng sau các dòng sổ cái nếu nó giúp bạn lưu bất kỳ ký tự nào.

Đây là một hình ảnh trực quan, để hiểu đặc tả dễ dàng hơn, với tất cả các tên ghi chú bên cạnh các dòng:

      HB
 ---  HA
      HG
----- HF
      HE
----- HD
      HC
----- B
      A
----- G
      F
----- E
      D
 ---  C
      LB
 ---  LA
      LG
 ---  LF
... (bottom cut off for brevity, you get the idea anyway)

Dưới đây là một số ví dụ khác mà bạn có thể sử dụng để kiểm tra chương trình của mình:

Đầu vào: HG#

 #O
-|---
 |
-|---

-----

-----

-----

Đầu vào: LAb

-----

-----

-----

-----

-----
   |
 --|
   |
 bO-

Đầu vào: HB

  O
 |--
 |
-|---

-----

-----

-----

-----

Đầu vào: C

-----

-----

-----

-----
   |
---|-
   |
 -O-

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ giành chiến thắng!

1: evar triển lãm thực tế nhất! :-P


2
Nó trông rất lạ khi có #hoặc bở bên phải của ghi chú hơn là ở bên trái; nó thực sự là những gì được yêu cầu?
Thomas Baruchel

2
Còn B # và tương tự thì sao? 1. cốt truyện nguyên trạng; 2. từ chối; 3. âm thầm chuyển sang C?
Chấn thương kỹ thuật số

2
Có thể tốt hơn để nói rõ rằng nó nên ở trong khóa của âm bổng.
dùng12205

3
Bất cứ ai cũng cố gắng điều này trong Fugue ?
AJMansfield

3
@AJM Vâng, đó phải là nghệ thuật ASCII.
Doorknob

Câu trả lời:


1

Golfscript, 211 210 209 197 195 192 ký tự

Tham gia để giành chiến thắng (như bài đăng này), phiên bản GolfScript của phiên bản Python mới nhất của tôi :

"J"\+[0]+.1=71>>3<{}/@7*2/246-@3+7%-:z;:c;21,{..3z<3z
if<\11z>11z
if>|{;}{...2>\12<&\2%.{'-'' 'if}:Q~:9;&Q\.z={c!9{[c]''+}if}{..z>\4z+<&8z>&'|'9if}if\.z='o'9if\..z
4-\<\z<&7z<&'|'9if\;3$n}if}/

Kiểm tra nó ở đây (2 dòng đầu tiên là đầu vào của người dùng, thông thường nó đến từ stdin).

Phiên bản 'dễ đọc':

;"HCb"

"J"\+[0]+       #process input
.1=71>>3<       #first char is HJL, second is letter, third is #b or space
{}/             #spill chars onto stack, now we working with ints
@7*2/246-@3+7%- #convert HC/JD/LE etc to a number from 0 to 20
:z;:c;
21,{            #for r in range(21):
  ..3z<3z if<           #either out-of-bounds or process the line
  \11z>11z if>|
  {;}{
    ...2>\12<&\2%.{'-'' 'if}:Q~:9;&Q\        #1st char
    .z={c!9{[c]''+}if}                       #2nd char accidental
       {..z>\4z+<&8z>&'|'9if}if\            #2nd char stem or row
    .z='o'9if\                              #3rd char
    ..z 4-\<\z<&7z<&'|'9if\                 #4th char stem or row
    ;3$                                      #5th char=1st char
    n
  }if
}/

Aaaaaaand bị đánh bởi GolfScript một lần nữa. :) ...
Martin Ender

@ m.buettner: Haha, nó không bao giờ kết thúc .. thật đáng ngạc nhiên!
Claudiu

1
Tốt hơn! Bây giờ tôi chỉ cần tìm 6/9 byte để bắt kịp: D (mặc dù tôi không thấy cách mình sẽ làm điều đó)
Martin Ender

@ m.buettner: Giảm thêm 2 byte! Mỗi người đều rất tàn bạo ... Tôi có thể phải dừng lại ngay bây giờ. Chúc may mắn!
Claudiu

2
Ôi địa ngục đẫm máu ... ngay khi tôi nghĩ mình đã đánh bại 209. Tôi nghĩ tôi đang bỏ cuộc. GolfScript chiếm ưu thế. ;)
Martin Ender

6

Ruby - 271 267 252 249 234 229 220 214 ký tự

Tôi thực sự chỉ học Ruby cho việc này. Vì vậy, chắc chắn có chỗ để cải thiện việc chơi golf. Hoặc làm bất cứ điều gì thực sự. Nhưng tôi cần một ngôn ngữ với các chuỗi có thể thay đổi. :)

def f(n)s=[0]*20
s.fill{|i|i%2>0?i<3||i>11?" ---":?-*5:" "*5}
s[l=(3-n[(p="H_L".index n[0])?1:0].ord)%7+7*(p||1)][1,2]=("#b"[n[-1]]||s[l][1])+?O
s[l+3-2*o=l>7?3:1,3].map{|t|t[o]=?|}
puts s[[3,l].min..[11,l].max]end

Hơi vô dụng:

def f(note)
  staff=[]
  0.step(20) {|i| staff[i] = " "*5}
  1.step(19,2) {|i| staff[i] = " ---"}
  3.step(11,2) {|i| staff[i] = "-"*5}
  level = 7
  if !(pos="HL".index note[i=0]).nil?
    level = 14*pos
    i += 1
  end
  level += (73-note[i].ord)%7
  staff[level][2] = "O"
  mark = note[-1]
  if !"#b".index(mark).nil?
    staff[level][1] = mark
  end
  offset = (level > 7) ? 3 : 1
  staff[level-2*offset+3,3].map {|line| line[offset] = "|"}
  first = [3,level].min
  last = [11,level].max
  puts s[first..last]
end

Tôi có thể cắt nó bằng 2 ký tự khác xuống 212 ký tự nếu cho phép các dòng trống hàng đầu. Giải pháp này không điền vào các dòng không được in bằng mọi cách:

def f(n)s=[]
[3,l=(3-n[(p="H_L".index n[0])?1:0].ord)%7+7*(p||1)].min.step(l>11?l:11){|i|s[i]=i%2>0?i<3||i>11?" ---":?-*5:" "*5}
s[l][1,2]=("#b"[n[-1]]||s[l][1])+?O
s[l+3-2*o=l>7?3:1,3].map{|t|t[o]=?|}
puts s
end

Là trò chơi công bằng của lambda? Sau đó tôi có thể nhận được 210 ký tự với cách tiếp cận đầu tiên

f=->n{s=[0]*20
s.fill{|i|i%2>0?i<3||i>11?" ---":?-*5:" "*5}
s[l=(3-n[(p="H_L".index n[0])?1:0].ord)%7+7*(p||1)][1,2]=("#b"[n[-1]]||s[l][1])+?O
s[l+3-2*o=l>7?3:1,3].map{|t|t[o]=?|}
puts s[[3,l].min..[11,l].max]}

Hoặc 207 ký tự với các dòng trống bổ sung:

f=->n{s=[]
[3,l=(3-n[(p="H_L".index n[0])?1:0].ord)%7+7*(p||1)].min.step(l>11?l:11){|i|s[i]=i%2>0?i<3||i>11?" ---":?-*5:" "*5}
s[l][1,2]=("#b"[n[-1]]||s[l][1])+?O
s[l+3-2*o=l>7?3:1,3].map{|t|t[o]=?|}
puts s}

Tất nhiên, bây giờ bạn cần phải làm f.call("HGb").


Ha, +1 để học một ngôn ngữ hoàn toàn mới! ;-) Đây là một mẹo: !x.nil?tương đương với !x. Và đối với một dòng ifs, if x;y;end;tương đương với y if x. Ngoài ra, bạn có thể sử dụng một dòng mới theo nghĩa đen trong chuỗi đó.
Doorknob

@Doorknob cảm ơn, tôi sẽ cố gắng làm việc với những người trong!
Martin Ender

@Doorknob hm, tôi chỉ có việc ifđể làm. Nếu tôi sử dụng ?\n(nếu đó là những gì bạn muốn nói) tôi cần thêm một khoảng trắng, vì vậy tôi không thu được gì. Và loại bỏ các .nil?s không hoạt động (luôn luôn được đánh giá true).
Martin Ender

Tôi có nghĩa là thêm một dòng mới giữa hai trích dẫn. Và tôi nghĩ rằng bạn cần thêm parens khi gỡ bỏ .nil?, nhưng nó đáng giá trong các ký tự.
Doorknob

@Doorknob ah, không !x.nil?!!x. :)
Martin Ender

2

Con trăn, 329 309 295 286 280 277 ký tự

Chơi gôn thêm một chút bây giờ. Vẫn có thể được cải thiện, nhưng không chắc chắn liệu tôi có thể đánh bại các giải pháp ruby ​​hoặc golfscript bằng phương pháp này không.

R=range
N='J'+raw_input()+' '
X=N[1]>'G'
a,b,c=N[X:3+X]
z=266-ord(a)/2*7+(ord(b)-4)%7
Z=[list((' '*5,(' ---','-'*5)[8<r<18])[r%2])for r in R(21)]
Z[z][2]='o'
if' '<c:Z[z][1]=c
Q=(z<13)*2
for i in(1,2,3):Z[z+i*Q-i][Q+1]='|'
for r in R(max(17,z),min(z-1,8),-1):print''.join(Z[r])

Ban đầu tôi đang in từng dòng một, nhưng hóa ra nó tốn quá nhiều, vì vậy tôi tạo ra một chuỗi lưới và sau đó điền vào những gì cần điền vào. Đầu vào là từ dòng lệnh, ví dụ:

>echo HG# | python note2_golf.py
 #o
-|---
 |
-|---

-----

-----

-----

Trong dòng 5, bạn có thể xóa khoảng
trắng

@ace: Cảm ơn, đã bỏ lỡ cái đó
Claudiu

2

GolfScript - 243 232 228 227 ký tự

Tôi đã dịch câu trả lời CoffeeScript của mình sang GolfScript, phù hợp hơn nhiều với các thao tác chuỗi.

CHỈNH SỬA: Đã lưu sáu ký tự bằng cách sử dụng đúng toán tử gia tăng, ba bằng cách sử dụng tốt ngăn xếp, sáu ký tự bằng cách xác định lại các toán tử vô trách nhiệm mà tôi không sử dụng và một ký tự nữa bằng cách không in dấu cách sau các dòng duyên dáng.

Hoàn toàn chơi golf:

..0="HL"?2+3%:o)2%.@="CDEFGAB"?7o*+:`2%45 32if:r;
).2$,<{=}{;;r}if:&;
[" "5*:|" ---":g]4*[|"-"5*]5*+[|g|]+.
[`<~]\[`>([0=:^&79r^]''+\~]
+17`<`)18if<9`>`9if:j>:t 13`>.2*):x;
4,1>{`j-\2${+}{-}if}%\;
{.@<\t>(:v[x<'|'+x)v>+]\++:t}
/-1%n*

Với nhận xét:

# extract octave
..0="HL"?2+3%:o

# extract note
2%1\-.@="CDEFGAB"?7o*+:k

# line spacer
2%45 32if:r;

# extract accidental
1+.2$,<{=}{;;r}if:a;

# staff
[" "5*:|" --- ":g]4*[|"-"5*]5*+[|g|]+.

# lines below
[k<~]\

# note line and above
[k>([0=:w a 79r w]''+\~]+

# cut off just what we need
17k<1k+18if<
9k>k 9if:j>:t;

# and the note stem
13k>.2*1+:x;4,1>{k j-\2${+}{-}if}%\;

{
  .t<\
  t>(:v[x<'|'+1x+v>+]\++:t;
}/

# now output the note
t-1%n*

Tôi đã rất ngạc nhiên nếu tôi có thể đánh bại một giải pháp GolfScript bằng ngôn ngữ mà tôi không có kinh nghiệm;)
Martin Ender

1
Tôi không phải là chuyên gia về GolfScript nhưng tôi nghĩ rằng tôi đã loại bỏ tất cả các nhân vật mà tôi sẽ thoát khỏi điều này, vì vậy nếu bạn có thể tìm thấy hai người khác, bạn thật là vàng!
couchand

Hãy thử gõ Govào nó. nó sẽ xuất ra oo|||:)
Jamie

1

Con trăn, 250 245 242 235 ký tự

Một cách tiếp cận rất khác mà cuối cùng lại đánh bại người khác của tôi! Mã xử lý đầu vào là tương tự nhưng đó là về nó.

M=' -'
N=raw_input()+M
a,b,c=('J'+N)[N>'G':][:3]
z=ord(a)*7/2-246-(ord(b)+3)%7
for r in range(21):
 L=M[r%2];F=M[2<r<12and r%2]
 if min(3,z)<=r<=max(11,z):print F+((L,'|')[8>z<r<z+4],(L,c)[M<c])[r==z]+(L,'o')[r==z]+(L,'|')[z-4<r<z>7]+F

Tôi đã vạch ra giá trị của mỗi ký tự dựa trên hàng và cột và sau đó đánh gôn in:

#given row r, with note on row n, how to print each char?
#rows are:
#       HB : 0
#  ---  HA : 1
#       HG : 2
# ----- HF : 3
#       HE : 4
# ----- HD : 5
#       HC : 6
# ----- B  : 7
#       A  : 8
# ----- G  : 9
#       F  : 10
# ----- E  : 11
#       D  : 12
#  ---  C  : 13
#       LB : 14
#  ---  LA : 15
#       LG : 16
#  ---  LF : 17
#       LE : 18
#  ---  LD : 19
#       LC : 20
#chars are:
# 0 | 1 | 2 | 3 | 4
#
# 0,4:
#    if r%2:
#      if 2<r<12: '-'
#      else ' '
#    else: ' '
# 1: ' -b#|'
#    if r==n:
#      if A: c
#      else: ' -'[r%2]
#    elif n<8 and n<r<n+4: '|'
#    else: ' -'[r%2]
# 2: ' -o'
#    if r==n: 'o'
#    else: ' -'[r%2]
# 3: ' -|'
#    if n>7 and n-4<r<n: '|'
#    else: ' -'[r%2]

+1, Dòng cuối cùng có vẻ nhiều ma thuật đen của Perl hơn thứ Pythonic
Antonio Ragagnin

1

Java - 921 907 863 ký tự

Tôi xây dựng từng chuỗi riêng biệt, lưu trữ từng chuỗi trong một mảng. Sau đó lặp qua mảng và in ra từng dòng.

public class D{public static void main(String[]a){char[]z=a[0].toCharArray();char[]y=new char[3];y[0]=('H'==z[0]||'L'==z[0])?z[0]:'N';int o=(y[0]=='N')?0:1;y[1]=z[o++];y[2]=z.length>o?z[o]:'!';int n=y[1]<'C'?((int)(y[1]-'A'))+6:((int)(y[1]-'C'))+1;n=(y[0]=='N')?n+7:(y[0]=='H'?n+14:n);String s="     ";String b=" --- ";String[]u=new String[22];for(int i=1;i<=21;i+=2){u[i]=s;}for(int i=10;i<=18;i+=2){u[i]="-----";}u[20]=n>19?b:s;u[2]=n<3?b:s;u[4]=n<5?b:s;u[6]=n<7?b:s;u[8]=n<9?b:s;char c=u[n].charAt(0);char e=u[n].charAt(1);char[]h=new char[]{c,y[2]=='!'?e:y[2],'O',e,c};u[n]=new String(h);for(int i=0;i<22;i++){if(n<14&&i-n<4&&i>n)u[i]=u[i]!=null?u[i].substring(0,3)+"|"+u[i].charAt(4):s;else if(n>13&&n-i<4&&n>i)u[i]=u[i]!=null?u[i].substring(0,3)+"|"+u[i].charAt(4):s;}for(int i=21;i>=0;i--)if(!(i>n&&i>18||i<n&&i<10))System.u.println((u[i]==null)?s:u[i]);}}

Oh xin đừng ghét tôi, đây là lần đầu tiên của tôi. Tôi không tìm thấy bất kỳ faq / giới thiệu vì vậy tôi hy vọng định dạng đăng bài của tôi là ok. Không chắc chắn mức độ nghiêm trọng của mọi người về số lượng ký tự .... phiên bản thông thường của mã - thêm là ngắt dòng / dấu cách (1313 ký tự):

public class DisplayNote
{
  public static void main(String[] args)
  {
    char[] z=args[0].toCharArray();
    char[] y=new char[3];
    y[0]=('H'==z[0]||'L'==z[0])?z[0]:'N';
    int o=(y[0]=='N')?0:1;
    y[1]=z[o++];
    y[2]=z.length>o?z[o]:'!';

    int noteValue=y[1]<'C'?((int) (y[1] - 'A')) + 6:((int) (y[1] - 'C')) + 1;
    noteValue=(y[0]=='N')?noteValue+7:(y[0]=='H'?noteValue+14:noteValue);
    String s="     ";
    String b=" --- ";
    String[] out=new String[22];
    for (int i=1;i<=21;i+=2){out[i]=s;}
    for (int i=10;i<=18;i+=2){out[i]="-----";}
    out[20]=noteValue>19?b:s;
    out[2]=noteValue<3?b:s;
    out[4]=noteValue<5?b:s;
    out[6]=noteValue<7?b:s;
    out[8]=noteValue<9?b:s;

    char c=out[noteValue].charAt(0);
    char e=out[noteValue].charAt(1);
    char[] h=new char[]{c,y[2]=='!'?e:y[2],'O',e,c};
    out[noteValue]=new String(h);
    for (int i=0;i<22;i++)
    {
      if (noteValue<14&&i-noteValue<4&&i>noteValue)
        out[i]=out[i]!=null?out[i].substring(0,3)+"|"+out[i].charAt(4):s;
      else if (noteValue>13&&noteValue-i<4&&noteValue>i)
        out[i]=out[i]!=null?out[i].substring(0,3)+"|"+out[i].charAt(4):s;        
    }

    for (int i=21;i>=0;i--)
      if (!(i>noteValue&&i>18||i<noteValue&&i<10))
        System.out.println((out[i]==null)?s:out[i]);
  }
}

Tôi thấy hàng tấn khoảng trắng không cần thiết (đặc biệt là sau dấu chấm phẩy và xung quanh toán tử và dấu ngoặc và parens) và tên biến dài (như args).
Doorknob

Trong phần đệ trình đếm ký tự: 921 ký tự, tất cả khoảng trắng sẽ biến mất: P
Will_61

Đệ trình thứ hai với khoảng trắng ở khắp mọi nơi là để mọi người đọc mã, như tôi đã nói đây là lần đầu tiên của tôi nên không chắc chắn liệu chúng tôi có để lại 1 lần gửi và 1 khi bạn cố gắng giảm giới hạn ký tự không ... hay sao?
Will_61

Không; Tôi thấy một lượng lớn khoảng trắng vô dụng trong phiên bản đó. Ví dụ: khoảng trắng sau dấu chấm phẩy, khoảng trắng xung quanh toán tử, khoảng trắng sau []dấu cách, dấu ngoặc đơn, v.v.
Doorknob

Đã xóa tất cả chúng ngay bây giờ (tôi nghĩ) Cảm ơn :)
Will_61

1

Haskell 377C

import Data.Char
(<.)=elem
n(c:r)|elem c"HL"=let(s,a)=n r in(s+case c of 'H'->7;_-> -7,a)|1<2=(mod(ord c-67)7-2,case r of[]->' ';[x]->x)
r(s,a)y x=c where d|s>4= -1|1<2=1;c|x<.[0,4]&&(y<0||y>8)=' '|x==2&&y==s='o'|y==s&&x==1&&' '/=a=a|x==2+d&&y<.[s+k*d|k<-[1..3]]='|'|1<2="- "!!mod y 2
g p@(s,a)=unlines$[map(r p y)[0..4]|y<-reverse[min 0 s..max 8 s]]
main=getLine>>=putStr.g.n

Phiên bản bị đánh cắp:

import Data.Char

fromName ('H':s) = let (step, alter) = fromName s in ((step + 7), alter)
fromName ('L':s) = let (step, alter) = fromName s in ((step - 7), alter)
fromName (x:s) = (mod (ord x - 67) 7 - 2, if null s then ' ' else head s)

renderChar :: (Int, Char) -> Int -> Int -> Char
renderChar (step, alter) y x = let
    dir = if step >  4 then -1 else 1
    normal = "- "!!mod y 2
    stemYs = [step + k * dir | k <- [1..3]]
    c | elem x [0,4] && not(elem y [0,2,4,6,8]) = ' '
      | x == 2 && y == step = 'o'
      | y == step && x == 1 && alter /= ' ' = alter
      | elem y stemYs && x == 2 + dir = '|'
      | otherwise = normal
  in c

render :: (Int, Char)-> String
render (step, alter) = unlines [map (renderChar (step, alter) y) [0..4] | y <- ys] 
  where
    ys = reverse [min 0 step .. max 8 step]

main = getLine >>= (putStr.render.fromName)

0

Biết chữ CoffeeScript - 497 527 ký tự

Tôi chắc chắn có một cách tốt hơn để xây dựng lưới điện nhưng tôi không thể tìm ra nó.

Một người trợ giúp golf.

_=(q)->->q.split ""

AC quy mô lớn và nhân viên.

s=_("CDEFGAB")()
l=_ "-----"
e=_ "     "
g=_ " --- "
t=->
  o=[e(),l(),e(),l(),e(),l(),e(),l(),e(),l(),e(),g(),e()]
  o.unshift e(),g() for [0..3]
  o

Hàm ký hiệu của chúng tôi sẽ lấy biểu diễn chuỗi của một ghi chú.

f=(i)->
  o=1
  m=t()

Đầu tiên chúng ta sẽ xác định quãng tám.

  if /L|H/.test i[0]
    if i[0]=="L" then o=0 else o=2
    i=i[1..]

Sau đó là ghi chú và tình cờ. Yêu phải phân công giải mã.

  [n,a]=i

Hãy chuyển đổi ghi chú và quãng tám thành một chỉ mục và vẽ ghi chú.

  x=7*o+s.indexOf n

  m[x][1]=a if a
  m[x][2]='O'

Bây giờ chúng tôi sẽ cắt giảm chỉ có nhiều nhân viên mà chúng tôi cần.

  j=9
  k=17
  if x>17
    k=x
  else if x<9
    j=x
  u=x-j
  m=m[j..k]

Và thân cây ghi chú.

  if x<13
    m[x][3]='|' for x in [u+3...u]
  else
    m[x][1]='|' for x in [u-3...u]

Bây giờ hãy cho kết quả đầu ra.

  m.map((p)->p.join '').reverse().join '\n'

Cuối cùng, chúng tôi sẽ xuất chức năng để thử nghiệm bàn điều khiển. Những nhân vật này không được tính vào tổng số.

module.exports = f

Nhìn gần hơn có vẻ như tôi đã vặn vẹo khi tái cấu trúc gốc ghi chú, vì vậy nó tạo ra đầu ra bất hợp pháp tại thời điểm này.
couchand

Tôi đã sửa nó, nhưng nó đã thêm 30 ký tự: - /
couchand

0

C, 325 304

Bây giờ ngắn hơn 21 byte nhờ @ace !

i;j;c;n;main(t){char
x[133];for(i;i<132;i++){x[i]="-----\n     \n"[i%12];if((i<18||i>77)&&!((i%12)&11))x[i]=32;}for(;!n;){c=getchar();if(c>71)t=c^72?2:0;else
n=7*t+7-(c-4)%7;}x[i=n*6+2]=79;if((c=getchar())>32)x[i-1]=c;for(t=0,j=n<9?i+5:i-17;t<3;t++,j+=6)x[j]='|';x[n<13?77:n*6+5]=0;puts(x+(n>4?24:n*6));}

Đầu ra:

./a.out
HBb
 bO  
 |-- 
 |   
-|---

-----

-----

-----

-----


./a.out
LG#
-----

-----

-----

-----

-----

 --| 
   | 
 --| 
 #O  

Biến toàn cục được khởi tạo về 0 theo mặc định, vì vậy bạn không cần phải khởi tạo nvà bạn có thể xóa vòng lặp i=0đầu tiên for.
dùng12205

Ngoài ra, trong iftuyên bố đầu tiên , ((i%12)&11)==0có thể được thay thế bằng !((i%12)&11).
user12205

Cuối cùng, ?:có mức độ ưu tiên rất thấp so với ^<, vì vậy bạn có thể xóa dấu ngoặc của các điều kiện trước ?. Và bạn có thể thay thế printf("%s",bằng puts(.
dùng12205

0

JavaScript 390 388

Một chút thách thức, tôi sẽ phải thừa nhận ... Tôi chắc chắn có nhiều cách để giảm điều này hơn nữa ... Tôi sẵn sàng để đề xuất ...

Lặp lại đầu tiên

C=(a,x,o,c)=>{a[x]=a[x].substr(0,o)+c+a[x].substr(o+1)};l=7;s=[];for(i=21;i--;)s[i]="    ";for(j=1;19>j;j+=2)s[j]=" ---";for(k=3;12>k;k+=2)s[k]="-----";~(p="HL".indexOf((n=prompt())[i=0]))&&(l=14*p,i++);l+=(73-n.charCodeAt(i))%7;C(s,l,2,"O");m=n[n.length-1];"#"!=m&   "b"!=m||C(s,l,1,m);o=7<l?3:1;for(z=0;3>z;C(s,t=l-2*o+3+z++,o,"|"));S=s.splice(3<=l?3:l,11>=l?11:l);console.log(S.join("\n"))

Lặp lại thứ hai (sử dụng n.slice(-1)thay vì n[n.length-1]), cạo 2 byte

C=(a,x,o,c)=>{a[x]=a[x].substr(0,o)+c+a[x].substr(o+1)};l=7;s=[];for(i=21;i--;)s[i]="    ";for(j=1;19>j;j+=2)s[j]=" ---";for(k=3;12>k;k+=2)s[k]="-----";~(p="HL".indexOf((n=prompt())[i=0]))&&(l=14*p,i++);l+=(73-n.charCodeAt(i))%7;C(s,l,2,"O");m=n.slice(-1);"#"!=m& "b"!=m||C(s,l,1,m);o=7<l?3:1;for(z=0;3>z;C(s,t=l-2*o+3+z++,o,"|"));S=s.splice(3<=l?3:l,11>=l?11:l);console.log(S.join("\n"))

Phiên bản bị đánh cắp:

function C(a,x,o,c){
    a[x]=a[x].substr(0,o)+c+a[x].substr(o+1);
}
l=7;s=[];
for(i=21;i--;){
    s[i]="    ";
}
for(j=1;19>j;j+=2){
    s[j]=" ---";
}
for(k=3;12>k;k+=2){
    s[k]="-----";
}
i=0;n=prompt();
p="HL".indexOf(n[i]);
if(p>=0){
    l=14*p;i++;
}
l+=(73-n.charCodeAt(i))%7;
C(s,l,2,"O");
m=n.slice(-1);
if((m=="#")||m=="b"){
    C(s,l,1,m);
}
o=7<l?3:1;
for(z=0;3>z;z++){
    C(s,t=l-2*o+3+z,o,"|");
}
F=Math.min(3,l);
L=Math.max(11,l);
S=s.splice(F,L);
console.log(S.join("\n"));

Bạn có thể thêm một phiên bản không đọc được (có thể đọc được) không?
Martin Ender

@ m.buettner Xong ... Tôi hy vọng nó giúp bạn hiểu rõ hơn về những gì tôi đã làm :)
WallyWest
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.