Husk'da golf için ipuçları


15

Husk , PPCG kullanıcıları Leo ve Zgarb tarafından oluşturulan oldukça yeni bir golf dilidir . Jelly ve 05AB1E gibi çok daha rekabetçi olduğu, çoğu zaman yakın olduğu bilinen ve hatta çok dilli olduğu dillere yakın kalmaya başladı.

Husk'a özgü bazı golf tekniklerini listeleyelim. Her zaman olduğu gibi, lütfen cevap başına bir ipucu gönderin.



1
@totallyhuman ilk Kabuk yanıtı Hala yeni değil
H.PWiz

Yanıtlar:


10

Öngörülerden dönen değeri kullanın

Husk'ta, bazı mülkler için girdilerini test eden işlevler, herhangi bir pozitif tamsayı doğruysa, genellikle doğru durumlarda anlamlı bir sonuç döndürür.

Örnekler:

≠  Numbers: Absolute difference
   Chars:   Absolute difference of code points
   Lists:   First Index where the differ

Comparisons <, >, ≤, ≥:

For strict comparisons:
Numbers,Chars:  max 0 (the appropriate difference¹)
Lists: The first index where the comparison between the two lists is true

For non-strict comparisons:
Numbers,Chars: max 0 (the appropriate difference + 1)
Lists: Either the result of the strict comparison or, if they are equal,
       the length of the list + 1

ṗ  Index into the list of prime numbers

V  The index of the first element for which the condition is true

€  The first index of that element/substring in the list

£  Works like €

&  Given two arguments of the same type will return the second argument if false,
   otherwise will return the first argument

|  Given two arguments of the same type will return the second argument if true,
   otherwise will return the first argument

¦  Return the quotient if divisibility holds

Λ,E,Ë  Will all return length+1 in truthy cases

Char predicates:
□,±,√,D,½  will each return the codepoint of its argument on truthy cases

¹ Uygun fark , karakterler için kod noktalarının farkı anlamına gelir. Ayrıca argüman sırasını da ifade eder. yani <x y,x-y


7

Taşan satır etiketleri kullanma

Bildiğiniz gibi [₀-₉]+|[₀-₉], sözdiziminin şu anda bulunduğunuz satırdan farklı bir hattı çağırması normaldir.

Bu ipucu, belirli bir satırda tanımlanan bir fonksiyonun aşağıdaki tabloda birden fazla fonksiyonun argümanı olarak veya aşağıdaki fonksiyonların biri veya daha fazlasına argüman olarak çağrılmasını istiyorsanız özellikle yararlıdır.

İşlev tablosu:

