ASCII sanat golf için ipuçları


18

Bence ASKII sanat soruları PPCG yapmak eğlenceli, ama şahsen, özellikle soru olarak etiketlendiğinde oldukça zor olabileceğini düşünüyorum .

Acaba buradaki herhangi birinin ASCII sanatı üretmek için yararlı olacak bazı ipuçları olup olmadığını merak ediyorum.

Sadece karakterleri düzenlemek kolaydır, ancak (kısa) algoritmalarla işler daha karmaşık hale gelecektir.

ASCII sanatından bahsediyorum:

  • ASCII resmine metin (karakterler)
  • Resimler (logolar veya simgeler)

Sadece genel ipuçlarını arıyorum, ancak çoğu dilin nasıl tercüme edilebileceğinden dile özgü izin verilir.

Yanıtlar:


8

Sıkıştırma algoritmaları

Dizeye LZMA sıkıştırması uygulayabilirsiniz.
Birçok dil destekliyor.

Çalışma uzunluğu kodlaması

[char][number](Örn. b12) Gibi işleme talimatlarını kullanabilirsiniz .
Bu sıkıştırma algoritması burada kullanılır: /codegolf//a/20589/10920

İlave okumalar: http://en.wikipedia.org/wiki/Run-length_encoding

Tamsayı paketleme

Aşağıdaki gibi küçük şekilleri saklamak için tamsayı dizileri kullanabilirsiniz:

// This is an invader!
// (SE line height makes it looks awful)
// ~158 characters

    ##          ##    
      ##      ##      
    ##############    
  ####  ######  ####  
######################
##  ##############  ##
##  ##          ##  ##
      ####  ####       

Her boşluk a 0.
Her keskin a 1.

// ~58 characters
// Saved ~100 bytes!
[
  196656,  49344,   262128,  999228,
  4194303, 3407859, 3342387, 62400
]

Her bit daha sonra bitsel operatör kullanılarak okunur &.

Yukarıdaki algoritma daha büyük bir tamsayı tabanı kullanılarak geliştirilebilir:

// ~44 characters
// Integers are in base 36.
// Use `_` as a separator (or a line break).
"47qo_122o_5m9c_lf0c_2hwcf_211ir_1zn03_1c5c"

3
Kişisel işleme talimatları yaygın olarak bilinen sayı-uzunluk kodlama Bilginize.
FireFly

@FireFly Teşekkürler! Bunun için bir isim olduğunu bilmiyordum.
Florent

Par dilinde (benim dilim) bu, taban 62'ye kadar kodlanmış tam sayıları desteklediğinden daha da genişletilebilir:[0-9A-Za-z]
Cyoce

5

Simetri arayın

Bazen gerekli ASCII sanatı bir noktada simetriktir. Örneğin, Argyle ASCII Art buna benzer bir çıktı gerektirir:

    /\        /\
   /  \  /\  /  \
/\/    \/  \/    \/\
\/\    /\  /\    /\/
   \  /  \/  \  /
    \/        \/

Bunu normal olarak yazdırabilirsiniz, ancak dile bağlı olarak, gerekli kod yalnızca sonucun üst yarısını oluşturarak, tersine çevirerek ve değiştirerek kısaltılabilir /ve\ .

Aktarmayı deneyin

In ASCII Art Okçuluk Arrows baskıya sonucu, verilen ölçeklenmiş, bu n:

     /\
    /  \
   /    \
  /      \
  \      /
   \____/
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
   /|  |\
  / |  | \
 /  |  |  \
/   |  |   \
/   |  |   \
/   |__|   \
/  /    \  \
/ /      \ \
//        \\
/          \

Oka bir göz atarsak, 8 çeşit çizgi olduğunu görebiliriz:

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

Aynısını onun devri için deneyelim.

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

Burada 10 çeşit çizgi var.

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

Ama işte yakalama: alt 5, takas /ve hariç olmak üzere ilk 5 ile aynıdır \. Önceki kurala göre, ilk 5'i oluşturabilir, kopyalayabilir, takas yapabilir ve son olarak oku almak için devredebilirsiniz. Bu çok fazla kod tasarrufu sağlayabilir.


5

Karakterleri, kaçış dizilerini ve konsol kodlarını kontrol edin

Soru onları yasaklamadığı sürece, Meta hakkındaki mevcut fikir birliği ASCII sanat zorluklarının belirli bir bayt akışı gerektirmediği, ancak çıktıların doğru göründüğü yönündedir.

Bu, ASCII kontrol karakterlerini , ANSI kaçış dizilerini ve Linux konsol kodlarını destekleyici bir terminal olduğunu varsayarak cevaplarımızda kullanabileceğimiz anlamına gelir .

Aksi belirtilmedikçe, bu cevabın geri kalanı şu anda test için elimde olan Linux terminallerinin davranışını açıklayacaktır.

ASCII kontrol karakterleri

