Mimarların ufuk çizgisini görselleştirmelerine yardımcı olun


29

Bir şehir planlama projesinin bir parçası olarak, mimarlardan bir miktar girdi alındığında, şehir silüetini gösterecek bir program veya işlev oluşturma görevini aldınız. Proje sadece başlangıç ​​aşamasındadır, bu yüzden çok kaba bir taslak yeterlidir. En kolay yaklaşım elbette ASCII-sanatındaki ufuk çizgisini çizmektir.

Tüm binalar nehir kıyısında olacak, böylece hepsi aynı hizada olacak. Mimarlar her binanın yüksekliğini girdi olarak verecekler ve kodunuz ufuk çizgisini göstermelidir.

Mimarlardan gelen girdiler bir tam sayı veya yarım tam sayı olacaktır. Sayı bir tamsayıysa, binanın düz bir çatısı olurken, yarım bir tamsayı eğimli bir çatıya neden olur. Sıfır sadece düz zemin olacaktır. Bir binanın duvarları 3 karakter arasında, sıfır ise tek bir karakter genişliğinde olacaktır. Bitişik binalar duvarları paylaşır.

Çıktı ile ilgili detaylar ve açıklamalar için lütfen aşağıdaki örneklere bakınız:

N = 3
 ___
|   |
|   |
|___|

N = 3.5
  _      
 / \
|   |
|   |
|___|

N = 6
 ___
|   |
|   |
|   |
|   |
|   |
|___|

n = 0
_

Örnek giriş: 3 3.5 0 2

      _
 ___ / \  
|   |   |  ___
|   |   | |   |
|___|___|_|___|

Örnek giriş: 0 0 2.5 3 0 4 1

             ___
    _  ___  |   |
   / \|   | |   |
  |   |   | |   |___
__|___|___|_|___|___|

Louisville ,0 2 1 3.5 0 4 2 4 2 4 6 1 6 0 5 1

                                    ___     ___
                                   |   |   |   |  ___
           _    ___     ___     ___|   |   |   | |   |
          / \  |   |   |   |   |   |   |   |   | |   |
  ___    |   | |   |___|   |___|   |   |   |   | |   |
 |   |___|   | |   |   |   |   |   |   |___|   | |   |___
_|___|___|___|_|___|___|___|___|___|___|___|___|_|___|___|

Kullanılan ASCII karakterleri: yeni satır, boşluk ve /\_|(kod noktaları 10, 32, 47, 92, 95, 124).

Kurallar:

  • Tüm sayıları iki ile çarparak sadece tamsayı olarak alan bir program yapmak isteğe bağlıdır. Yani, almak yerine, 3 3.5 2programınız alabilir 6 7 4. İkinci giriş formatı seçilirse, 6 girişi 3 katlı bir binaya, 7'si ise eğimli çatıları olan 3 katlı bir binaya yol açmalıdır.
  • Çıktı tam olarak yukarıda açıklandığı gibi olmalıdır, ancak sondaki boşluklar ve yeni satırlar tamamdır.
  • Girişin tam formatı isteğe bağlıdır. Dilinde en iyisi ne.
  • Sonuç ekranda gösterilmelidir, böylece mimarlar buna bir göz atabilirler.
  • Verilen en az bir tamsayı olacağını ve yalnızca geçerli girdi verileceğini varsayabilirsiniz.

Bu codegolf, yani bayttaki en kısa kod kazanıyor.


1
0,5 yüksekliğinde bir bina nasıl görünür?
Tom Carpenter

Gerçekten düşünmedim. En belirgin seçim, neredeyse bir hobbit evi gibi, sadece eğimli bir çatı olurdu :-) ama seçmekte özgürsünüz ya da girişin asla 0,5 olamayacağını varsayıyorsunuz ...
Stewie Griffin

1
Şu anda duvarlar olmadığı için garip şeyler oluyor (0,5 yüksek olduğunu varsaydım), bu yüzden cevabım üzerinde biraz çalışmak zorunda kalacağım.
Tom Carpenter,

Kodunuzu sadece 0,5 yüksekliğinde denedim ve katılıyorum, "garip" çok açıklayıcı bir kelimedir. son derece geçerli, 0.5 bina olmadığını varsayabilirsin ...
Stewie Griffin

Yanıtlar:


5

Python 2, 199 193 188 185 bayt

