INTERCAL'de golf için ipuçları


10

INTERCAL'de golf yapmak için hangi genel ipuçlarınız var ? Ben golf zorlukları kod uygulanabilir ve ayrıca en azından biraz INTERCAL (yani "yorumları kaldırmak" yararlı bir cevap değildir) belirli fikirler arıyorum.

Egzotik dillerin golf yarışmaları kazanmak için gerçekten yararlı olabileceğini biliyorum, ama burada çok fazla INTERCAL kodu görmüyorum. INTERCAL ile insanların rekabetçi kod boyutları elde etmelerine yardımcı olabilecek herhangi bir tavsiyeniz var mı? Bu dil hiç rekabetçi olabilir mi?

INTERCAL o kadar az kullanılmış ki bir etiketi bile yok. Çok üzücü...


Dile özgü zorluklar genellikle önerilmediği için çoğu dilin kendi etiketi yoktur veya bunlara ihtiyaç yoktur.
Alex A.

9
Bu, wikipedia sayfasından en iyi golf dili olmayabilir:Despite the language's intentionally obtuse and wordy syntax,
isaacg

Yanıtlar:


2

Boşluk / "gürültü" kaldırma beklediğinizden daha ileri gidebilir

INTERCAL boşluktan etkilenmeyen bir dildir. Boşluğa duyarsız çoğu dilden farklı olarak, duyarsızlık beklediğinizden çok daha ileri gider.

Örneğin DO NOT, iki jetondur, ancak DONOTayrıştırıcıdan şikayet etmeden yazılabilir (hemen hemen tüm yaygın uygulamalarda). (Tabii ki de yazabilirsiniz DON'T, ancak bu hiç de ters değildir. Okumak daha kolay olabilir. Okumak PLEASEN'Tmuhtemelen daha zordur PLEASE NOT.) Aslında, beyaz alanın herhangi bir şey yapıp yapmadığı konusunda bazı tartışmalar var; en az bir INTERCAL ayrıştırıcı, sayısal sabitler içinde bile buna izin verir (golf yaparken çok yararlı değildir). Akılda tutulması gereken bir şey o boşlukların kaldırılması olduğunu DO READ OUTverir nedeniyle gömülü için bazı eski INTERCAL ayrıştırıcıları şaşırtmak hangiDOREADOUTDO(yazarları bunu genellikle bir hata olarak görse de ve bu nedenle günümüzde genellikle geçerli bir programda çalışıyorsa, böyle bir kodun sözdizimi hatasının yakınına yerleştirilmesi tavsiye edilmez, çünkü o zaman netleştirmek çok daha zor olabilir).