Destek / yorum terminalden terminale ve karakterden karaktere değişir. En taşınabilir olanı hat beslemesi olmalıdır ( \n,\x0a , karakteri bir sonraki satırın başına taşıyan ) olmalıdır.

Diğer faydalı karakterler:

  • Dikey sekme ( \v, \x0b) imleci bir konum sağa, sonra bir konum aşağı taşır.

    $ echo -e 'a\vb'
    a
     b
    
  • Satır başı ( \r, \x0d) imleci geçerli satırın başına götürür . Sonraki yazdırılabilir karakterler geçerli satırın ilk karakterinin üzerine yazılır.

    $ echo -e 'ab\rc'
    cb
    
  • Geri silme ( \b, \x08) imleci bir konum sola taşır. Sonraki yazdırılabilir karakterler, geri almadan önceki karakterin üzerine yazar.

    $ echo -e 'ab\bc'
    ac
    
  • Escape ( \e, \x1b) kendi başına hiçbir şey yapmaz, ancak ANSI kaçış dizilerinin (isteğe bağlı olarak) ve Linux konsol kodlarının bir parçasını oluşturur.

Birçok dil, kaynak koddaki gerçek kontrol karakterlerine izin verir.

ANSI kaçış dizileri

(henüz gelmedi)

Linux konsol kodları

Daha fazlası olsa da, ASCII sanatı için en kullanışlı konsol kodları muhtemelen şunlardır:

  • Dizisi \ecolacaktır yeniden terminali. Bu, ekranı temizler, imleci sol üst köşeye hareket ettirir ve ön ve arka plan rengini, imleç yanıp sönme hızını vb. Varsayılan değerlerine ayarlar.

  • Dizi ters bir satır beslemesine\eM neden olur , yani imleç bir konum yukarı hareket eder.

    $ echo -e '\na\eMb\n'
     b
    a
    
  • Sekans , geçerli sütundaki sekme durağını\eH ayarlar .

    $ echo -e '   \eHa\n\tb'
       a
       b
    

2

Desen ara

Bu biraz açık olabilir, ama ... çıktıda örüntüler, benzerlikler ve tekrarlar arayın. Örneğin, 7 parçalı ekran deseni görevine Dönüştür numarasını gördüğümde, kişinin nasıl golf oynayabileceğini düşünmeye başladım ve benzerlikler aramaya başladım. Yatay bölümlerin karakter matrisindeki dikey bölümler arasında gitme şekli nedeniyle, bir seferde üç bölümle başa çıkmak en kolay yöntemdir, bu şekilde birlikte gruplandırılır (ilk, en üstteki için iki "her zaman boş" bölüm eklemek) :

el yordamıyla segmentler

Böylece gibi bir şey yapabileceğini lc + " "*N + rc + "\n"sonra N-1 süreleri ve lc + bc*N + rcher üç segmentleri için bir kez, ( lc, bc, rcyani sol, tabandan gelen yeni ve sağ parça karaktere, biri olmanın |, _ya da  ).


2

Taban dönüşümünü kullan

Bu cevap , karakterlerden oluşan ASCII sanatını isteyen bir soruydu+ |- ve yeni satırlardan . Yalnızca 5 olası karakter olduğundan, bunlar temel 5 sayısı olarak kabul edilebilir ve bayt başına 3.45 karakter paketleyerek bayta dönüştürülebilir.

Düzenlemelerden yararlanın

Genellikle, bu düzenlilikler yansıtma gibi belirli araçları kullanmak için yeterince güçlü olmasa bile, bazı düzenliliklere sahip olacaktır. Örneğin, yukarıdaki soruda, istenen çıktı, metin kabaca dikdörtgen olduğu için test boyunca kabaca eşit aralıklı yeni satırlara sahipti. Bunu, Pyth'in n parçaya bölme işlevini kullanarak kodumu kısaltmak ve sonra satırsonlarına katılmak için kullandım.

Araçlarınızı tanıyın ve iş için doğru olanı seçin.

Bildiğim en güçlü ve verimli metin işleme araçları:

Regex motorları:, ///Retina, Perl, güç / kısaltma dengesi sırasına göre.

Yapmak istediğiniz şey, bu cevap gibi normal ifade ikamelerinde kısaca açıklanabiliyorsa kullanın

Karanlık metin işleme araçları: gema, vb. (Eminim başkaları vardır, ancak çok belirsizler)

Tam olarak ihtiyacınız olan şey, başka hiçbir şeyin sahip olmadığı bir özelliği varsa kullanın. Gibi böyle bu soruyaGema'nın özyinelemeli eşleşmesi ile .

Genel kod golf dilleri: CJam, Pyth, vb.

Başka hiçbir aracın işi yapamayacağı ya da sadece işi daha kısa yapamayacağı kadar incelikli bir kompleksden yararlanıyorsanız kullanın.

Birçok yaklaşımı deneyin

Bu her kod golf sorusu için geçerlidir, ama özellikle burada. Denemeden önce bir düzenliliğin sömürülebilir olup olmadığını bilemezsiniz. Muhtemelen birden fazla dilde.

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.