a=map(int,raw_input().split())
l=max(a)+1|1
while~l:print''.join((x%2*'/  _\\ '[x<l::2]*(x<=l<x+4)or'_ '[x|1!=l>1]*3)[x<1:x+2]+'| '[x<=l>=y]*(x+y>0)for x,y in zip([0]+a,a+[0]))[1:];l-=2

Bu, tamsayıları girdi olarak kabul eden tam bir programdır. Örnek giriş .


olağanüstü! Gelecekteki golf oynamak için bu püf noktalarından bazılarını çalmam gerekiyor ...
quintopia 3

5

MATLAB, 219 209 203 bayt

i=input('');x=1;c=0;m(1:4*numel(i))='_';for a=i;b=fix(a);m(1:b,x)='|';s=95;if a~=b;m(b+2,x+2)=95;s='/ \';end;m(b+1,x+(1:3))=s;x=x+(a>0)*3+1;m(1:b,x)='|';x=x+(a<1&c>0);c=a;end;disp(flipud(m(:,1:x-(a<1))))

Bu maalesef Octave'da işe yaramıyor . Tamamen neden tam olarak emin değil, kırılan disp / flipud bit ile ilgisi var gibi görünüyor.

Ayrıca, halihazırda 0,5 yüksekliğinde bir binanın neye benzediğini veya bunlardan bahsetmediğini tanımlamamıştır, bu yüzden bu kodda izin verilmeyen olduklarını kabul ediyorum.

Kod biraz daha okunabilir bir şekilde:

i=input(''); %e.g. [0 0 2 1 3.5 0 4 2 4 2 4 6 1 6 0 5 1 0 0 1 0]
x=1;
c=0;
m(1:4*numel(i))='_';
for a=i;
    b=fix(a);
    m(1:b,x)='|';
    s=95;
    if a~=b;
        m(b+2,x+2)=95;
        s='/ \';
    end;
    m(b+1,x+(1:3))=s;
    x=x+(a>0)*3+1;
    m(1:b,x)='|';
    x=x+(a<1&c>0);
    c=a;
end;
disp(flipud(m(:,1:x-(a<1))))

İlk önce bir girdi olarak bir dizi alırız ve bazı değişken başlatmalar yaparız.

i=input(''); %e.g. [0 0 2 1 3.5 0 4 2 4 2 4 6 1 6 0 5 1]
x=1;
c=0;

Sıfır yüksekliğindeki binalar bir acı olduğu için - temelde yanlarında olduklarına bağlı olan bir genişliğe sahiptirler (basılanlar değişmese de), tüm binalar için yeterli zemin çizerek işleri basitleştiririz. Her bir binanın 4 karakter genişliğinde olacağını varsayıyoruz (çünkü bitişik binalar bir araya geliyorlar) - sıfır yükseklik olanlar değil, ancak fazlası daha sonra kesilecek.

m(1:4*numel(i))='_';

Şimdi sırayla her binayı çiziyoruz.

for a=i

Öncelikle, kaç tane | | | ihtiyacımız var.

    b=fix(a);

Şimdi bu bina için duvar çizin - eğer iki bitişik bina varsa, bu yeni bina için olan duvar son duvardaki duvarla aynı sütunda olacaktır.

    m(1:b,x)='|';

Bunun yarı yükseklikte bir bina olup olmadığını kontrol edin. Öyleyse, çatı farklı olacaktır. Yarı yükseklikler için, çatı / \tam yükseklikte olacağı gibi olacak ___(Matlab bunu tek bir alt çizgiden dolaylı olarak çoğaltacaktır, bu yüzden birkaç bayt kurtarın). Yarım yükseklikte binalar için bir satır daha yüksek olan ekstra bir çatı parçası vardır, bu yüzden de eklenir.

    s=95;
    if a~=b;
        m(b+2,x+2)=95;
        s='/ \';
    end;

Çatıya çizin

    m(b+1,x+(1:3))=s;

Şimdi bir sonraki binanın başlangıcına gidin ve paylaşılan duvarda çizin (duvar bu noktada çok kısa ise, bir sonraki bina çekildiğinde daha büyük olacaktır). Sıfır yüksekliğe sahip binaların 1 geniş, normal binaların 4 geniş olduğuna dikkat edin, bu nedenle (a> 0) bir Boole değil bir ondalık sayı olarak işleyerek başka bir if-if olanı basitleştiririz.

    x=x+(a>0)*3+1;
    m(1:b,x)='|';

