Charcoal'da golf için ipuçları


15

Kömür , yalnızca ASCII ve DLosc tarafından ASCII sanat zorluklarında uzmanlaşmış bir dildir.

Charcoal'da golf oynamak için hangi ipuçlarınız var? Açıkçası ben, özellikle de olmasa da çoğu dilde uygulanabilecekleri değil, özellikle Kömür ile ilgili ipuçları arıyorum.


Siktir et, bir şeye kömür cevabı yapmaya çalışacağım, brb. Belki bu konuya küçük işaretçiler verebilirim.
Sihirli Ahtapot Urn

Yanıtlar:


5

Deverbosifier'dan yararlanın

Deverbosifier kullanmak, ASCII'de yazabileceğiniz anlamına gelir ( --dvveya --deverbosifydeverbosify yapmak -vveya --verboseayrıntılı kod olarak yürütmek). Ayrıca, sizin için dizeleri sıkıştırır, bu da sıkıştırılacak dize çok uzun olduğunda bazı ASCII-art zorluklarında faydalı olabilir.

@Neil-vl veya kullanmanızı önerir -v --sl. Bu kısadır --verbose --showlength, yani ayrıntılı Kömür olarak yorumlanacaktır ve normal Kömür kodunun uzunluğu gösterilecektir. Ayrıca, deverbosifikasyon yaparken, Kömür genellikle ayrıştırma hatalarını yok sayar çünkü girişin gerçekten doğru ayrıştırıldığından emin olmak için çıkışı kontrol edin. Orada ise olan bir sözdizimi hatası, kullanım -a( --astify) veya --oa( --onlyastifysorun dışında yardım rakama).


Bunun dışında kullanmanızı tavsiye ederim -v -sl. Ayrıca, deverbosifikasyon yaparken, her zaman bir ayrıştırma hatası almadığınız için girişin gerçekten doğru ayrıştırıldığından emin olmak için çıkışı kontrol edin.
Neil

3

Aşırı yük kullanın

Örneğin, birçok komutun yalnızca bir bağımsız değişkene ihtiyacı vardır:

  • Rectangle, OblongVe Boxsadece bir argüman verilirse bir kare yapmak
  • Reflect komutlar varsayılan olarak sağ yansıtır
  • Rotate komutlar varsayılan olarak saat yönünün tersine 90 derecedir
  • Polygonve PolygonHollowçok yönlü ve kenar uzunluğunu kabul edebilir. Tüm kenarlar aynı uzunlukta ise bu kullanılabilir.

PolygonHollowKazayla ilgili bu gerçeği keşfettim . Birkaç çok yönlü bile olabilir, ancak normal oklardan önce gelmeleri gerekir (bu sınırlamanın kasıtlı olup olmadığını bilmiyorum). Bunu "Bir küp çiz" sorusuna verdiğim cevapta kullandım.
Neil

Hmm sınırlama biraz kasıtlı, ama sanırım bunu değiştirmek gerekir çünkü yine de zarar vermez
ASCII-sadece

Gördüğünüz gibi Poligon, okları ve çok yönlüleri herhangi bir sırayla kabul etmek için düzeltildi! Ben buradayken, her yön ReflectButterfly dlsiçin arama bekliyordum ReflectButterfly, ama (wiki doğru olarak belgelediği gibi) aslında çağırıyor ReflectOverlap.
Neil

@Neil lol oops, ben ASAP düzeltmek için çalışacağım (Bence bu bir tesadüf de haha)
sadece ASCII-

3

Aynı türden ardışık sabitlerden kaçının

Örneğin, Plus(Times(i, 2), 1)olarak çevirir ⁺×鲦¹, ancak parametreleri geçiş yaparak bir byte kaydedebilirsiniz: Plus(1, Times(i, 2))olarak çevirir ⁺¹×ι²ve Plus(Times(2, i), 1)sıra ⁺ײι¹bir bayt kaydetmek ikisi de. Plus(1, Times(2, i))(başka bir deyişle ⁺¹×²ι), onu takip eden başka bir sayısal sabit olsaydı daha da iyi olurdu.


3

Önceden tanımlanmış değişkenleri kullanma

İşte kullanılabilecek tüm değişkenlerin bir listesi, özlü Yunan harfini ve onu temsil eden ayrıntılı harfi verir.

α/a: The uppercase alphabet
β/b: The lowercase alphabet
γ/g: A string of all the ASCII characters from space to ~
δ/d: The fifth input
ε/e: The fourth input
ζ/z: The third input
η/h: The second input
θ/q: The first input
υ/u: An empty array
φ/f: 1000
χ/c: 10
ψ/y: The null character
ω/w: The empty string

