Ascii-art'ı daralt


12

Meydan okuma

Dize olarak veya standart girdi yoluyla yazdırılabilir ascii karakterlerin dikdörtgen bir ızgarası verildiğinde, boşluk olmayan karakterleri alttaki bir kazığa daraltan bir işlev veya program yazın.

Kurallar:

  • Çıktı, girdi ile aynı boyutlara ve karakterlere sahiptir.
  • A boşluk olmayan karakteri (row a,column b)bir boşluk karakteri olamaz ' 'de (a-1, b), (a-1,b-1)ya da (a-1,b+1)sıraları en alt kadar numaralandırılmıştır. Bunun sonucu olarak tüm dikey kazıklar yanlara doğru çökmelidir.
  • Boşluk olmayan bir karakter çoğu (initial height - final height)yerde sağa veya sola hareket edebilir (bkz.Şekil 1).
  • Resmin karakterleri ekrandan düşmeden daraltmak için yeterli alana sahip olduğunu varsayabilirsiniz.

Şekil 1: Sırasıyla @#$gösterildiği gibi karakterler için olası son konumlar x,y,z.

..............
...@..........
..xxx.........
.xxxxx...#....
xxxxxxx.yyy.$.

Karakterlerin daraltma sırası serbestçe seçilebilir. Sondaki boşluklar iyi değil ama sondaki satırsonları iyi.

Bu , bu yüzden bayt en kısa cevap kazanır!

Misal

                 (__)
                 (oo)
           /------\/
          / |    ||
         *  /\---/\
            ~~   ~~
..."Have you mooed today?"...

Bir olası çıktı:

 
 
 
                --(_
           /----|/|(o_)
          /|/~\---~\\/o)
..."Have*you~mooed~today?"...

Açıklığa kavuşturmak için, karakterlerin düşme şekli her seferinde rastgele oluşturulmak yerine sabit kodlanabilir mi?
ETHproductions