Sırada, sıfır yüksekliğe sahip binalarla çalışmak biraz zorlaşıyor. Temel olarak bunun söylediği şey, eğer bu bina sıfır yüksekse ve ondan önceki bina değilse, bir sonraki binanın yeri 1 kadar artacaktır, çünkü diğer iki bina arasında sıkıştırılmış sıfır yükseklikte bir bina iki kat etkilidir - bu normalde bitişik bir bina ile paylaşılan ekstra duvarları hesaba katar. Ayrıca bir dahaki sefere bu kontrolü yapmak için bu binanın yüksekliğini takip ediyoruz.

    x=x+(a<1&c>0);
    c=a;
end;

Tamamlandığında, bina matrisini doğru yukarı gelecek şekilde çevirin ve görüntüleyin. Ayrıca burada fazlalıkları da azalttığımızı unutmayın.

disp(flipud(m(:,1:x-(a<1))))

Bu yüzden, bu senaryoyu çalıştırdığımızda, girdilerimiz istenir, örneğin:

[0 0 2 1 3.5 0 4 2 4 2 4 6 1 6 0 5 1 0 0 1 0]

Daha sonra binayı oluşturur ve sonucu görüntüler. Yukarıdaki giriş için aşağıdakiler üretilir:

                                     ___     ___                   
                                    |   |   |   |  ___             
            _    ___     ___     ___|   |   |   | |   |            
           / \  |   |   |   |   |   |   |   |   | |   |            
   ___    |   | |   |___|   |___|   |   |   |   | |   |            
  |   |___|   | |   |   |   |   |   |   |___|   | |   |___    ___  
__|___|___|___|_|___|___|___|___|___|___|___|___|_|___|___|__|___|_

Çok iyi yapılmış!
Stewie Griffin,

4

Kotlin, 447 442 bayt

val a={s:String->val f=s.split(" ").map{it.toFloat()}.toFloatArray();val m=(f.max()!!+1).toInt();for(d in m downTo 0){var l=0f;for(c in f){val h=c.toInt();print(if(h==d&&d!=0)if(h<l-0.5)"|" else{" "}+if(c>h)"/ \\" else "___" else if(h<d)if(d<l-0.5)"|" else{" "}+if(h==0)" " else if((c+0.5).toInt()==d)" _ " else "   " else{if(h==0)if(l<1)"  " else "| " else "|   "}.replace(' ',if(d==0)'_' else ' '));l=c;};if(d<l-0.5)print("|");println();}}

Ungolfed versiyonu:

val ungolfed: (String) -> Unit = {
    s ->

    val floats = s.split(" ").map { it.toFloat() }.toFloatArray()
    val maxH = (floats.max()!! + 1).toInt()

    for (drawHeight in maxH downTo 0) {
        var lastBuildingH = 0f
        for (f in floats) {
            val buildingH = f.toInt()
            if (drawHeight == 0) {
                // Baseline
                if (buildingH == 0)
                    if (lastBuildingH.toInt() == 0) print("__")
                    else print("|_")
                else print("|___")
            } else if (buildingH == drawHeight) {
                // Ceiling
                if (buildingH < lastBuildingH - 0.5) print("|")
                else print(" ")
                if (f > buildingH) print("/ \\")
                else print("___")
            } else if (buildingH < drawHeight) {
                // Above building
                if (drawHeight < lastBuildingH - 0.5) print("|")
                else print(" ")
                if (buildingH == 0) print(" ")
                else {
                    if ((f + 0.5).toInt() == drawHeight) print(" _ ")
                    else print("   ")
                }
            } else {
                if (buildingH == 0) print("| ")
                else print("|   ")
            }
            lastBuildingH = f;
        }
        if (drawHeight < lastBuildingH - 0.5) print("|")
        println()
    }
}

3

Python 2, 357 306 299 294 287 281 276 bayt

def s(l):
 d=len(l)+1;l=[0]+l+[0];h=(max(l)+3)/2;o=''
 for i in range(d*h):
  a=l[i%d+1];c=l[i%d];b=2*(h-1-i/d);o+="|"if(a>b+1)+(c>b+1)else" "*(a+c>0);o+=" _/__  _\\"[a-b+1::3]if b*(1>=abs(a-b))else" "*(1+2*(a>0))
  if b==0:o=o.replace(" ","_")
  if i%d==d-1:print o[:-1];o=''