Yerden tasarruf etmek için karakterleri fazla delebileceğinizi de unutmayın. ASCII'de bunu sadece '.→ ile çıkarabilirsiniz !, ancak bu kendi başına oldukça yararlı bir numaradır. (Dizileri kullanmadığınızda, tüm gruplama karakterleriniz aynı olsa bile bir kıvılcım belirsizliği olasılığı yoktur, bu nedenle golf girişleri için, 'bir dizi aboneliği gerçekten gerektirmediği sürece sadık kalmanız önerilir ".) Bir kitap kurdu olabilir INTERCAL-72'nin ihtiyaç duyduğu üçten ziyade (CLC-INTERCAL) ?kısaltması (C-INTERCAL) veya Latin-1 kullanılarak bir baytta temsil edilir ¥.


2

Bir ifadede mümkün olduğunca fazla iş yapmaya odaklanın

INTERCAL'in ifade tanımlayıcıları oldukça ayrıntılıdır; DOher ifadede iki gürültü karakteri, ifadenin adı da oldukça uzun olma eğilimindedir PLEASEve ayrıştırıcıyı mutlu etmek için arada bir atmanız gerekir . (Yapabileceğiniz en iyi dört bir orandır DObirine PLEASEÖte yandan, ifade sözdizimi oldukça kısa ve öz. Eğer her 5 komutlar için tanımlayıcılar 14 karakter kullanıyorsanız anlamına) (saçma, ama veciz). Bu, birden fazla ifade kullanırken bile programınızın bir kısmını tek bir ifadeye sığdırmaya değer olduğu anlamına gelir.

Örneğin, atamak isterseniz #1için .1ve #2hiç .2yerine bariz INTERCAL-72 bir şekilde yapmanın,:

DO.1<-#1DO.2<-#2

her ikisini de aynı anda atamanıza izin vermek için rastgele bir değişkeni aşırı yüklemeyi düşünmeye değer:

DO:1<-#1$#2

( :1/!1$.2'programın daha önceki bir yerine atılır; bu gösterimin INTERCAL-72'yi post-post olarak kullandığını unutmayın, bu yüzden çalışması için modern bir INTERCAL kullanmanız gerekir). Bu hesaba kurulumunu almak bile sadece biraz daha uzun olduğunu ve hiç gerekiyorsa veya atamak aynı anda düzenleyebilirsiniz eğer kısalır .1ve .2bir kereden fazla.

Sadece bu hilenin çalıştığı komutları hesaplamak değil. Bir değişkeni iki kez saklamanız gerekiyorsa, bunu böyle yapmayın:

DOSTASH.1DOSTASH.1

ama böyle:

DOSTASH.1+.1

( +Gösterim, kavramsal olarak mantıklı olabileceği çoğu komut için geçerlidir.)


2

Tüm INTERCAL-72 stilleri için tek bir RESUME kullanın

"İf" ifadesinin eşdeğerini yazmanız gerekiyorsa, INTERCAL-72 kodunu kullanan normal yöntem NEXTiki katına çıkar ve sonra hesaplanır RESUME. (Modern kodda, genellikle bir bilgisayar COME FROMdaha iyi olacaktır, ancak bu ipucu kodunuzun tercih ettiğini varsayar NEXT.) Birincisi NEXTiçin "bay" ın bir dalından diğerine atladığı için neredeyse kesinlikle bayt ödemek zorundasınız . NEXTA. Aynı yere giden çok sayıda "if" ifadeniz yoksa , ikincisini paylaşmak da önemsizdir #1. Ancak, RESUMEprogramın herhangi bir yerinde olabilir (çünkü kontrol onu anında herhangi bir yerde bırakacaktır).

Bunu ele almanın iki yolu vardır. Çok sayıda "if" ifadeniz varsa, RESUMEbüyük olasılıkla tek basamaklı bir satır numarasını garanti eder, böylece ikinci NEXTifadeniz mümkün olduğunca kısa olabilir. Mümkünse, RESUMEkodunuzda doğal olarak oluşacak bir bilgisayar yapmaya çalışın (kuşkusuz, bu zor, çünkü kodun "normal akışında" görünmek için nadirdir NEXT); bu durumda tek maliyet satır numarasıdır. Tüm bunlar için tek bir boolean değişkeni kullanmanız gerekir NEXT; buradaki evrensel fikir birliği .5, çoğunlukla standart kütüphanenin boole dönüş değerleri için kullandığı değişken olduğu için kullanmaktır.

Alternatif olarak, standart kütüphanenin belgelenmemiş (teknik olarak belgelenmemiş, çünkü INTERCAL belgelerine bir ipucu attım) özelliğinden faydalanmak mümkündür. A'nın merkezi konumu RESUMEçok kullanışlı olduğundan, standart kitaplık dahili olarak bir tane kullanır. INTERCAL Çizgi numaraları geneldir (kuralları Namespacing ile ancak hangi ne yaptığınızı biliyorsanız kırılabilir) sen böylece, NEXTsen hakkı standart kütüphane iç yapıları içine istiyorsanız ve özellikle, kutu NEXTiçin onun merkezi DEVAM konumu . Bu, standart kütüphane değiştirmelerinin mevcut programları bozmamak için onu uygulamak zorunda olduğu mevcut INTERCAL kodunda yeterince popülerdir.

Söz konusu satır (uygulamaya bağlı olarak, kelimenin tam anlamıyla veya etkili):

(1001) DO RESUME .5

Bunu kullanmamanın temel nedeni uzun satır numarasıdır; eğer çok sayıda INTERCAL-72 stili yapmanız gerekiyorsa, daha kısa bir sayı vermek için kendiniz kullanmak daha iyi olacaktır.

Tabii ki, teknikleri birleştirerek,

(9)DO(1001)NEXT

ki bu marjinal olarak

(9)DORESUME.5

ve booleanların olma avantajına sahiptir #2ve #3(okunması daha zordur, ancak normalde üretilmesi daha kolaydır). Aslında, işlemek için ekstra kod koymaya bile değer olabilir #0ve #1çok fazla COME FROMkullanacaksanız (ancak gereksinimleriniz çok garip olmadığı sürece hesaplanmış muhtemelen bu durumda daha iyi çalışacaktır).


2

INTERCAL öncelik belirtmez, ancak belirsiz öncelikte hata vermez

Gibi bir ifade

#1$#2~#3

belirsiz ve demek olabilir

'#1$#2'~#3

veya

#1$'#2~#3'

INTERCAL spesifikasyonu onu kasıtlı olarak belirsiz kılan anlamına gelir ve genel olarak standart yoktur (C-INTERCAL ve CLC-INTERCAL, daha basit durumlarda birbirleriyle eşleşmek için çaba sarf etmesine rağmen). Bununla birlikte, orijinal yanlış değil ; belirsiz ve üretim kodunda kullanmanızı tavsiye etmem (ancak daha sonra INTERCAL'ın üretim kodunda kullanılmasını tavsiye etmem), ancak derleyicilerin çoğunda bir anlamı olacak.

Başka bir deyişle, sadece gruplama karakterlerini kaldırmaya ve programınızın hala çalışmasını ummaya değer olabilir. Tercümanların çoğu, herhangi bir belirsiz ifadeyi tutarlı bir şekilde ayrıştıracaktır, bu nedenle her gruplama karakteri çifti için gereksiz 2'de 1 şans vardır; bu da biraz tasarruf sağlayabilir. (Ne yazık ki, INTERCAL ayrıştırıcılar yeterince kimse tamamen emin kurallar aslında ne olduğunu kafa karıştırıcı eğilimindedir vardır , ama normalde deney ile tespit edilebilir. En basit durumda, operatörler tüm eğilimindedir eşit önceliğe sahiptir ve tutarlı bir çağrışımsallık olması gerekir.)


2

C-INTERCAL'de, kodu kısaltmayı kullanarak CREATE

Bu CREATEifade yeni sözdizimi oluşturmanıza olanak tanır. Bu özellikle golfte kullanışlıdır, çünkü ifadelere daha kısa adlar vermenizi sağlar. Ayrıca, yeni bir işleç oluşturarak (bir ifadenin ortasında işlevi çağırmanıza izin veren büyük avantajı vardır) etkili bir şekilde "bir işlevi tanımlamak" için de kullanabilirsiniz.

Buradaki kurulum maliyeti oldukça yüksektir, ancak çok kullandığınız bir yapı varsa, daha kısa bir sözdizimi icat etmek muhtemelen iyi bir fikir olacaktır.

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.