+----------+----------+
|Index     |Function  |
+----------+----------+
|1         |´ (argdup)|
+----------+----------+
|2         |` (flip)  |
+----------+----------+
|3         |m (map)   |
+----------+----------+
|4         |z (zip)   |
+----------+----------+
|5         |S (hook)  |
+----------+----------+

Kodunuzdaki satırlar yukarıdan aşağıya doğru ilgili 0 tabanlı endekslerle etiketlenir. Eğer M <N , M etikettir ve N kodunuzda hatlarının sayısıdır, etiket sadece çizgi tanımlanmış fonksiyonu temsil M . Eğer N ≤ M <N * 6 , bu indisinde, Tablo yukarıdan fonksiyonu temsil ⌊M ÷ N⌋ hattı tanımlanmış fonksiyonu M mod N ilk parametre olarak verilir. Eğer N * 6 ≤ M , bir indeks hata ortaya çıkar.


5

Lambdalar yeni işlevlerden daha kısa olabilir

Muhtemelen çok satırlı bir programınız olup olmadığını bildiğiniz gibi, abonelikleri olan satırlara ₀…₉, örneğin

f
g

işlevine atıfta bulunacaktır g. Şimdi girdileri her zaman işleve uygularsanız g(ve birden çok kez kullanırsanız); böyle bir şey:

f₁⁰[...]g₁⁰[...]
h

Bir lambda tanıtmalısınız, çünkü her ek kullanım için 1 bayt tasarruf sağlar:

λf⁰[...]g⁰[...])h

Tersi de doğru olabilir

Kendine referans veren lambdas ( φχψ) durumunda, girdileri doğrudan özyinelemeli işleve uyguladığınız özel bir durum vardır, bu durumlarda yeni bir lambda tanımlamak ve kullanmak yerine alt simge kullanmaktan daha iyi olursunuz .


5

Kullanımları Γ

Listelerde desen eşleştirme veya liste yapısökümüΓ olarak bilinen yerleşik öğenin ana kullanımı, bir listeyi bir baş ve kuyruğa bölmek ve bunlara ikili bir işlev uygulamaktır. Bu, Haskell desen eşleştirme deyimine karşılık gelir

f (x : xs) = <something>
f [] = <something else>

burada <something>bir ihtiva eden bir ifadedir x, xsve muhtemelen f. Her Γbiri biraz farklı çalışan 4 aşırı yükleme vardır .

list

İlk aşırı yükleme, listbir değer ave bir ikili fonksiyon alır f. Bir liste alan, aboşsa geri dönen yeni bir işlev döndürür ve boş fdeğilse baş ve kuyruğu çağırır . Örneğin, Γ_1€bir liste alır, -1boşsa döndürür ve kuyrukta ilk öğenin ilk oluşma dizini değilse döndürür .

listN

İkinci aşırı yükleme, listNbuna benzer list, ancak bunun adışındadır ve bunun yerine dönüş türünün varsayılan değeri kullanılır. Örneğin , varsayılan sayısal değer olduğundan Γ€eşdeğerdir .Γ0€0

Pratikte, varsayılan değer alakasız veya tam olarak ihtiyacınız olan şey listNolduğundan daha sık kullanılır list. Ortak bir örüntü, üç fonksiyonun Γ~αβγnerede αβγolduğu; bu βilk eleman ve γkuyruk için geçerlidir ve sonuçları ile birleştirir α. Örneğin bu cevapta kullanılmıştır . Diğer modeller şunlardır Γo:αtatbik edilmesi için αbirinci elemana ve sadece Γ·:mαtatbik edilmesi için αbirinci dışındaki tüm elemanlar için. İkincisi bu cevapta kullanıldı .

listF

Üçüncü aşırı yüklenme biraz daha karmaşıktır. Mesela list, bir değer ave bir işlev alır ve bir liste alan fyeni bir işlev döndürür g. Ancak, bu süre f, gkendisi olan ve herhangi bir değerde (giriş listesinin kuyruğu dahil, ancak bunlarla sınırlı olmamak üzere) ek bir işlev argümanı alır . Bu , listelerde listFgenel bir özyineleme şeması uyguladığı anlamına gelir . / listFile açık özyineleme genellikle bu cevaptakiyle aynı uzunlukta veya daha kısa olduğu için çok sık kullanılmaz .listlistN

listNF

listNFetmektir listFNe listNetmektir listgirişi: aatlanırsa, ve dönüş türü varsayılan değeri yerine kullanılır. Nadir durumlarda, örneğin bu cevapta , doğru bir kattan daha kısa olabilir .

Özyinelemeli sürümlerinin bir örneği olarak, Γişlev Γλ·:o⁰↔bir listeyi önce sırayla, son, ikinci, ikinci-son, üçüncü, üçüncü-son, vb. Karıştırır. Çevrimiçi deneyin! İşlev f, λ·:o⁰↔argümanı tüm işlev olan açık lambda'dır . Yapan fşey kuyruğu tersine çevirir , daha sonra ana işlevi özyinelemeli olarak çağırır o⁰ve son olarak kafayı geri yapıştırır ·:. Tabii ki, Γ·:o₀↔bir bayt daha kısadır, ancak çizgi bu işlevden başka bir şey içeriyorsa çalışmaz.


3

Birleştiriciler daha üst düzey fonksiyonlara uygulanabilir

X tam sayılarının bir listeniz olduğunu ve X'in uzunluktan (X) daha büyük toplam öğe sayısını saymak istediğinizi varsayalım . Bir yüklemi tatmin eden sayma elemanları daha yüksek dereceli işlevle yapılır #, ancak burada yüklem ( uzunluktan (X) daha büyük olmak ) X'e bağlıdır . Çözelti bağdaştırıcının uygulamaktır için #ve fonksiyonunu o>Lkontrol eder bir liste, bir dizi daha kısa olup olmadığı söyledi. İşlevde, XṠ#o>L listesi iletilir , kısmen uygulanan işlev iletilir ve X ikinci argüman olarak verilir .o>L##

Genel olarak, αdaha üst düzey bir işlev, βbir ikili işlev ve γtekli bir işlev varsa, ṠαβHaskell sözde koduna eşdeğerdir

\x -> α (\y -> β x y) x

§αβγ eşittir

\x -> α (\y -> β x y) (γ x)

ve ~αβγeşittir

\x y -> α (\z -> β x z) (γ y)

türler eşleştiği sürece.

Başka bir somut örnek olarak, §►δṁ≠Pbir liste, bir permütasyon bulur X karşılık gelen değerleri mutlak farklarının toplamının en üst düzeye X ( δṁ≠mutlak fark kullanılarak iki listeleri fermuarlar ve toplamını alır).


3

Husk'un varsayılan değerleri

Husk, örneğin lastboş bir listenin elemanını almaya çalıştığınızda sorun yaşadığınız Haskell kadar katı değildir . Bunu başarmak için önceden tanımlanmış değerler kullanır, işte maxima ve minima varsayılan değerlerinin bir listesi:

.------------------------------------.---------------.----------.-------.
|   Type (X and Y are placeholders)  | default (def) |    max   |  min  |
|------------------------------------|---------------|----------|-------|
|       Character (C)                |      ' '      | \1114111 | \NUL  |
|       Numbers   (N)                |       0       |   Inf    | -Inf  |
|       List of X (LX)               |      []       |  ∞ max   |   []  | *
|       Function :: X -> Y           | const (def Y) |   n/a    |  n/a  |
'------------------------------------'---------------'----------'-------'

* Burada ∞ karşılık gelen maksimum değerin sonsuz bir listesini temsil etmelidir (örnek için aşağıya bakın)

Not: Tuples (X, Y) için her bileşen için değerleri ayrı ayrı kullanır.


Kullanıldıklarında

Maxima ve minima yalnızca ▲▼boş listelerde kullanılırken (örneğin husk -u "▼" "[]:LLN"sonsuz bir liste döndürür Inf), varsayılan değerler birkaç yerde kullanılır:

  • kendiniz bir değer vermeden boş listelerin üzerine katlanma ( Fve )
  • bekleyen varsayılan değer (ile Θ)
  • read ( r) başarısız olduğunda
  • ilk / son öğeyi ( ←→) almak veya bir ( !) dizinini oluşturmak
  • Γboş listelerde desen eşleşmesi ( )
  • kullanarak veya boş listelerinde
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.