Bu, işleve liste olarak iletilmek için "çift" kodlamasını kullanır. Düzenleme: Bir dizi seçici olarak büyük koşullu kısmın yinelenerek ve iki kat kodlamaya geçerek, bayt bayt. Koşulluyu daha da yeniden düzenleyerek ve daha fazla mantığı aritmetreye dönüştürerek daha fazla bayt tıraşlayın.

EDIT: xsot en iyisidir

Açıklama:

d=len(l)+1;l=[0]+l+[0];m=max(l);h=m/2+m%2+1;o=''

ddizinin uzunluğundan 1, çünkü listenin her bir ucuna ikinci elemandan sonuna eklediğimiz sıfıra sıfır ekleyeceğiz. hçizimin yüksekliğidir. (Bu hesaplamada 2'ye bölmek zorundayız, çünkü özel olarak her taraftaki halkalara döküm yapmak zorunda kalmamak için kullandığımız iki katlamalı gösterimi kullanıyoruz. Bu kadar tuhaf yükseklikleri bölmeden önce de 1 ekliyoruz - sivri binaları ... normal türden biraz daha fazla boşluk elde edin.) oçıkış dizesidir.

 for i in range(d*h):

Döngü için çift için tek bir döngü içine daraltmak için standart bir hile. Bir kere yapalım:

  a=l[i%d+1];c=l[i%d];b=2*(h-1-i/d)

Şimdi aynı şeyi başardık:

for b in range(2*h-2,-2,-2):
 for j in range(d):
  a=l[j+1];c=l[j]

ancak bizi on bayt ağa bağlayan bir şekilde (aşağıdaki satırlardaki boşluklar dahil) kaydedildi.

  o+="|"if(a>b+1)+(c>b+1)else" "*(a+c>0)

Burada en az bir bina sınırı olduğu sürece mevcut binanın ya da önceki binanın yüksekliğini mevcut çizgiden daha uzun olacak şekilde istediğiniz zaman bir duvar yapıştırın. Aşağıdaki koşullu eşdeğerdir:

  o+=("|" if a>b+1 or c>b+1 else " ") if a or c else ""

b mevcut tarama yüksekliğidir, a mevcut bina yüksekliğidir ve c önceki bina yüksekliğidir. Koşullu bölümün ikinci kısmı duvarların yer alanları arasına yerleştirilmesini önler.

  o+=" _/__  _\\"[a-b+1::3]if b*(1>=abs(a-b))else" "*(1+2*(a>0))

Binanın yüksekliğini mevcut tarama yüksekliğiyle karşılaştırarak çatı parçalarını seçerek doğru çatıyı çizen kısımdır. Eğer bir çatı buraya girmezse, uygun sayıda boşluk basar (gerçek bir bina olduğunda 3, örneğin, a> 0, aksi takdirde 1). Zemin seviyesindeyken asla çatı çizme girişiminde bulunmadığına dikkat edin, bu da 0,5 büyüklükteki binaların sivri çatı olmaması anlamına gelir. Oh iyi.

  if b==0:o=o.replace(" ","_")

Zemin seviyesindeyken, boşluk yerine alt çizgi istiyoruz. Hepsini bir kerede burada yerine koyuyoruz.

  if i%d==d-1:print o[:-1];o=''

Bir sonraki satırı işlemeye başlamadan hemen önce, geçerli olanı yazdırın ve çıkış satırını temizleyin. Son karakteri keseriz, çünkü fonksiyonun başına sıfır ekleyerek eklediğimiz zemin boşluğuna karşılık gelen "_" olur. (Bu sıfırı ekledik, böylece sağ duvar eklemek için özel bir durum eklemek zorunda kalmayacağız, varsa, 0 ekleyerek ve "_" yi keserek eklediğimizden çok daha fazla kod ekleyecektik.)


Araç-golf. Vay. (Ayrıca, +1)
alkış

2

Python 3

725 bayt

608 bayt

Golf kodu:

import sys,math;
m,l,w,s,bh,ls,ins,r,a="|   |","___","|"," ",0,[],[],range,sys.argv[1:]
def ru(n):return math.ceil(n)
def bl(h,n):
    if(n>ru(h)):return(s*5,s)[h==0]
    if(h==0):return"_"
    if(n==0):return w+l+w
    if(n<h-1):return m
    return("  _  "," / \ ")[n==ru(h)-1]if(h%1)else(s+l+s,m)[n==h-1]
for arg in a:
    f=ru(float(arg))
    if(bh<f):bh=f
for i in r(bh,-1,-1):
    ln=""
    for bld in a:ln+=bl(float(bld),i)
    ls.append(ln)
for i in r(len(ls[-1])-1):
    if(ls[-1][i]==ls[-1][i+1]==w):ins.append(i-len(ins))
for ln in ls:
    for i in ins:ln=(ln[:i]+ln[i+1:],ln[:i+1]+ln[i+2:])[ln[i]==w]
    print(ln)

İşte kodlanmamış kod. Bazı yorumlar var, ancak temel fikir çift duvarlı binalar yaratmak, yani sonuç şu:

_|___||___|_|___||___|

Daha sonra bu çifte duvarların indekslerini almak ve bu sütunları kaldırmak için şöyle:

_|___|___|_|___|___|

Kod:

import sys
import numbers
import math

mid="|   |";
l="___";
w="|";
s=" ";

def printList(lst):
    for it in lst:
        print(it);

# h = height of building
# l = line numeber starting at 0
def buildingline(h,n):
    #if (h==0):
    #   return " " if(n>math.ceil(h)) else "   ";
    if(n>math.ceil(h)):
        return s if(h == 0) else s*5;
    if(h==0): return "_";
    if(n==0): return w+l+w;
    if(n<h-1): return mid;
    if(h.is_integer()):
        return mid if(n==h-1) else  s+l+s;
    else:
        return " / \ " if (n==math.ceil(h)-1) else "  _  "; 
# max height
bh=0;

for arg in sys.argv[1:]:
    f = math.ceil(float(arg));
    if(bh<f):bh=f;

# lines for printing
lines = []

for i in range(bh,-1,-1):
    line="";
    for bld in sys.argv[1:]:
        bld=float(bld);
        line += buildingline(bld,i);
        #lh = bld;
    lines.append(line);

#for line in lines:
#   print(line);
#printList(lines);


# column merging
#find indexes for merging (if there are | | next to each other)
indexes = [];
for i in range(len(lines[-1])-1):
    if (lines[-1][i]=='|' and lines[-1][i+1] == '|'):
        indexes.append(i-len(indexes));

#printList(indexes);

#index counter
for line in lines:
    newLine = line;
    for i in indexes:
        if newLine[i] == '|' :
            newLine=newLine[:i+1] + newLine[i+2:];
        else : newLine = newLine[:i] + newLine[i+1:];
    print(newLine);

Biraz golf yapma zamanı!


Sen bir göz atmak isteyebilirsiniz burada . Ben ... korkuyorum şey özgü öneremez yüzden sadece temel Python biliyorum) = golf potansiyeli burada bir sürü olduğunu düşünüyorum
Stewie Griffin

