Kaderin Notu - bir personele not alın


19

Zombi kıyameti geldi ve dünya sona eriyor. Aniden, birisi geçerli saati, dakikayı ve günü alan bir formülü keşfeder ve onu duyan her zombi anında öldüren bir piyanoda çalmak için mükemmel notu çıkarır. Ne yazık ki, dünyada sadece bir piyano çalar kaldı ve notların nasıl okunacağını unuttu, ancak hala notaların nasıl okunacağını biliyor. Tabii ki, bu çok zamana duyarlı bir şey, bu yüzden bir bilgisayarın yapması doğal görünüyor. 1

Zorluğunuz, örneğin Gbir personele (tiz nota anahtarı) yerleştirilmiş notu aşağıdaki gibi not almaktır :

-----

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

-----

Şartname:

  • Alternatif satır -----(5 tire) ve boş satır içeren bir personel çıkarmalısınız. -----Toplam 5 s olacak . Not, bu personelin üzerine eklenmelidir.
  • Giriş, notun bulunduğu yeri belirtir. Giriş şu şekilde olacaktır:
    • isteğe bağlı Hveya L"yüksek" veya "düşük" belirtme
    • Bir mektup Aiçin Gsahaya belirterek,
    • isteğe bağlı #veya bkeskin veya düz belirtme.
  • "Not" şu şekilde tanımlanır:
    • Biri O(O sermayesi), notun yerinde olan personelin ortasına hizalanmıştır. (Üst satır HF(yüksek F) ve alt satır E(normal bir E).)
    • Üç |s (dikey çubuklar), gövde:
      • not orta satırda ( B) veya yukarısında ise, notun solunda bir boşluk ve aşağıya doğru (notun altında bir boşluk başlayarak ) veya
      • not orta satırın altındaysa, notun sağında bir boşluk ve notun üstünde bir boşluk başlayarak yukarı doğru gitme.
    • Girişte belirtilmişse, notun doğrudan solunda bir #veya bbir boşluk.
  • Not çok yüksek veya düşükse defter çizgileri eklenmelidir. Bu çizgiler ---(5'in aksine yalnızca 3 çizgi genişliğinde) olacaktır ve yalnızca not defteri satırlarının üstünde veya altında (sırasıyla üst / alt defter çizgileri için) görünür.
  • Fazla boşluklar istediğiniz yere yerleştirilebilir; örneğin, herhangi bir karakteri kaydetmenize yardımcı olursa, boş satırların boşluklara veya defter çizgilerinden sonra bir boşluğa sahip olmasını sağlayabilirsiniz.

Belirtimi daha kolay anlamak için satırların yanındaki tüm not adlarıyla birlikte bir görselleştirme:

      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)

Programınızı test etmek için kullanabileceğiniz bazı örnekler:

Giriş: HG#

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

-----

-----

-----

Giriş: LAb

-----

-----

-----

-----

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

Giriş: HB

  O
 |--
 |
-|---

-----

-----

-----

-----

Giriş: C

-----

-----

-----

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

Bu , bu yüzden bayt içindeki en kısa kod kazanacak!

1: en gerçekçi sergi evar! :-P


2
Soldan ziyade notun sağında #veya bsağında olması çok garip görünüyor ; gerçekten gerekli olan bu mu?
Thomas Baruchel

2
B # ve benzeri ne olacak? 1. olduğu gibi çizin; 2. reddetmek; 3. sessizce C dönüştürmek?
Dijital Travma

2
Tiz nota anahtarı içinde olması gerektiğini açıkça belirtmek daha iyi olabilir.
user12205

3
Bu denemeden için herkes kadar Füg ?
AJMansfield

3
@AJM Evet, ASCII sanatı olmalı.
Kapı tokmağı

Yanıtlar:


1

Golfscript, 211 210 209 197 195 192 karakter

En son Python sürümümün bir GolfScript sürümü olan (bu gönderi itibariyle) kazanmak için geliyor :

"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}/

Burada test edin (ilk 2 satır kullanıcı girişidir, normalde stdin'den gelir).

'Okunabilir' sürüm:

;"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
}/

Aaaaaave tekrar GolfScript tarafından dövüldü. :) ...
Martin Ender

@ m.buettner: Haha, hiç bitmiyor .. yine de şaşırtıcı derecede yakın!
Claudiu