Girişleri temsil eden değişkenler yeterli girdi yoksa boş olacaktır, ancak burada gösterilmeyen diğer tüm değişkenler kullanılmadan önce atanmalıdır.


Bunlar şimdi
sadece ASCII-sadece

@ ASCII-only Bunu onaylayabilir misiniz yve fyapıştırdığımdan başka bir yol var mı? (Bunu ilk yazdığımda Yunanca harfleri yanlış okumuş olabilirim.)
Neil

Evet onlar tam
sadece ASCII-sadece

3

Düşüncelerinizi ve rotasyonlarınızı öğrenin

Temel yansıma ve dönüşün birçok varyasyonu vardır, bu yüzden ince farklılıkların ne olduğunu bilmek işe yarar. Tabloların anahtarı:

  • Komut: Ayrıntılı modda komutun adı.
  • Dönüştürme: Karakalem karakterleri aynalarken veya döndürürken döndürmeye veya döndürmeye çalışıp çalışmadığı. Örneğin,/\ döndürme veya çevirme işleminden sonra olabilir .
  • Orijinali Koru: Kömürün sonucu orijinal tuvalle birleştirip birleştirmeyeceği.
  • Çakışma: (Yalnızca Orijinali Koru Evet olduğunda geçerlidir.) Yansıma / döndürme ekseninin kenarlıktan yarım karakter olarak konumunu belirler. Yansımalar durumunda, etkilenmeyen satırların / sütunların sayısına eşdeğerdir ve sonucun ortasında kalır. Döndürme durumunda, döndürülen kopyanın orijinaldeki açık alanların (ancak boşlukların) üzerine yazılmasına izin verilir.

Yansımalar

|         Command         | Transform | Keep Original | Overlap |
|-------------------------|-----------|---------------|---------|
| Reflect                 | No        | No            | n/a     |
| ReflectCopy             | No        | Yes           | 0       |
| ReflectOverlap          | No        | Yes           | 1       |
| ReflectOverlapOverlap   | No        | Yes           | n       |
| ReflectTransform        | Yes       | No            | n/a     |
| ReflectMirror           | Yes       | Yes           | 0       |
| ReflectButterfly        | Yes       | Yes           | 1       |
| ReflectButterflyOverlap | Yes       | Yes           | n       |

Yansıma yönü isteğe bağlıdır. Varsayılan, bir kez sağa yansıtmaktır. Orijinali koruyan yansımalar için, her bir yön için komutu tekrarlayan çoklu bir yöne izin verilir. (Bu, örneğinReflectMirror(:¬) toplamda dört kopya oluşturacağı .)

İmleç yansıma ile birlikte hareket eder (orijinal saklansa bile).

rotasyonlar

|         Command         | Transform | Keep Original | Overlap |
|-------------------------|-----------|---------------|---------|
| Rotate                  | No        | No            | n/a     |
| RotateCopy              | No        | Yes           | 0       |
| RotateOverlap           | No        | Yes           | 1       |
| RotateOverlapOverlap    | No        | Yes           | n       |
| RotateTransform         | Yes       | No            | n/a     |
| RotatePrism             | Yes       | Yes           | 0       |
| RotateShutter           | Yes       | Yes           | 1       |
| RotateShutterOverlap    | Yes       | Yes           | n       |

Orijinali koruyan rotasyonlar için isteğe bağlı bir rotasyon kaynağı vardır. Varsayılan, tuvalin sağ alt köşesidir. İzin verilen değerler diyagonal yönlerden herhangi biridir.