Bana öyle görünüyor ki, boşlukları kaldırmış ve değişken isimlerini kısaltmışsınız, ancak gerisini değiştirmeden tuttunuz. Sen zeki yollar bulmaya çalışmalısınız örneğin olsun vb Tabii ki, böyle şeyler az karşılaştırmaları kullanın bazı döngüler kurtulmak ru(n):return math.ceil(n)golf gibi sayar, ama yine de ... olumsuz yönde bu yapmayız Lütfen, ben bir değilim kendime iyi bir golfçü ve kesinlikle iyi bir programcı olarak cehennem. Biraz geliştirmeyi denemenizi öneririm ... Kısaltmayı başardığınızı fark ettiğinizde gerçekten eğlenceli. Birkaç gün önce birçok ila 120 ila 55 arasında gittim. Yani, yeni olsanız bile mümkün.
Stewie Griffin

@StewieGriffin Bu bağlantı için teşekkür ederiz! Ben gerçekten kod-golf oynamaya yeni başlayan biriyim, bu yüzden benim için kod-golf yapmak yerine asıl görevi tamamlamakla ilgili daha fazla şey var. Ama çeşitli dillerin olanaklarını keşfetmek şaşırtıcı
Cajova_Houba 30:15

FTR: Bunun gibi daha karmaşık zorluklardan bazıları için, sadece kendim bitirdiğim için mutlu olurum =)
Stewie Griffin 13