18
O inek sana ne yaptı? :(
FlipTack

@ETHproductions doğru. Örneğim, aşağıdan yukarıya, soldan sağa ama rastgele bir düzen veya başka bir şey kurallara uyulduğu sürece iyidir.
Angs

@ Flp.Tkc Sadece bir model.
Angs

1
Karpuz, bir karakter ekrandan düşerse, bu onların hatası değil, onların hatasıdır.
Angs

Yanıtlar:


4

JavaScript (ES6), 100 90 88 bayt

f=s=>s==(l=s.search`
`,s=s.replace(eval(`/(\\S)([^]{${l-1},${l+1}}) /`),` $2$1`))?s:f(s)
s=`                 (__)        
                 (oo)        
           /------\\/         
          / |    ||          
         *  /\\---/\\          
            ~~   ~~          
..."Have you mooed today?"...`
console.log(s)
console.log(f(s))

Dizenin en az iki satır ve tüm satırların eşit uzunlukta doldurulmuş olmasını gerektirir. Örnek görüntü için çıktı:

              ( --           
            /|---/|-(o__     
          */~~\---~\|\/o))   
..."Have you/mooed~today?"...

Mümkünse sağa unsurları taşımak için çalışır gibi, o Not *arasında düşmedi Haveve you.

Düzenleme: @ETHproductions sayesinde% 10 tasarruf sağlandı. @DanielIndie sayesinde 2 bayt daha kaydetti.

Retina 0.8.2 , 50 bayt

+`(?<=(.)*)(\S)(.*¶(?<-1>)?(?>(?<-1>.)*).?) 
 $3$2

Çevrimiçi deneyin! JavaScript yanıtım için biraz farklı bir yaklaşım, bu boşluk olmayan karakterin altındaki bir boşlukla eşleştirmek için bir dengeleme grubu kullanır; (?<-1>)?ise uzay sola bir sütun olmasını sağlar .?uzay bir sütun sağa olmasını sağlar.

Retina , 40 bayt

~0L$`.(.*)¶
+s`(\S)(.{$.1,$.&}) ¶ $$2$$1

Çevrimiçi deneyin! JavaScript yanıtımın bağlantı noktası. 0L$Atomik aşama girdi alır ve aslında bu durumda orijinal giriş değerlendirilir değiştirme yerine komutu ile sonuçlanan ikinci hattı iki uzunlukları yerine ~bileşik aşaması.


Bu harika bir algoritma! Bunu \niki basamağa indirmek için gerçek bir satırsonu ile değiştirebilirsiniz ;-)
ETHproductions

Ayrıca, l=s.search`\n` birkaç bayt tasarruf etmek için yapabileceğinizi düşünüyorum .
ETHproductions


@DanielIndie f=Özyineleme için gereklidir, ancak yine de bana 2 bayt kazandırır, teşekkürler!
Neil

haklısın, üzgünüm: P
DanielIndie

3

Python 2, 298 bayt

a=input()
L=len(a);s=' '
a=[list(s*L+l.ljust(L+max(map(len,a))))for l in a]
t=1
while t:
 t=0
 for y in range(L-1):
  for x in range(len(a[y])):
   c=a[y][x];C=a[y+1][x-1:x+2]
   if s!=c and s in C:t=1;a[y][x]=s;a[y+1][[[x+1,x][C[1]==s],x-1][C[0]==s]]=c
for l in map(''.join,a):print l[L:].rstrip()

Girdiyi dizeler listesi olarak alır (her satıra bir tane)

Örnek: Giriş:

['                 (__)',
'                 (oo)',
'           /------\/',
'          / |    ||',
'         *  /\---/\ ',
'            ~~   ~~',
'..."Have you mooed today?"...']

Çıktı:

              (
            -----/|-(o__
         //|~~\---~\|\/o))
..."Have*you/mooed~today?"...

3

C, 252 bayt

e=1,l,c,i,j,p,r,w,a[999];f(){while((i=getchar())>0)a[w++]=i,i<16?l++:0,l?0:c++;while(e)for(i=e=0;i<c;i++)for(j=l;j>=0;j--)e=(r=a[p=j*(c+1)+i]-32?a[r=p+c+1]-32?a[r=p+c]-32?a[r=p+c+2]-32?0:r:r:r:0)?l=a[p],a[p]=a[r],a[r]=l:e;for(i=0;i<w;)putchar(a[i++]);}

Açık test kodu:

#include <stdio.h>

e=1,l,c,i,j,p,r,w,a[999];
f()
{
    // counting lines and columns
    while ((i = getchar())>0)a[w++] = i, i<16 ? l++ : 0, l ? 0 : c++;
    // main shaking loop
    while (e) // repeat while collapsing
        for (i = e = 0; i < c; i++) // columns loop
            for (j = l; j >= 0; j--) // lines loop
                e = ( // remember that collapsing was
                     r = // find place to collapse
                         a[p = j*(c + 1) + i] - 32 ? // if not space
                             a[r = p + c + 1] - 32 ? // if char under the current is not a space
                                 a[r = p + c] - 32 ? // see one position left
                                    a[r = p + c + 2] - 32 ? 0 // then one position right
                                                          : r
                                    : r
                                 : r
                             : 0
                         ) ? // and if place was found
                           l=a[p],a[p]=a[r],a[r]=l // replace values in positions p and r
                           : e;
    //print resulting picture
    for(i=0;i<w;)putchar(a[i++]);
}

int main(void)
{
    int cnt;
    FILE * testf = fopen("caw.txt","w");
    char testd[][31] = {
        "                 (__)        \n",
        "                 (oo)        \n", 
        "           /------\\/         \n", 
        "          / |    ||          \n", 
        "         *  /\\---/\\          \n", 
        "            ~~   ~~          \n", 
        "...\"Have you mooed today ? \"...",
        "" };
    // prepare data for test
    printf("Initial data:\n");
    for(cnt = 0; cnt < 7; cnt++)
    {
        printf("%s", testd[cnt]);
        fprintf(testf, testd[cnt]);
    }
    fclose(testf);
    // redirect standard input
    freopen("caw.txt", "r", stdin);
    printf("\n\nResult:\n");
    // start test
    f();
}

Test sonucu:

resim açıklamasını buraya girin


2

Algodoo ( rakipsiz )

Giriş - dejenere örnek kullanılmıştır.

Kurmak

Runnning - varsayılan yerçekimi ve sıçrayan.

Koşu

Çıktı - doğruluk, nesnelerdeki Sürtünme ve Yoğunluk ayarlarıyla ayarlanabilir.

Çıktı

Algodoo mantık programlanabilir .


Bu neden rekabet etmiyor? Yarışmama genellikle genellikle meydan okumadan daha yeni dillerde cevaplar için ayrılmıştır.
Ad Hoc Garf Hunter

Algodoo gerçek mantık yapabilse de, bu simülasyon zemindeki girdinin parçalanmış bir baskısının düşürülmesine ve fotoğrafının çekilmesine eşdeğerdir. Bu çıktıyı programlı bir şekilde nasıl yakalayacağından bile emin değilim.
wyldstallyns

Ve "sıfır bayt programı! Ben kazanıyorum!" Demek yanlış görünüyordu.
wyldstallyns

Bunun aslında sıfır baytlık bir cevap olmadığından şüpheleniyorum. Kod yazma ile eşdeğer gibi görünen ayarlardan bahsediyorsunuz. Algodoo'nun puanlanmasıyla ilgili meta bir soru açmak iyi bir fikir olabilir. Ayrıca sıfır bayt programına sahip olmanın yanlış bir şey olduğunu da düşünmüyorum.
Ad Hoc Garf Hunter

Ben bu metayı açacağım.
wyldstallyns

1

JavaScript, 286 bayt

b=>eval('f=b=>b==null||" "==b;b=b.split`\n`.map(b=>[...b]);a:for(;;){for(c=0;c<b.length-1;c++)for(g=b[c],d=0;d<g.length;d++){h=g[d];if(!f(h)){e=0;f(b[c+1][d])?e=2:f(b[c+1][d-1])?e=1:f(b[c+1][d+1])&&(e=3);if(e){b[c+1][d+e-2]=h;b[c][d]=" ";continue a}}}break}b.map(b=>b.join``).join`\n`')

Örnekler

// Here I assume that you've assigned the above function to `fall`
console.log(fall(`
                 (__)
                 (oo)
           /------\/
          / |    ||
         *  /\---/\\
            ~~   ~~
..."Have you mooed today?"...`))

Çıktı:

                -       
            /--(-\--(__  
          /|~~---/~||/oo))
..."Have*you/mooed~today?"...

Başka bir örnek:

console.log(fall(`
 (\__/)  .~    ~. ))
 /O O  ./      .'
{O__,   \    {
  / .  . )    \\
  |-| '-' \    }
 .(   _(   )_.'
'---.~_ _ _&`))

Çıktı:

    _ , /            
  OO/__'_.. .         
 {.(|-|.(O'))/.~{      
/('---.~___-_&)_.'}\~.'))

Kurtulmamış fonksiyon

function fall(input) {
  let move = true
  let lines = input.split("\n").map(line => line.split(""))
  let isSpace = c => c == null || c == " "
  loop: for (;;) {
    for (let y = 0; y < lines.length - 1; y++) {
      let line = lines[y]
      for (let x = 0; x < line.length; x++) {
        let ch = line[x]
        if (!isSpace(ch)) {
          let dx = 0
          if (isSpace(lines[y+1][x])) { dx = 2 }
          else if (isSpace(lines[y+1][x-1])) { dx = 1 }
          else if (isSpace(lines[y+1][x+1])) { dx = 3 }
          if (dx) {
            lines[y + 1][x + dx - 2] = ch
            lines[y][x] = " "
            continue loop
          }
        }
      }
    }
    break
  }
  return lines.map(line => line.join("")).join("\n")
}

Değil boşluğu için teste kısa yoldur c>" "nerede ctest ettiğiniz karakteri temsil eder.
Neil
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.