MATL'de golf için ipuçları


20

MATL , Luis Mendo tarafından oluşturulan bir golf dilidir . MATL, yüksek oranda rekabetçi olduğunu kanıtladı ve genellikle Pyth, CJam ve Jelly gibi diğer golf dillerinde başvuruları yendi .

MATL'de golf oynamak için bazı faydalı ipuçları nelerdir? (Her zaman olduğu gibi, cevap başına bir ipucu, lütfen!)


5
Bazı Matlab / Octave biliyorsanız kesinlikle büyük bir avantajdır. Bazı hileler Matlab golf için İpuçları ve Octave golf için ipuçları da Matl kullanılan.
flawr

Öneri: Görünüşe göre accumarray( XQ) oldukça güçlü olabilir (muhtemelen MATLAB / Octave'da olduğundan daha fazla olabilir, çünkü bu uzunluk işlevi tutamaçları kullanışlı sayısal kodlara sahiptir), ancak iyi örneklerle açıklamak için yeterince iyi bilmiyorum. Gerçekten faydalıysa, birisi nasıl kullanılacağına dair fikirlerle bir cevap oluşturabilir mi?
sundar - Monica

Yanıtlar:


7

Önceden tanımlanmış değişmez değerleri bilir

Bazıları panoya kopyalandığında bilgileri saklasa da, hepsinin önceden tanımlanmış bir değeri vardır.

  • F, 0'ı iter (aslında Yanlış )
  • T, 1'i iter (aslında Doğru )
  • H, iter 2 (önceden tanımlanmış pano değeri)
  • I, 3 iter (önceden tanımlanmış pano değeri)
  • K, iter 4 (önceden tanımlanmış pano değeri)
  • J, 0 + 1j (önceden tanımlanmış pano değeri)

Yine de önceden tanımlanmış tüm değerleri kapsadığımdan emin değilim.


Sadece bütünlük için (ve cevabınıza eklemek istemeniz durumunda): her pano seviyesinin Lde önceden tanımlanmış bir değeri vardır, ancak özel kullanımlara yöneliktir (ortak, genel değerler yerine). Örneğin, 1Lverir [1 0](dizin olarak kullanılır 1:end), 2Lverir [0 -1 1](için 1:-1:end). Ayrıca, fonksiyonları lve Ovarsayılan olarak 0 giriş almak ve üretmek 0ve 1sırasıyla
Luis Mendo

Bunun ne kadar yararlı olduğunu görmüyorum ... Sadece yazamaz 4mıyım?
Cyoce

@Cyoce Yararlılık ayırıcı olarak bir boşluktan kaçınmaktır. Eğer aktarmak isterseniz 1, o zaman 4, 14yapmayacağım. İhtiyacınız olacak 1 4. Veya 1Kbir bayt kurtarmak için
Luis Mendo

@LuisMendo ah, anlıyorum. Sanırım ben sadece 1 haneli sayı yöntemini kullandığını varsaydım (neden emin değilim)
16:16 Cyoce

1
KBunun yerine 4kullanışlı başka bir durum : 1-4anlamı: itme 1, sonra itme -4; oysa şu 1-Kanlama gelir: itme 1, yığının altında ne varsa çıkartma, sonra itme4
Luis Mendo

5

&Meta-Function (Alternatif Giriş / Çıkış Özellikleri)

Bir işleve iletilecek girdi bağımsız değişkenlerinin sayısını belirtmenin geleneksel yolu $meta işlevi kullanmaktır

2$:     % Two-input version of :

Benzer şekilde, çıktı bağımsız değişkenlerinin sayısını belirlemek için, çıktı bağımsız değişkenlerinin #sayısını belirten meta işlevini kullanabilirsiniz ,

2#S     % Two-output version of sort

Eğer bir numara geçmesi halinde ya da daha büyük bir işlev için tanımlanan çıkış bağımsız değişken sayısı, sadecemod(N, numberOfOutputs) + 1 çıkış temin edilmektedir.

4#S     % Get only the second output of sort

Ayrıca #yalnızca belirli çıktı bağımsız değişkenlerini almak için girdi olarak mantıksal bir dizi belirtebilirsiniz .

TFT#u   % Three output version of unique and discard the second output

Bu giriş / çıkış özelliklerinin tümü kullanışlıdır, ancak bayt sayınızı çok hızlı bir şekilde artırır. Bununla başa çıkmak &için MATL , 17.0.0 sürümünde meta işlevi tanıttı . Bu &meta işlev, bir işlev için belirli bir girdi veya çıktı belirtimi için kısayol görevi görür. Bunun ne anlama geldiğini görelim.

Yukarıdaki örneğimizde, iki girişli sürümünü kullanmak istedik :(eşit aralıklı değerlerin bir vektörünü oluşturur). Giriş argüman varsayılan sayısı iken :, IS 1(bir dizi oluşturur [1...N]), öyle çok bir kullanıcı ikinci girişi gerektirir aralığının başlangıç değeri belirtmek isterim ortak. Bu yüzden için bir kısayol olarak :tanımladık .&2$

10      % Push 10 to the stack
12      % Push 12 to the stack
2$:     % Create an array: [10, 11, 12] 

Şimdi bir bayt tasarrufu , aşağıdaki olur !

10 12 &:

Alternatif argüman sayısının ne olduğunu nasıl belirleyebiliriz?

&Çevirilen giriş / çıkış belirtimi , bayt tasarrufunu optimize edebileceğimiz şekilde işleve özeldir .

Her işlev için yardım açıklamasının giriş / çıkış bağımsız değişkeni bölümü, bu alternatif giriş / çıkış sayısının (varsa) ne olduğunu belirtmek üzere güncellenmiştir. Olası giriş veya çıkış bağımsız değişkenleri aralık olarak görüntülenir ve her biri için varsayılan değerler parantez içinde gösterilir. İkame edilebilen giriş / çıkış özellikleri parantez içindeki karakterden &sonra /gösterilir.

İşte yardım açıklamasının giriş / çıkış bağımsız değişkeni bölümü :

 +- Min-Max range of # of inputs
 |        +----- Alt. Default # of inputs
 |        |
 V        V
1--3 (1 / 2); 1 <--- Possible / Default # of outputs
      ^       
      |       
  Default # of inputs

&Her bir işlev için ne anlama geldiğini nasıl belirlediniz ?

Çok dikkatli. StackExchange API kullanarak, bir PPCG sınamasında kullanılmış olan tüm MATL cevaplarını indirebildik. Yanıtların her birini ayrıştırarak, her bir giriş / çıkış özelliğinin her işlev için ne sıklıkta kullanıldığını belirleyebildik. Bu bilgileri kullanarak, &meta-fonksiyonun her fonksiyon için temsil etmesi gereken girdi / çıktı spesifikasyonunu objektif olarak belirleyebildik . Bazen açık bir kazanan yoktu, bu yüzden birçok fonksiyon &tanımlanmadı.

İşte kullandığımız komut dosyası (maalesef MATL değil MATLAB ile yazılmıştır ).

Ve burada bir olan histogram örneği arasında $/ #kullanım


1
Bu özellik edildi önerdi @Suever tarafından. Başlangıçta &"girdi sayısını varsayılana göre 1 arttır" anlamına geliyordu.
Önerisi

5

MATL'in doğru / yanlış tanımlarını öğrenin

İken true( T) ve false( F) açıkça truthy ve falsy çıkışını temsil sırasıyla yaygın truthy tanımına kararlaştırılan / falsy biraz Matl daha fazla esneklik bit bize veriyor.

Tanım şunu belirtir:

if (x)
    disp("x is truthy");
else
    disp("x is falsy");
end

Böylece hızlı bir MATL doğruluk / tahlil testi yazabiliriz.

` ? 'truthy' } 'falsey' ]DT

İşte çevrimiçi bir sürüm.

MATL'de bunun anlamı

Bunun MATL'de (ve dolayısıyla MATLAB ve Oktav'da) gerçekte ne anlama geldiği, boş değilse ve tüm değerlerinin gerçek bileşenleri sıfır değilse, bir koşulun doğru olarak kabul edilmesidir . Bunun üzerinde durulması gereken iki bölüm vardır.

  1. Sıfır olmayan : Bu, tam olarak sıfıra eşit olmayan ( ==) anlamına gelir . Buna pozitif sayılar, negatif sayılar, null olmayan karakterler vb. Dahildir. Belirli bir değeri bir logicaldeğere ( g) dönüştürerek kolayca kontrol edebilirsiniz.~~

    F           % Falsy
    T           % Truthy
    0           % Falsy
    1           % Truthy
    2           % Truthy
    -1          % Truthy
    'a'         % Truthy
    ' '         % Truthy (ASCII 32)
    char(0)     % Falsy  (ASCII 0)  
    
  2. Tüm değerler : Tipik olarak skalerlerin doğru veya yanlış olduğunu düşünüyoruz, ancak MATL'de skaler, satır vektörleri, sütun vektörleri ve hatta çok boyutlu matrisleri değerlendirebiliriz ve sadece her bir değer varsa doğrudur. sıfırdan farklı (yukarıda tanımlandığı gibi), aksi takdirde sahtelidir. İşte size göstermek için birkaç örnek

    [1, 1, 1]           % Truthy
    [1, 0, 0]           % Falsey
    [1, 1, 1; 1, 1, 1]  % Truthy
    [1, 0, 1; 1, 1, 1]  % Falsey
    'Hello World'       % Truthy
    

Tek kenarlı durum, yukarıda belirtildiği gibi, []her zaman falsili olarak kabul edilen boş bir dizidir ( örnek )

Bunu daha iyi golf oynamak için nasıl kullanabilirim?

Zorluk, çıktınızın doğru veya yanlış olması gerektiğinden bahsediyorsa, cevabınızdan birkaç bayt çıkarmak için yukarıdaki tanımdan yararlanabilirsiniz. Karışıklıktan kurtulmak için, MATL doğruluk / falsy değerlerinin nasıl çalıştığını açıklamaya yardımcı olması için cevabınıza yukarıdaki çevrimiçi doğruluk / falsy testine bir bağlantı eklemeniz önerilir.

Birkaç örnek:

  • İle biten bir cevap A. Zorluk truthy veya falsy çıkışı gerektirir ve cevabınızı sona Eğer all( Abir sayıl oluşturmak için), bu son byte kaldırabilir ve (çıkış olmadığı sürece Cevabınız doğru kalacaktır []beri []olduğu falseancak []Aise true).

  • Bir dizinin yalnızca tek bir benzersiz değer içermesini sağlamak : &=yerine kullanılır un1=. Bir dizideki tüm değerler eşitse, yayınlanan öğe bazında eşitlik karşılaştırması N x Ntüm bunlardan bir matris verecektir . Tüm değerler eşit değilse, bu matris bazı 0değerler içerecektir ve bu nedenle yanlış olarak kabul edilecektir.


4

Örtük Girdi

Çoğu işlev bir miktar girişi kabul eder. Bu girişler yığının üstünden alınır. Yığının üstünde yeterli sayıda bağımsız değişken yoksa, kalan bağımsız değişkeni girişten alır. (Belgedeki Bölüm 7.3'e bakın) Orijinal açıklamaya atıf yapmak istiyorum:

Örtük girdiler aşağıdaki gibi görüntülenebilir: yığın, altta süresiz olarak uzatılır, yani 0, −1, −2, ... konumlarında, başlangıçta tanımlanmayan ancak örtük girdi yoluyla anında çözülen değerlerle . Bu girişler kullanıcıdan yalnızca ihtiyaç duyuldukları sırada, istedikleri sırayla sorulur. Aynı anda birden fazla giriş gerekliyse, normal yığın sırasını izlerler, yani (genişletilmiş) yığındaki en derin giriş ilk olarak girilir.


2
Örtük girdi @flawr
Luis Mendo

6
@flawr gerçekten zeki bir adam olmalı. : D
flawr

3

Mantıksal diziler genellikle sayısal diziler olarak kullanılabilir

TFSıfırların ve sıfırların dizi değişmez değerleri yerine genellikle " " gösterimini kullanabilirsiniz . Örneğin, değerler değil , yalnızca değerler üreten ile FTFaynıdır . Herhangi bir aritmetik işlem mantıksal değerleri sayı olarak ele alacağından, bu genellikle bir sorun değildir. Örneğin, verir ( "1 artar").[0,1,0]FTFlogicaldoubleFTFQ[1,2,1]Q

Bazı durumlarda, bir sayının ikiliye dönüştürülmesi daha kısa olabilir. Örneğin [1,0,1], TFTve 5Baynıdır; yine ikincisinin logicaldeğer olduğuna dikkat ederek .


Endeks olarak kullanıldığında TF(mantıksal) ve [1 0](sayısal) arasındaki farkın önemli olduğu bir durumdur. logicalDizin olarak kullanılan bir tür dizisi şu anlama gelir: karşılık gelen öğeleri seçin T, karşılık gelenleri atın F. Yani [10 20]TF)üretir 10(ilk elemanı seçer), oysa [10 20][1 0])üretir [10 20](indeks dizinin tüm elemanlarını [1 0]yorumlar 1:end, yani seçer).


3

N-1 büyüklüğündeki halkalar için

Değiştirmeyi düşünebilirsiniz

tnq:"...

ile

td"...

bir bayt veya daha fazlasına kadar tasarruf etmek için .


@Luis gerçek! Birinin döngü halindeki orijinal vektöre ihtiyacı olabileceğini düşündüm, ancak bu ilk yaklaşımda da mümkün değil. Bu açıklamayı kaldıracak.
Sanchises

Ancak mutlaka 1 bayt tasarruf etmeniz gerekmez; ihtiyacınız olup olmadığına bağlı olarak 1 veya 2 kazanırsınız @/X@döngü içinde . Belki sadece "bayt kurtarmak için" diyebilirsiniz
Luis Mendo

3

Örtük uçtan yararlanmak için işleri döngüden sonra döngü içine taşıyın

Döngü endifadeleri, ], olabilir dışarı bıraktı onlardan sonra herhangi bir kod varsa. MATL ayrıştırıcısı tarafından dolaylı olarak doldurulur.

Yani bir şeyleri döngüden sonra döngü içine taşıyabilirseniz, finali kaydedebilirsiniz ].

Belirli bir örnek olarak, aşağıdaki kod, bir sayının faktöriyelinde kaç tane sıfırın bulunduğunu bulur N( buraya bakın ):

  • Kod, 1ile arasında geçiş yapar N.
  • Bu sayıların her biri için asal faktörlerini hesaplar ve kaç kez var 5olduğunu belirler .
  • Cevap, toplamda kaç kez 5göründüğüdür (bu işe yarar çünkü her biri 5için en az bir tane vardır 2).

İlk fikir :"@Yf5=]vs(döngüden sonra ifadeler olduğunu unutmayın):

:      % Range from 1 to implicit input
"      % For each number in that vector
  @    %   Push that number
  Yf   %   Vector of prime factors (with repetitions)
  5=   %   True for entries that equal `5`, and `false` for the rest
]      % End for
v      % Concatenate all vectors as a column vector
s      % Sum. Implicitly display

Yana vvarsayılan tüm yığın içeriğini birleştirir tarafından, bu döngüye hareket ettirilebilir. Ve toplama ilişkisel olduğu siçin de taşınabilir. Bu ], kodun sonunda kalır ve bu nedenle atlanabilir :"@Yf5=vs::

:      % Range from 1 to implicit input
"      % For each number in that vector
  @    %   Push that number
  Yf   %   Vector of prime factors (with repetitions)
  5=   %   True for entries that equal `5`, and `false` for the rest
  v    % Concatenate all vectors so far as a column vector
  s    % Sum. Inplicitly end loop and display

bu hiyeroglif benzeri yazı dilinin bir kuruşunu bilmiyorum ama belki de önümüzdeki üç ay boyunca çalışarak zamanımın büyük bir kısmını ayıracağım.
Abr001am

@ Agawa001 :-) Matlab'a oldukça benzediğini göreceksiniz. Ayrıca burada
Luis Mendo

3

Yığın boşsa, boş bir sayısal dizi tanımlamanın daha kısa yolu

Normalde kullandığınız boş bir sayısal diziyi itmek için []. Ancak, yığın boşsa, kullanarak bir bayt kaydedebilirsiniz v. Bu işlev varsayılan olarak tüm yığın içeriğini dikey olarak birleştirir, bu nedenle yığın boşsa boş dizi üretir.

Örneğin burada çalışırken görebilirsiniz .


2

Bazı işlevler MATLAB veya Octave ile karşılaştırıldığında genişletilmiştir.

MATLAB veya Octave'dan geliyorsanız, birçok MATL işlevinin bu dillerdeki işlevlere benzer olduğunu göreceksiniz. Ancak bunlardan birkaçında işlevsellik genişletildi.

Örnek olarak, reshapeMATLAB'nin MATLAB'a karşılık gelen işlevini ele alalım e. Kod parçacıkları reshape([10 20 30 40 50 60], 2, 3)ve reshape([10 20 30 40 50 60], 2, [])sırasıyla "satır vektörünü [10 20 30 40 50 602 × 3 matrise yeniden şekillendir " veya "gerektiği kadar sütun içeren 2 satırlı bir matrise" anlamına gelir. Sonuç, her iki durumda da 2D dizisidir

10    30    50
20    40    60

Uyumsuz boyutlardan dolayı bir şey gibi reshape([10 20 30 40 50 60], 2, 2)veya reshape([10 20 30 40 50 60], 5, [])hata verebilir. Ancak, MATL ilk durumda öğeleri kaldıracak ( çevrimiçi deneyin! ) Veya ikinci olarak sıfırlarla dolduracaktır ( çevrimiçi deneyin! ),

10 30
20 40 

ve

10 60
20  0
30  0
40  0
50  0

MATLAB karşılıklarına göre genişletilmiş işlevselliğe sahip diğer işlevler (ayrıntılı olmayan liste) S( sort), Yb( strsplit), m( ismember), h( horzcat), v( vertcat), Zd( gcd), Zm( lcm), YS( circshift), YA( dec2base), ZA( base2dec), Z"( blanks).


1

Varsa, ilk sıfır olmayan öğenin dizinini alın

fİşlev, bir dizinin tüm sıfır olmayan elemanları endeksleri verir. Genellikle ilk sıfır olmayan öğenin dizinini istersiniz . Bu , ilk elemanını f1)uygulamak fve seçmek olacaktır . Ancak orijinal dizi sıfırdan farklı bir değer içermiyorsa fboş bir dizi ( []) verir ve ilk öğesini seçmeye çalışmak hata verir.

Ortak, daha sağlam bir gereklilik , en azından bir tane varsa ve []başka bir şekilde birinci elemanın indeksini elde etmektir . Bu daha ifsonra bir şube ile yapılabilir f, ancak bu byte pahalıdır. Daha iyi bir yol fX<, yani, X<çıkış için minimum işlevi uygulamaktır f. X<girişi boş bir dizi olduğunda boş bir dizi döndürür.

Çevrimiçi deneyin! (Boş bir dizinin hiç görüntülenmediğini unutmayın). Veya işte bunun bir örneğini burada görebilirsiniz .


1

Belirli bir diziye kadar bir aralık oluşturun

TL; WR : Kullanım fyerine n:dizisi sadece sıfırdan farklı unsurları varsa.


Genellikle bir ihtiyacı bir dizi oluşturmak için bu durumda belli bir dizi eleman sayısıdır. Bunu yapmanın standart yolu . Örneğin, kod girdi olarak sayısal bir vektör alır ve her girdinin diziniyle çarpımını hesaplar.[1 2 ... L]Ln:tn:*

Verilen dizinin yalnızca sıfır olmayan girişleri içereceği garanti edilirse (örneğin, pozitif tamsayılarla oluşturulur veya yazdırılabilir karakterli bir dize ise), sıfır olmayan girdilerin dizinleriyle bir dizi üreten n:ile değiştirilebilir f. Böylece yukarıdaki kodtf* 1 bayt tasarruf sağlar.

Daha ayrıntılı örnekler: 1 , 2 , 3 .


1

Sayısal dizi değişmezlerini etkili bir şekilde tanımlama

Sayısal dizi değişmezlerini tanımlarken baytları kaydetmek için kullanılabilecek birkaç yol. Onları kullanan örnek cevaplara bağlantılar verilmiştir. Bunlar @Suever tarafından oluşturulan analiz komut dosyası kullanılarak elde edilmiştir .

Birleştirme ve önceden tanımlanmış değişmez değerler

Küçük sayılarla diziler için bazen birleştirme (işlevlerini kullanabilirsiniz hve vkarşılaştır: ayırıcılar olarak boşlukları kullanarak önlemek için) yanı sıra önceden tanımlanmış değişmezleri [2 4], 2 4hve 2Khdiziyi tanımlayan hepsi, [2 4]. Benzer şekilde, 2K1vboş bir yığın ile tanımlar [2; 4; 1]. Örnek .

Sayısal dizi değişmezleri içindeki harfler

Biraz daha büyük sayılar için, bazı harflerin dizi değişmez değerleri içinde sayısal anlamları olduğu gerçeğini kullanarak boşluklar kaydedebilirsiniz. Yani yerine [3 5 2 7;-4 10 12 5]kullanabilirsiniz [IAHC;dX12A]. Misal .

Özellikle, dizi değişmez değerleri dahilinde,

  • O, l, H I KHer zamanki anlamlarını taşımaktadır 0, ...,4
  • A, ..., Edemek 5, ...,9
  • X anlamına geliyor 10
  • a, ... ddemek -1, ...,-4
  • Jve Gdemek 1jve-1j
  • P anlamına geliyor pi
  • Y anlamına geliyor inf
  • Nanlamına gelir NaN.

Karakter dizisi ve ardışık farklılıklar

Daha büyük sayılar için, bir dizeyi tanımlamak ve ardışık farklılıklarını (ile d) hesaplamak yardımcı olabilir: bunun yerine [20 10 35 -6]kullanabilirsiniz '!5?b\'d. Bu d, farklılıkları hesaplamak için karakterlerin kod noktalarını kullandığı için çalışır . Örnek .

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.