2

PHP, 307 297 293 bayt

<?$r=str_pad("",$p=((max($argv)+1)>>1)*$w=4*$argc,str_pad("\n",$w," ",0));for(;++$i<$argc&&$r[$p++]=_;$m=$n)if($n=$argv[$i]){$q=$p+=!$m;eval($x='$r[$q-1]=$r[$q]=$r[$q+1]=_;');for($h=$n>>1;$h--;$q-=$w)$r[$q-2]=$r[$q+2]="|";$n&1?($r[$q-1]="/")&($r[$q-$w]=_)&$r[$q+1]="\\":eval($x);$p+=3;}echo$r;

Argümanları * 2 komut satırından alır. dosyaya kaydet, çalıştır php <filename> <parameters>.

Yıkmak

// initialize result    
$r=str_pad("",              // nested str_pad is 3 bytes shorter than a loop
    $p=                     // cursor=(max height-1)*(max width)=(start of last line)
    ((max($argv)+1)>>1)     // max height-1
    *
    $w=4*$argc              // we need at least 4*($argc-1)-1, +1 for newline
    ,
    // one line
    str_pad("\n",$w," ",0)  // (`str_pad("",$w-1)."\n"` is one byte shorter,
);                          // but requires `$w+1`)

// draw skyline
for(;
    ++$i<$argc              // loop through arguments
    &&$r[$p++]=_                // 0. draw empty ground and go one forward
    ;
    $m=$n                       // 7. remember value
)
    if($n=$argv[$i])            // if there is a house
    {
        $q=                         // 2. copy $p to $q
        $p+=!$m;                    // 1. go one forward if there was no house before this
        // offset all further positions by -2 (overwrite empty ground, share walls)
        eval($x=                    // 3. draw floor
        '$r[$q-1]=$r[$q]=$r[$q+1]=_;'
        );
        for($h=$n>>1;$h--;$q-=$w)   // 4. draw walls
            $r[$q-2]=$r[$q+2]="|";
        $n&1                        // 5. draw roof
            ?($r[$q-1]="/")&($r[$q-$w]=_)&$r[$q+1]="\\"
            :eval($x)               // (eval saved 7 bytes)
        ;                           // (ternary saved 6 bytes over `if`)
        $p+=3;                      // 6. go three forward (5-2)
    }

// output
echo$r;

1

C ++, asılsız

(veya belki ungolfable)

100'den az eleman bulunduğunu ve her elemanın 100'den az olduğunu varsayalım s. Binaların sayısı (girişte gerekli).

#include <iostream>
using namespace std;
int main()
{
float a[100];
int i,j,s;
cin>>s;
for(i=0;i<s;++i)
 cin>>a[i];
for(i=100;i>=1;--i)
{
for(j=0;j<s;++j)
{
if((a[j]>=i)||(a[j-1]>=i))
 cout<<"|";
else
 cout<<" ";
if(i==1)
 cout<<"___";
else if(a[j]+1==i)
 cout<<"___";
else if(a[j]+1.5==i)
 cout<<" _ ";
else if(a[j]+0.5==i)
 cout<<"/ \\";
else cout<<"   ";
}
if(a[s-1]>=i)
 cout<<"|";
cout<<endl;
}
}

Çıktıda birkaç hata var ... Zemin 3 karakter genişliğinde (sadece 1 olmalı) ve son duvar eksik.
Stewie Griffin

@StewieGriffin Bunu gönderdiğimde hala hataları çözüyordum. 1. Son duvarı ekledim. 2. Zeminin 3 karakter genişliğinde olması gerekir, çünkü eğik tavan / _ \ 3 karakter genişliğindedir.
ghosts_in_the_code

1
* Binalar arasındaki zemin , içeride değil.
Stewie Griffin

Hala üzerinde çalışıyorsanız, beklemek isteyebilirsiniz, ancak yeni satırları ve girintileri kaldırırsanız birçok bayttan kurtulabilirsiniz . Temel sorunu çözmedim , ancak bu 401 yerine .346 bayt çalışıyor .
Stewie Griffin

@StewieGriffin Zaten çok uzun zamandan beri golfe cevap vermek istemiyorum. İddiaya girerim, 100 baytın altında daha iyi diller vardır. Bu yüzden kodum, başkalarına daha çok bir referans çözümdür.
ghosts_in_the_code
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.