1
Daha iyi! Şimdi yakalamak için sadece 6/9 bayt bulmam gerekiyor: D (bunu nasıl yapacağımı görmeme rağmen)
Martin Ender

@ m.buettner: 2 bayt daha kaldı! Her biri çok acımasız ... Şimdilik durmam gerekebilir. İyi şanslar!
Claudiu

2
Kanlı cehennem ... tam 209'unu dövdüğümü sandığımda. Sanırım pes ediyorum. GolfScript hakimdir. ;)
Martin Ender

6

Yakut - 271 267 252 249 234 229 220 214 karakter

Kelimenin tam anlamıyla Ruby'yi bunun için öğrendim. Yani kesinlikle aşağı golf iyileştirilmesi için yer var. Ya da gerçekten herhangi bir şey yapmak. Ama değiştirilebilir dizeleri olan bir dile ihtiyacım vardı. :)

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

Biraz soluksuz:

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

Önde gelen boş satırlara izin verilirse 2 karakterle 212 karaktere kadar kesebilirim . Bu çözüm, zaten yazdırılmayan satırları doldurmaz:

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

Lambda'nın adil oyunu mu? Sonra ilk yaklaşımla 210 karakter alabilirim

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

Veya boş satırları olan 207 karakter :

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}

Tabii ki, şimdi yapmanız gerekecek f.call("HGb").


Ha, tamamen yeni bir dil öğrenmek için +1! ;-) İşte bir ipucu: !x.nil?eşdeğerdir !x. Ve bir satır ifs için, if x;y;end;eşdeğerdir y if x. Ayrıca, bu dizede değişmez bir satırsonu kullanabilirsiniz.
Kapı tokmağı

@Doorknob teşekkürler, bunları çalışmaya çalışacağım!
Martin Ender

@ Doonono hm, sadece ifişe başladım . Eğer kullanırsam ?\n(demek istediğin buysa) bir boşluk eklemem gerekir, bu yüzden hiçbir şey kazanmam. Ve .nil?s'yi kaldırmak hiç işe yaramadı (her zaman için değerlendirildi true).
Martin Ender

Kelimenin tam anlamıyla iki tırnak arasına bir satırsonu eklemek istedim. Ve kaldırırken ekstra ebeveynlere ihtiyacınız olduğunu düşünüyorum .nil?, ancak karakterlerde buna değer.
Kapı tokmağı

Ah @Doorknob, hayır !x.nil?değildir !!x. :)
Martin Ender

2

Python, 329 309 295 286 280 277 karakter

Şimdi biraz daha golf. Yine de geliştirilebilir, ancak bu yaklaşımla yakut veya golfscript çözümlerini yenebileceğimden emin değilim.

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

Başlangıçta satır satır baskı yapıyordum, ancak çok fazla sürdüğü ortaya çıktı, bu yüzden bir dize ızgarası oluşturdum ve daha sonra doldurulması gerekenleri doldurdum. Giriş komut satırından, örneğin:

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

-----

-----

-----

5. satırda, ikinci virgülden önceki boşluğu kaldırabilirsiniz
user12205 24:14

@ace: Teşekkürler, bunu kaçırdım
Claudiu

2

GolfScript - 243 232 228 227 karakter

CoffeeScript yanıtımı dize manipülasyonları için çok daha uygun olan GolfScript'e çevirdim.

DÜZENLEME: Artış operatörünü düzgün kullanarak altı karakter, yığından iyi yararlanarak üç karakter, kullanmadığım operatörleri sorumsuzca yeniden tanımlayarak altı karakter ve zarafet satırlarından sonra sondaki alanı yazdırmayarak altı karakter daha kaydetti.

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

Yorumlarla:

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

Deneyimim olmayan bir dilde bir GolfScript çözümünü yenebilseydim çok şaşırırdım;)
Martin Ender

1
GolfScript uzmanı değilim ama sanırım bundan çıkacağım tüm karakterleri ekledim, bu yüzden başka bir tane bulabilirsen altınsın!
couchand

Yazmayı deneyin Go. çıktı olacak oo|||:)
Jamie

1

Python, 250 245 242 235 karakter

Diğerini yenerek ortaya çıkan çok farklı bir yaklaşım! Giriş işleme kodu benzer ancak bu kadar.

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