Dönme miktarı (45 ° 'lik artışlarla) isteğe bağlıdır. Varsayılan 2'dir, yani saat yönünün tersine 90 ° (saat yönünün tersine). Orijinali koruyan rotasyonlar için iki alternatif seçenek vardır: çok basamaklı bir tamsayı, her basamak için tuvali bir kez döndürmeyi ve sonra sonuçları birleştirmeyi belirtirken, bir tamsayı listesi her dönüş için komutu nasıl tekrarladığına bağlı olarak değişir. tuval arasında değişiyor.


Soru: Ne anlama Transformgeliyor?
CalculatorFeline

@CalculatorFeline Güzel soru. Dönüştürmenin hayır olduğu durumlar sadece karakter için bir karakter kopyasıdır. Örneğin, "4> 2" nin standart yansıması sadece ters sırada olan karakterlerdir, yani "2> 4". Bu her zaman arzu edilmez, bu nedenle Transform karakterleri en uygun şekilde değiştirmeye çalışır, böylece "4> 2" nin yansıması "2 <4" olur. Dönüşüm bunun en iyi açıklaması olmayabilir, bu yüzden daha iyi bir şey önermekten çekinmeyin.
Neil

Daha iyi bir şey düşünemiyorum, bu yüzden Transformcevapta bir yerde nasıl çalıştığını açıklamalısınız .
CalculatorFeline

@CalculatorFeline Diğer sütunların da açık olmaması durumunda tabloya bir anahtar ekledim.
Neil

Hatalar şimdi düzeltilmelidir. Ayrıca bu açıklamayı yazmak için zaman ayırdığınız için çok teşekkür ederiz!
Sadece ASCII

2

Komut karakteri olmayan komutları kullanma

Komutun parçası olmayan bir ifade yazdırılır.
Önünde bir yön varsa, ifade belirtilen yönde yazdırılır.
Sayılar, arasından seçilen bir karakter kullanılarak belirtilen uzunlukta bir çizgi olarak yazdırılır \/-|.

Bir yönün ardından bir ifade gelmiyorsa, belirtilen yönde bir boşluk hareket ettirilir.

Not: Bu bazen önceki komutun bir parçası olarak sayılabilir, bu nedenle komut karakteri gerçekten gerekli olabilir. (teşekkürler Neil hatırlattığın için)


1
Önceki komut isteğe bağlı bir parametreyi kabul edebileceğinden, belirsizliğe dikkat etmeniz gerekir.
Neil

2

Çok yönlü kullanın

Bazı komutlar multidirectionals kabul edebilir: +X*|-\/<>^KLTVY7¬⌊⌈. Genişledikleri şey burada . Genel olarak, yön listesi yukarıdan başlar ve saat yönünde devam eder.


Bazı komutların çok yönlü kabul etmesinin, diğerlerinin de yön listesi gerektirmesinin belirli bir nedeni var mı? (Bunun göz ardı ReflectButtterflyOverlap(:¬, Modulo(g, 2));
Neil

@Neil sanmıyorum, ASAP değişecek
sadece ASCII sadece

0

Tam kapasitesini kullanmak Sum

Sum çok sayıda aşırı yükleme var:

  • Dizeler listesinde, bunları bir araya getirir. Ancak, listenin boş olması mümkünse, bu Yok değerini verir, bu durumda Join(..., "")bunun yerine kullanın.
  • Boş olmayan bir sayı listesinde, toplamlarını alır.
  • Boş olmayan bir liste listesinde, bunları birleştirir (derinlik 1'e düzleştirir).
  • Bir tamsayıda, basamaklarının toplamını alır. (Kayan nokta değerleri tamsayı olarak kesilir. Ondalık basamakların toplamını istiyorsanız, önce dizeye yayınlayın.)
  • Yalnızca rakam ve isteğe bağlı olarak bir .karakter içeren bir dizede rakamların toplamını alır.
  • Sayılar ve ayırıcılar içeren bir dizede, int veya float için kullanılan sayıların toplamını alır (ancak -ayırıcı olarak sayıldığını unutmayın ).

Son iki kuralın uygun bir yan etkisi Sum, bir karakter üzerinde kullanırsanız , rakamların 1-9değerlerine dökülmesidir ve diğer her şey, Castsayısal olmayan değerler için başarısız olandan farklı olarak sıfır döndürür .


0

Bir dize dizisi için split, sayı dizisi için split ve cast kullanın

Bir dize dizisi için bölme yalnızca üç karakter ek yüktür ve bölme ve döküm yalnızca dört ek yük karakteridir. Dizi başlangıç ve bitiş, gerektirecektir hangi kelimenin tam anlamıyla dizisi yazma ile karşılaştırın ve Her dizi öğesi arasında bir ayırıcı.

Sayı dizinizde yalnızca 95'ten küçük sayılar varsa, ya bir cast (tüm sayılar 10'dan küçükse) ya da önceden tanımlanmış değişkenlerden birine dizin ekleyin.


0

Bir diziden veya dizeden ilk karakteri dilimlemek için Filtre'yi kullanın

Eğer şanslıysanız bile, kullanarak Slicebir dize gelen ilk karakteri dilim 2 bayt alır: Slice(..., 1). Dilimlenecek ifadenin bir ayırıcı gerektiren bir sayı ile bitmesi veya aşağıdaki kodun bir ifade olarak yorumlanabilmesi daha uzun Slicesürecektir , bu durumda ek bir parametre olarak kullanmak isteyecektir.

Bunun yerine, Filter(..., k) ilk elemanı düşüren, böylece istenen sonucu elde eden kullanın. (İfadeniz başka bir döngünün içine yerleştirilmişse, uygun döngü dizini değişkenini kullanın.) Bu her zaman 2 bayttır ve çevresindeki koddan etkilenemez.

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.