Her karakterin değerini satır ve sütuna göre eşledim ve ardından baskıyı golf oynadım:

#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, Son satır Pythonic şeylerden daha fazla Perl'in kara büyüsü gibi görünüyor
Antonio Ragagnin

1

Java - 921 907 863 karakter

Bir dizede her dizeyi depolayarak, her dizeyi ayrı ayrı inşa ediyorum. Sonra dizi boyunca döngü ve her satırı yazdırın.

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

Lütfen benden nefret etme, bu benim ilk seferim. Herhangi bir SSS / tanıtım bulamadım, bu yüzden yazı biçimimin iyi olduğunu umuyorum. İnsanların karakter sayıları hakkında ne kadar ciddi aldıklarından emin değilim ... kodun normal sürümü - ekstra satır sonu / boşluklar (1313 karakter):

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

Tonlarca gereksiz boşluk (özellikle noktalı virgüllerden sonra ve operatörler ve parantez ve parensler) ve uzun değişken isimleri (gibi args) görüyorum .
Kapı tokmağı

Karakter sayma gönderiminde: 921 karakter, tüm boşluklar gitti: P
Will_61

Her yerde beyaz alanlı ikinci gönderim, insanların ilk kez söylediği gibi kodu okumasına izin vermektir, bu yüzden karakter sınırını azaltmaya çalıştığınız yerde 1 gönderim ve 1 bırakmak isteyip istemediğimizden emin değilim ... ya da ne?
24_14 24:14

Hayır; Bu versiyonda çok fazla yararsız boşluk görüyorum. Örneğin, noktalı virgüllerden sonraki boşluklar, operatörlerin çevresindeki boşluklar, sonraki []boşluklar, parantez etrafındaki boşluklar, vb.
Kapı tokmağı

Hepsini şimdi
kaldırdım

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

Ungolfed sürümü:

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

Okuryazar CoffeeScript - 497 527 karakter

Şebekeyi inşa etmenin daha iyi bir yolu olduğundan eminim ama anlayamıyorum.

Bir golf yardımcısı.

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

Ac büyük ölçek ve personel.

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

Gösterim işlevimiz bir notun dize olarak temsilini alır.

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

Önce oktavı belirleyeceğiz.

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

Sonra not ve kazara. Yapıyı bozmayı sevmek lazım.

  [n,a]=i

Notu ve oktavı bir dizine dönüştürelim ve notu çizelim.

  x=7*o+s.indexOf n

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

Şimdi sadece ihtiyaç duyduğumuz kadar personeli keseceğiz.

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

Ve not kök.

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

Şimdi sonuçları çıktılayalım.

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

Son olarak, konsol testi işlevini dışa aktaracağız. Bu karakterler toplamı saymaz.

module.exports = f

Daha yakından baktığımda, not gövdesini yeniden düzenlerken berbatım gibi görünüyor, bu yüzden şu anda yasadışı çıktı üretiyor.
couchand


0

C 325 304

@Ace sayesinde 21 bayt daha kısa !

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

Çıktı:

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

-----

-----

-----

-----


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

-----

-----

-----

-----

 --| 
   | 
 --| 
 #O  

Genel değişken varsayılan olarak sıfıra ayarlanmıştır, bu nedenle başlatmanıza gerek yoktur ve ilk döngüden nkaldırabilirsiniz . i=0for
user12205 25:14

Ayrıca, ilk ififadede, ((i%12)&11)==0ile değiştirilebilir !((i%12)&11).
user12205 25:14

Son olarak, ?:daha çok düşük önceliğe sahiptir ^ve <daha önce durumların parantez kaldırmak böylece, ?. Ve printf("%s",ile değiştirebilirsiniz puts(.
user12205 25:14

0

JavaScript 390 388

Biraz meydan okuma, itiraf etmeliyim ... Eminim bunu daha da azaltmanın yolları var ... Önerilere açığım ...

İlk Yineleme

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

İkinci Yineleme ( n.slice(-1)yerine kullanarak n[n.length-1]), 2 bayt tıraş

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

Ungolfed sürümü:

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"));

Çözülmemiş (okunabilir) bir versiyon ekleyebilir misiniz?
Martin Ender

@ m.buettner Bitti ... Umarım ne yaptığımı daha iyi anlamanıza yardımcı olur :)
WallyWest
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.