05AB1E'de golf için ipuçları


Yanıtlar:


20

05AB1E'nin GitHub sayfalarındaki Wiki'nin bir parçası olmadığı için (olması gerektiğini düşünüyorum), şimdi ekleyeceğim, onu daha iyi anlayacağım.

Sözlük nasıl kullanılır?

05AB1E, bildiği tüm kelimeleri içeren aşağıdaki words.ex sözlük dosyasına sahiptir . Peki bu sözlükteki kelimelere nasıl erişiriz? Sözcüğü "testing"örnek olarak alalım:

"testing"Sözlük dosyasının satır 1453'ünde bulunabilir. İlk iki satır kelime olmadığından ve 0 indeksli sözcüğe ihtiyacımız olduğunda, 3 çıkarırız.
Öyleyse şimdi index ( 1450) var, ama nasıl kullanılır?

Sıkıştırılmış bir string'i açıp ile başlatırız . Daha sonra info.txt dosyasının ikinci sütununa bakarız . (Yani 00; 01; vb.)
Bu durumda (14) ve (50) "testing"anlamına gelir .î»

Bu "testing"nedenle sıkıştırılmış dize : “ Çevrimiçi deneyin. Neredeyse tüm 05AB1E kod parçalarında olduğu gibi, dizgeye erişemiyorsanız izlemeniz isteğe bağlıdır , bu durumda bu da işe yaramaz .

Unutulmaması gereken bazı şeyler:

İnfo.txt dosyasında indeks bulunmayan tüm karakterler olduğu gibi kullanılabilir. Bu, stekil bir kelime yerine çoğul bir çıktının eklenmesi veya ,.?!örneğin noktalama işaretlerinin kullanılması için yararlı olabilir .
ÿ(string-interpolation), dizge içindeki yığından değer eklemek istediğinizde de kullanılabilir.
NOT: info.txt dosyasında herhangi bir dizini olmayan her gevşek karakter, aşağıdaki sıkıştırma türleri için bir kelime olarak sayılır.

Kullanabileceğiniz farklı tipte sıkıştırılmış dizeler vardır:

  • ': Olduğu gibi tek bir sıkıştırılmış kelime alın (izlemeye 'gerek yok ) - 'î»: "test"
  • : Boşluk sınırlayıcı ile sıkıştırılmış iki kelime alır (izlemeye gerek yok ) - „î»î»: "test testi"
  • : Boşluk sınırlayıcı ile üç sıkıştırılmış kelime alır (izlemeye gerek yoktur ) - …î»î»î»: "test testi testi"
  • : Sıkıştırılmış dizgiyi boşluk sınırlayıcı ile alın - “î»î»“: "test testi"
  • : Sıkıştırılmış dizeyi örtük boşluklar olduğu gibi alın - ’î»î»’: "testingtesting"
  • : Başlık sınırlayıcısında sıkıştırılmış dizgiyi boşluk sınırlayıcı ile al - - ”î»î»”"Test Etme Testi"
  • : Sıkıştırılmış dizeyi boşluk sınırlayıcıyla tam büyük harfle alın - ‘î»î»‘: "TEST TEST"

Burada, kelimelerin boşlukla sınırlandırılmış bir girişine dayanarak sıkıştırılmış dizgiyi almak için faydalı bir program:

'“? lAð«Ã#¸˜ vyU "€‚ƒ„…†‡ˆ‰Š‹ŒŽ•–—™š›œžŸ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîï" Dâ vy"“ÿ“".V XlQi y?1#] '“,

Çevrimiçi deneyin.

Bu program:

  1. Girdiyi küçük harf olarak alın, alfabetik olmayan karakterleri kaldırır (boşluklar hariç) ve ardından kelimeleri boşluklara böler ( lAð«Ã#), yalnızca bir sözcük girildiyse listedeki sözcükleri sarar ( ¸˜)
  2. Her kelimenin üzerinde döngü ( vyU)
  3. Sonra her sıkıştırılmış kelime üzerinde ( "€...ï"Dâvy05AB1E programı ( "“ÿ“".V) olarak çalıştırmayı deneyecek olan sözlükten bir iç döngü vardır.
  4. Ve eğer şu anki kelimeye eşitse, onu basar ve iç çevrimi keser. XlQiy?1#

Bir giriş good bye worldile çıkış bu nedenle olacaktır “‚¿Þ¡‚ï“. Çevrimiçi deneyin.

NOT: Bu jeneratörün çalışması için sözlüğün içinde kelimenin var olup olmadığını görmeniz gerekir ve herhangi bir özel karakteri veya çoğul kelimeleri görmezden gelir. Sadece sözlükte tamamen aynı olan kelimeler bulunur.

İşte …Ÿ™‚ï!"merhaba dünya!" Dizesi için kullandığım bir örnek ve ’‚¿Þ¡ ÿ ‚ï!’"güle güle ÿ dünya!" dizesi için. Boşlukların ve ünlem işaretinin nasıl kullanıldığını not edin, çünkü info.txt dosyasında indeksleri yoktur. Ek olarak, ÿyığının en üstünde bulunan ve ne yazık ki sözlüğün bir parçası olmayan "acımasız" kelimesini eklemek için kullanılır (ancak aşağıdaki bölümdeki yöntemi kullanarak hala sıkıştırılmıştır).

Dizelerin sözlüğün bir parçası olmayanları nasıl sıkıştırılması?

Words.ex sözlük dosyası oldukça büyük olsa da (tam olarak 10.000 kelime), bunun bir parçası olmayan bir sözcüğe veya sadece düz saçma olan bir dizgeye ihtiyacınız olabilir. Yani bunları da sıkıştırmanın bir yolu var mı? Sıkıştırılmış bir temel-255 alfabe tabanlı dize olan,
kesinlikle vardır .•. NOT: Bu yöntem yalnızca küçük harfli alfabedeki ve boşluklardaki karakterler için kullanılabilir.

Bir sözcüğü / dizeyi sıkıştırılmış base-255 alfabesine dayalı dizgeye dönüştürmek için yararlı bir program:

vAyk})> 27β 255B ".•ÿ•"

Çevrimiçi deneyin. .

Yukarıdaki bu programın yaptığı şey:

  • vAyk})>: Girdi harfinin 1 indeksli alfabe indeksini alın, boşluklar indeks olur.
  • 27β: Bu endeksleri taban 27'den tek bir sayıya dönüştür
  • 255B: 05AB1E'nin kendi kod sayfasını kullanarak bu numarayı Base-255'e çevir
  • ".•ÿ•": Bu sıkıştırılmış dizeden önce bir .•satır önde

Burada, @Kaldo 'nun.•zíΘ• "kaz" kelimesini sıkıştırmak için kullandığı örnek bir cevap .

Büyük tamsayılar nasıl sıkıştırılır?

Diyelim ki bir şey için çok büyük bir sayı kullanmak istiyoruz, ancak gerçekten güç hesaplamaları ile alınamıyor. Örneğin, 18238098189071058293ne olursa olsun büyük tamsayıya erişmek istediğimizi varsayalım.

Bu durumda , formattaki bir sayıyı sıkıştırmak için hem öncü hem de sondaki kısmı kullanabiliriz [1-9][0-9]+.
Yukarıdaki örnek sayı olacak •15Y₁Ò'Θpc•. Çevrimiçi deneyin. Yine, sıkıştırılmış sözlük dizgisinde olduğu gibi , takip yolu isteğe bağlı olarak kaldırılabilir .

İsteğe bağlı olarak, tamsayı yeterince küçük olduğunda, yalnızca 2 sıkıştırılmış karakterin kullanılması gerektiğinde, Žbunun yerine kullanabiliriz ; bu durumda, onu kapatmak için izleyen bir bayta ihtiyaç duymayacağız ve tamsayı 4 yerine 3 baytta sıkıştırılacak. örneğin, tamsayı 13562sonuçlanır •rl•, ancak yalnızca iki karakter kullandığından Žrlbunun yerine olabilir .

Ayrıca, aralıktaki sayılar , 05AB1E'nin kod sayfasından ilave bir karakter ve artı bir karakter [101, 355]kullanılarak 2 Ƶbaytta sıkıştırılabilir . Yani, örneğin, Ƶ–tamsayı için kullanılabilir 250. İşte tüm mevcut numaralara genel bir bakış. Bu karakterler Base-255'ten Base-10'a dönüştürülür ve ardından 101 eklenir (aralıktaki sayılar [0,100]zaten 1 veya 2 bayttır).

Bunlar nasıl oluşturulur 15Y₁Ò'Θpcve rloluşturulur? Çok basit, sayı 05AB1E'nin kendi kod sayfasını kullanarak Base-255'e çevrildi. Aşağıdaki program kullanabilirsiniz Yani o zaman kullanacağı için sıkıştırılmış bir numara almak için Ƶ., Ž..ya da •...•sıkıştırılmış tamsayı boyutuna bağlı olarak:

101 355Ÿså i 101-255B"Ƶÿ" ë 255B Dg2Qi "Žÿ" ë "•ÿ•"

Çevrimiçi deneyin.

Burada, @Emigna'nın•3Èñ• tamsayı için kullandığı örnek bir cevap 246060.

Tamsayılı listeler nasıl sıkıştırılır?

Bazen bir tam sayı listesini tek bir sayı yerine sıkıştırmak istersiniz. Örneğin, listeyi [5,93,17,83,4,44,32,19,4,45,83,90,0,14,3,17,17,81]ne nedenle olursa olsun istediğimizi varsayalım. Bu durumda, aşağıdakileri kullanabiliriz: •4βŸ{©£MG]q‡dZΘp•94в Çevrimiçi deneyin.

Bu sıkıştırılmış sayıyı ve dönüştürmek istediğimiz Temel'i oluşturmak için yararlı bir program:

Z>© β 255B ®s"•ÿ•ÿв"

Çevrimiçi deneyin.

Yukarıdaki bu programın yaptığı şey:

  • Z>: Giriş listesindeki maksimum sayı + 1'i alın ( ©: ve kayıt defterine kaydedin)
  • β: Giriş listesini tabandan max+1tek bir sayıya dönüştürün
  • 255B: Bu sayıyı sıkıştırın (yukarıdaki bölümde yaptığımız gibi)
  • ®s"•ÿ•ÿв": Biçimdeki sonucu döndürür: satır başı , sıkıştırılmış sayı , maksimum + 1, izleyenв

İşte •4Œ”dóŒfÝŸĀTUÕáOyÖOÀÁàu¼6¹₆Žr‡_›y³eß₂©ǝ²ƶ"SAÎAñ'¡û†Ø(•91вlisteyi sıkıştırmak için kullandığım örnek bir cevap [85,30,29,39,28,37,33,88,31,40,34,89,35,41,32,90,36,38,42,43,44,60,45,61,46,62,47,63,48,64,49,65,81,50,66,51,67,52,68,53,69,86,54,70,87,55,71,56,72,82,57,73,79,80,58,74,59,75,76,77,78,83,84].
Not: Bu cevapta •6j|eDEJÞó(ÍêΓλùÄÞKüzHÇ-ø`JδŠ₂+Öηôî®À8†6/ðÎ6ùøΓ°ÓĆ;ˆ©Ā•2ôtüm sayılar tam olarak iki rakam olduğundan, eşit baytlık (57) bir alternatiftir. Bazı durumlarda (özellikle küçük listeler) bu daha kısa bir alternatif olabilir.

Tamsayılı sıkıştırma vs Tamsayılı liste sıkıştırma:

Bu ikisi ile her iki şekilde gidebilir. Bazen sıkıştırılmış bir liste daha kısa, bazen sıkıştırılmış bir tamsayı, bazen tamamen farklı bir alternatif daha kısadır. Bu nedenle, yukarıdaki jeneratörlere tamamen güvenmek yerine, muhtemelen daha fazla golf oynamak için kendi yargı ve golf becerilerinizi kullanın. İşte bazı örnekler:

[44, 59]( @Emigna'nın bu cevabında kullanılır ):

[2,4,6,0]( @Emigna'nın bu cevabında kullanılır ):

  • •3ā•7в 6 bayttır (sıkıştırılmış tamsayı listesi üreticisi tarafından oluşturulur)
  • Ž3ā7в 5 bayttır
  • Ancak bu durumda, Ž9¦S4 bayt ile en iyi seçenek olacaktır (2460 tamsayıları bir basamak listesine sıkıştırılmış)

10101001100101001( bu cevabımın cevabında kullanılmış ):

  • •a½₄Ƶ6®í• 9 bayttır (sıkıştırılmış büyük tamsayı üreteci tarafından üretilir)
  • •1∊}•2вJ 8 bayttır (eklenen birleştirme ile sıkıştırılmış tamsayı listesi üreteci tarafından oluşturulur)
  • Ancak bu durumda •1∊}•b6 bayt ile en iyi seçenek (sıkıştırılmış tamsayı listesi, yerine bir ikilik ile sıkıştırılmış tamsayı listesi )

[85,30,29,39,28,37,33,88,31,40,34,89,35,41,32,90,36,38,42,43,44,60,45,61,46,62,47,63,48,64,49,65,81,50,66,51,67,52,68,53,69,86,54,70,87,55,71,56,72,82,57,73,79,80,58,74,59,75,76,77,78,83,84]( bu cevabımın cevabında kullanılmış ):


12

Örtük giriş

05AB1E'nin piyasaya sürüldüğü günlerde, örtük girdi oldukça yeni ve şıktı. Günümüzde diğer rekabetçi dillerle (Jelly, MATL, Pyth, vs.) takip etmek için gerekli gibi görünüyor.

Örneğin, iki sayı eklemek istediğinizde şunları yapabilirsiniz II+:

I    # Input_1.
 I   # Input_2.
  +  # Add them up.

Burada test et


Bununla birlikte, örtük girdi kullanarak , yalnızca 1 bayta kadar kısaltabiliriz, yani +:

+    # Take two numbers implicitly and add them up.

Burada test et


Bu, yalnızca yığının uzunluğu operatörün arkasından küçük olduğunda gerçekleşir. Son bir örnek 3+. +Operatörün aritesi yığında sadece 1 eleman varken 2'dir :

3    # Push the number 3 on top of the stack.
 +   # Request implicit input and add to the 3.

Burada test et


8

altdizgelerin

£bdizenin ilk karakterlerini almak için kullanılan komuttur a.
örn: "hello_world"5£ -> "hello"

Fakat eğer bbir endeks listesi ise, dizeyi bu büyüklüklerin (üstüne) parçalarına böler.
örn: "hello_world"5L£ -> ['h', 'el', 'lo_', 'worl', 'd']


8

Önceden tanımlanmış değişkenler

05AB1E'de biraz gizlenmişler. İşte tüm önceden tanımlanmış değişkenlerin bir listesi:

  • ¾0counter_variable bu komuttan önce değişmediyse , iter .
  • X, 1X değişkeni bu komuttan önce değişmediyse iter U.
  • Y, 2Y değişkeni bu komuttan önce değişmediyse iter V.
  • ®, -1eğer bu komuttan önce kayıt değiştirilmezse , iter ©.
  • ¯, []bu komuttan önce global_array öğesine hiçbir şey eklenmediyse (boş dizi) iter .
  • ¸, [""]giriş yoksa boş bir yığına iter . (Bunu bulmak için @Emigna teşekkür ederim.)

24
¾iter 0 => o olmayan anımsatıcı alır gibi yaklaşık en
Fatalize

6
@Fatalize: 0 da 0 iter. ¾Yalnızca 0 itmek istiyorsanız 0 olarak başlatılır bir karşı değişkeni 0 kurs daha doğal taşımaktadır iter, ancak itmek isterseniz 5,0,7, 5¾72 daha kısadır bayt olduğunu 5 0 7.
Emigna

7
Günüme dönersek , ¾demek istediğim .75, bir zamanlar bu gerçeği Pyth ile yendim . Bu yeni çıkmış golf dilleri, anımsatıcılarla ilgili bir ipucuna sahip değil ...
ETHproductions

31
Ne hakkında konuştuğunuz hakkında hiçbir fikrim yok: s. print(3 / 4)Python'da 2 bana veriyor 0.
Adnan,

2
Eğer Mbaşındaysa , iter -Inf.
mbomb007

7

Tuvali Kullanma ( Λveya )

Dokümanların bir parçası olmadığından ve @Adnan şu anda yazmak için biraz meşgul olduğundan, şimdilik burada bir ipucu olarak eklemek için izin istedim.

Canvas işlevi ( Λveya ), ekranda ASCII çizgileri çizmek için kullanılabilir. Üç gerekli parametreye sahiptir:

  • a Uzunluk: Çizgilerin boyutu. Bu, tek bir tam sayı veya tam sayı listesi olabilir.
  • b String: Görüntülemek istediğimiz karakterler. Bu, tek bir karakter, bir dize, bir karakter listesi veya bir dize listesi olabilir (son üç örnekte hepsini sarmalama dahil birer birer kullanır)
  • c Yön: Karakter çizgilerinin çizilmesi gereken yön. Genel olarak[0,7], bir veya daha fazla kullanabileceğimiz yönleriçin rakamlarımız vardır. Belirli bir karakter gerektiren bazı özel seçenekler de vardır (daha sonra bununla ilgili daha fazla).

Yön haneleri [0,7]aşağıdaki yönlere eşlenir:

7   0   1
  ↖ ↑ ↗
6 ← X → 2
  ↙ ↓ ↘
5   4   3

Tuvalin kullanıldığı yerlerde bazı örnek 05AB1E cevapları:

En sonuncusu gibi bir şey yapalım, bu yüzden Canvas Λişlevini aşağıdaki üç parametre ile kullandığımızı varsayalım :

  • a :[3,3,5,5,7,7,9,9]
  • b :!@#
  • c :[0,2,4,6]

Bu aşağıdaki çıktıyı verecektir:

  !@#!@#!
  #     @
  @ #!@ #
  ! @ # !
  # ! ! @
  @   @ #
  !#@!# !
        @
@!#@!#@!#

Çevrimiçi deneyin.

Peki nasıl çalışıyor? Peki, işte bu girdilerin üstündeki adımlar:

  1. Çizim 3(karakter !@#) yukarı doğru (yön 0)
  2. Çekmek 3-1Karakterleri ( !@) sağa doğru (yön 2)
  3. Çekmek 5-1Karakterleri ( #!@#) aşağıya doğru (yön 4)
  4. Çekmek 5-1Karakterleri ( !@#!) sola doğru (yön 6)
  5. Çekmek 7-1(karakter @#!@#!) yukarı doğru (yön 0)
  6. Çekmek 7-1Karakterleri ( @#!@#!) sağa doğru (yön 2)
  7. Çekmek 9-1Karakterleri ( @#!@#!@#) aşağıya doğru (yön 4)
  8. 9-1Karakter çiz (!@#!@#!@) sola doğru (yön 6)

-1Çizgiler örtüşmesi vardır. Yani ilk iki adım:

#
@
!

Ve

 !@

Hangi birleştirilir:

#!@
@
!

Bazı küçük notlar:


1
05AB1E'nin tuvalinin olduğunu bile bilmiyordum!
MilkyWay90

Bunu nasıl anladınız? Kaynak kodu?
Magic Octopus Urn

1
@MagicOctopusUrn @Adnan'ın bu cevabından çoğu (PS: en son cevabı da oldukça iyi açıklanmıştır ). İçin +×8ben gerçekten kaynak kodunda baktım.
Kevin Cruijssen

5

Pop veya al

Diğer yığın tabanlı dilde gibi, 05AB1E fonksiyonları genellikle pop (tüketmek) girdilerini yığından ve yığına üretimlerini itin.

Ancak, bazı işlevler olsun bunları tüketen olmadan yığınından girdilerini. Bir örnek, girdi listesinden ilk elemanı üreten headfonksiyondur ¬. Burada bir örnek program bakınız: ¬+. Bu, giriş listesinin ilk sayısını o listenin her sayısına ekler.

Hangi fonksiyonların patladığını ve hangilerinin geldiğini bilmek için, fonksiyon bilgi dosyasındaki ilgili sütuna bakın .


@NeilA. Teşekkürler! Bağlantı güncellendi
Luis Mendo

3

Şartlı Cümleler ve döngüler

Döngüler ve şart koşucular bir programın sonunda otomatik olarak kapanış parantezleri alırlar; bu nedenle, bunları döngünün / koşulların dışında bir şeye ihtiyacınız olursa koda eklemeniz gerekir.

Örneğin, ilk nasal sayıların bir listesini oluşturan bu (asılsız) programın kapatma dirseklerine ihtiyacı yoktur. [¹¾Q#NpiNˆ¼

Fakat sonuçta ortaya çıkan listede bir işlem yapmak isteseydik, örneğin delta almak için önce döngüyü kapatmamız gerekir. [¹¾Q#NpiNˆ¼]¯¥


3

Küçük 05AB1E golf ipuçları

Bu yol boyunca öğrendim küçük golf ipuçları ile bu genişletecek. (Sadece 05AB1E şahsen başladı.)

  • D(çift) ve Ð(üç katlı) ile kombinasyon halinde s(takas) ve Š(üç-takas a,b,ciçin c,a,b) kullanılarak göre genellikle daha kısa olan ©(içinde kaydetmek global_variable ) ve ®(itme global_variable ) döngüler içinde. Bu bir benim bu yanıtında bayt kaydedilmiş içinde, hem de iki benim bu cevap .
  • ½(1 ise, o zaman artırmak counter_variable 1 ile) sonunda gerekli değildir µ(ederken counter_variable ! = a, do ...) ki (örtük bitti beri benim bu yanıtında bir bayt kaydedilir ).
  • .Bdolaylı olarak yeni çizgiler üzerinde böler. Bu benim¡ cevabımda, boş eşyaları tutarken (bölme) için bir alternatif aradığımızda benim cevabımda faydalı oldu (NOT: Bağlantılı cevabın çözümü, öğeler bölmeden sonra boşluklar içerdiğinde işe yaramaz.) - Umarım bir yerleşik bölünmeye eklenir ancak gelecekte boş satırlar kalır.
  • (giriş tamsayısının rakamlarından hangisi giriş tamsayısını eşit bir şekilde bölebilir) basamakların sayısının kendisini içerir 0(sıfıra bölme hataları yerine). Örneğin, (1053 1 ve 3 ile bölünebilir; 5 ile bölünemez; 0 için bölünerek sıfır hatası verir) ile 1053sonuçlanır[1,1053,0,1] . Bu benim1 cevabımdaki listenin gücünü alarak benim için oldukça yararlı oldu , çünkü sadece 05AB1E'deki acımasızlık ve diğer her şey yanlış. bu nedenle SÖPtruthy ( 1) ile sonuçlanan bir giriş tamsayı, her bir basamağı tarafından eşit şekilde bölündüğü anlamına gelir.
  • Gördükten sonra û(belirli bir dize palindromize) bir is_palindrome yerleşik olmadığını şaşırttı . Ancak daha sonra bunu gerçekleştirmek için sadece 2 bayta ihtiyaç duyulduğunu fark ettim, bunun hangisi olduğu ÂQ( Âbifürkat olduğu, bunun için kısa DR: Çoğalt ve Ters kopya; Qyığındaki ilk iki değerin eşit olup olmadığını kontrol etmek).
  • Bir listeyi birden fazla şeye göre filtrelemek istediğinizde, hepsinde bir arada olmaktansa, birden çok gevşek filtrenin olması genellikle daha ucuzdur. Çünkü iki filtreniz olduğunda, iki filtre kullandığınızda Ds*(yinelenen, takas, mantıksal-VE) gibi davranmak için (yinelenen, değiştir, tekrarla) satırları boyunca bir şeye ihtiyacınız olacaktır . Örneğin: Bu mücadelede , en az bir tane içeren 0ve rakamların toplamına eşit olan dört basamaklı tüm sayıları listelemeliyiz 9. Bir aralık kullanılması [1000,10000], dört basamak uzunluğunu kapsar, ancak daha sonra iki filtre daha kalır. Başlangıçta ₄4°ŸʒD0åsSO9Q*(14 bayt) kullandım, fakat iki filtre kullanarak bir bayt kaydedilebilir: ₄4°Ÿʒ0å}ʒSO9Q(13 bayt). (Hangisi daha sonra ₄4°ŸεW°ö9Q(10 byte) ' a kadar golf oynadı golf oynadı)?)
  • Tamsayı 0ile dolgu olarak sıkıştırmak istediğinizde kullanabilirsiniz . Bununla birlikte, bununla ilgili bir sorun, dolgunun 0bir dizge haline gelmesidir "0", bu nedenle daha sonra karışık dizeler ve tamsayı ile sıralama yapmayı denerseniz, bu muhtemelen istediğiniz sonucu vermeyecektir. O sıkıştırılmış iç listelerini sıralamak nasıl bir örnek Buraya: 0ζ€{. Bu int için açık bir döküm (ilave edilmesi suretiyle tespit edilebilmektedir ïancak o zaman sıralama zip sonra), ve: 0ζï€{. Bununla birlikte, zip-dolgu ile ¾aynı sabiti kullanmak, 0zip sırasında bir string yerine bir tamsayı olarak kalmasına neden olacaktır. Yani ¾ζ€{burada bir bayt kurtaracak. Bu ipucu tarafından sağlanan Mr.Xcoder @ bir byte kaydetmek için benim bu yanıtında .
  • Bir listedeki birden çok sayının rakamını toplamak istiyorsanız, kullanabilirsiniz €SO. Ancak daha kısa olanı otomatik olarak vektörleştiren kullanıyor. Bu ipucu @Grimy tarafından burada bir byte (ve burada 2 byte ) tasarruf etmek için verilmiştir .
  • Yalnızca negatif olmayan tamsayılarla ilgileniyorsanız ve bir süzgecin içinde 0 veya 1 olup olmadığını kontrol etmek istiyorsanız, elbette bariz olanı kullanabilirsiniz 2‹. Bununla birlikte, !(faktoring) kullanmak ayrıca 0ve için sadece 1 (truthy) ile 1sonuçlanacaktır ve diğer her değer daha yüksek bir şeyle sonuçlanacaktır (ve bu nedenle 1falsey , çünkü sadece 05AB1E'deki truthy'dir). Bu ipucu tarafından sağlandı @Grimy için buraya bir bayt kaydetmek .

2

Otomatik vektörleştirme

05AB1E’deki bazı operatörlerin dizilerde otomatik olarak vektörleştirdiğini unutmayın. Örneğin 5L3+, aşağıdaki sözde koduna aykırı olan kod:

[1, 2, 3, 4, 5] + 3

olacaktı:

[4, 5, 6, 7, 8]

Otomatik olarak vektörleşmiyorsa, operatörü de kullanabilirsiniz . Tek bir karakter komutu alır ve bu (monadik) operatörünü her eleman üzerinde gerçekleştirir. Her öğeyi bölmek için bir örnek aşağıdaki koddur ( burada deneyin ):

€S

Oysa normal Sişleç, dizideki her öğeyi bölüştürür ve tek bir diziye düzleştirir ( burada deneyin ).


Bir dizideki nnth elemanına nasıl atarsınız?
Andrew Savinykh

@AndrewSavinykh Şu anda, bunun için hiçbir yerleşik yapı yok, ancak uygulamak istediğim bir şey var.
Adnan

@Adnan Bunu yapmanın bir yolunu buldum. Nnth dizininde de atanacak değere sahip başka bir liste oluşturun. Ardından, ñönce gelen değerleri n(dizin) kullanarak listeleri birleştirin . tio.run/nexus/05ab1e#@2/iw2XiE2Tio81ldHjj//8A
mbomb007

@ mbomb007 Bu mümkün, tek sorun diziyi daha sonra değiştirememenizdir, çünkü birleştirme komutu yalnızca dizeleri argüman olarak alır (ve listeyi dizeye dönüştürür).
Adnan

2

Girişlerin Sıralanması

Girdiğiniz emrin kodunuz üzerinde çok büyük bir etkisi olabilir ve çoğu zaman s, yığının en üstünü yığında en yüksek şeyle değiştirmek için kullanıyorsanız , sorunu doğru düşünemezsiniz. Girişleri yeniden sıralamaya çalışın ve girişleri zamanından önce değiştirerek, önceden yığına ekleyerek veya bir yere çoğaltarak değiştirme gerekliliğinden kurtulabileceğinizi görün. En belirgin I&O en başarılı 05AB1E cevabı olabilir.


2

05AB1E ASCII-Sanat Golfü

Aşağıdaki kod, ASCII sanatını özel bir temel dönüştürme kullanarak 05AB1E'ye dönüştürmeye yardımcı olur.

|»©ÐÙSDŠ¢øΣθ}R€н¬®sÅ?iD2£RDŠKsì}J©žLR‡®gö₅B®s"•ÿ•“ÿ“ÅвJ"

Çevrimiçi deneyin.

Bu, aşağıdakiler tarafından gerçekleştirilir:

  1. ASCII çiziminde benzersiz karakterleri listeleme.
  2. Onları ipte azalan sırayla (en az meydana gelen karakterlerde en çok meydana gelen) kaç kez oluştuğunu sıralayın.
  3. ASCII çizimi en çok meydana gelen karakterle başlıyorsa ilk iki maddeyi ters çevirin (sıkıştırılmış tamsayıdaki 0'ları önlemek için).
  4. 0-9A-Za-zHer biri değiştirilinceye kadar girişin karakterlerini o sırayla eşleştirin, her biri kendi eşleme karakterini elde eder.
  5. Taban, değiştirmeniz gereken en yüksek tabanı kullanarak (benzersiz karakterlerin sayısına göre) sıkıştırın.
  6. Taban tekrar taban-255'e dönüştürülür (05AB1E sıkıştırması için).
  7. Biçiminde Biçim her şey: •<compressed_integer>•“<sorted_distinct_characters>“ÅвJ.

Ayrıca kompres dize tırnak yapmanızı sağlar "; ÅвBu dizisi kullanılır özel baz olarak dizge kullanılarak oluşturulan tamsayı taban-dönüştürmek; ve Jtüm bu karakterleri birlikte verilen tek bir dizgeyle birleştirecektir.

ASCII-art için iyi 62 eşsiz karakter içeren ve içinde olan desenleri kabul eder.
Benzersiz karakter sayısı ne kadar az olursa, sıkıştırma o kadar iyidir.


XNOR dijital zamanlama şemasını çizin (214 bayt, 9 benzersiz karakter) için örnek çıktı :

    ┌─┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐ ┌───┐  
A ──┘ └─┘ └─┘     └─┘ └─┘ └─┘   └──
  ┌───┐ ┌───┐ ┌─┐ ┌─────┐   ┌─┐ ┌─┐
B ┘   └─┘   └─┘ └─┘     └───┘ └─┘ └
    ┌─────┐   ┌─┐   ┌─┐   ┌───┐   
X ──┘     └───┘ └───┘ └───┘   └────

Olabilir:

05AB1E , 106 bayt

•I£.µ*:]ó±øqaµb₄ΘYQmœ¹µû₄p´ζÂĆ_5ŠKÑ×ðòË|₄#¹¶úôÂ-Í|¯ε¼É₂ïδ&é–9»ÞFò1î×HÃBjý2ĆÉ≠FYÂÂèC j‘£Å₅Œ•“─ └┘┐┌
XBA“ÅвJ

Çevrimiçi deneyin.

(106/214) * 100 = orijinal ASCII-art dizesinin boyutunun% 49.53'ü.

05AB1E'deki (eski) bu meydan okuma için yaptığım asıl başvurumla aynı bayt sayısı .


Kod açıklaması:

NOT: Kod kesinlikle golf oynamaz. ASCII sanatını en verimli sıkıştırmaya dönüştürmek için hızlıca yazılmıştır, bu yüzden oldukça çirkin ve uzun ..

               # Take multi-line input
  ©              # Store it in the register to reuse later                         
ÐÙS              # Only leave unique characters (as list)
   DŠ¢ø          # Map it with the count for each of those characters
       Σθ}R      # Sort it based on that count (highest to lowest)
           €н    # Remove the count again, so the sorted characters remain
¬®sÅ?i           # If the input starts with the most occurring character:
      D2£RDŠKsì} #  Swap the first two characters in the list
J©               # Join everything together, and store it in the register to reuse later
  žLR           # Map each character to [0-9A-Za-z]
      ®gö        # Get the amount of unique characters, and convert it to that Base
         B      # And then convert that to Base-255
®s               # Push the string and swap so the compressed integer is at the top again
  "•ÿ•“ÿ“ÅвJ"    # Insert it in the correct output format
                 #  `•<compressed_integer>•“<sorted_distinct_characters>“ÅвJ`
"•ÿ•"            # (after which the result is output implicitly with trailing newline)

1
05AB1E kod değişti sayfası beri arada, maksimum taban değiştirilir 214'e kadar 255 .
Adnan,

1
Belki de cevabınıza ekleyebileceğiniz bir şey (veya jeneratörü ile değiştiriniz), ancak ASCII sanatında 10'dan az karakter kullanılıyorsa, iki baytlık golf oynayabilirsiniz. Yani , jeneratörünüz bu 22-bayt verir , ama bunun yerine bu 20-bayt olabilir .
Kevin Cruijssen

@KevinCruijssen fikri, aktarmaya çalıştığım şeydi, gerçekten de jeneratörün iyi bir şey olduğunu iddia etmiyordu: P. Dürüst olmak gerekirse hala osabie'de çalıştığından şüpheliyim. Bunu çok uzun zaman önce yazdım!
Magic Octopus Urn

@MagicOctopusUrn Elixir yeniden yazmada çalıştığından emin değil, ancak kesinlikle eski sürümde çalışıyor. Zaten bir yıl önce yarısındaki hakkında Base-255 Base-214 düzenledikten olarak söz oldu Adnan Yukarıdaki un yorumunu. Bunun dışında harika çalışıyor ve birkaç kez kullandım (her seferinde daha fazla golf oynamasına rağmen).). Hem dizi hem de sayı üretimi harika çalışıyor!
Kevin Cruijssen

İşte geliştirilmiş bir versiyon. (Çok çirkin ve hızlı bir şekilde yazılmış, ama işe yarıyor). Bu , 113 örneğiniz yerine 108 bayt yapar. Yaptığım iyileştirmeler: ilk önce en yüksek görünüme sahip farklı karakterleri sırala (en yüksek yer ilk karakter değilse, bu durumda en üstteki iki karakteri değiştirir), böylece sıkıştırılmış tamsayı mümkün olduğunca küçük; <str><compr_int><int>вèJyerine kullanarak <compr_int><int>BžLR<str>‡; ve string-tırnak yerine yerine , girişin bir parçası olabilir. ""
Kevin Cruijssen

1

Dizeler ve girişler eşit tiptedir

Herkesin kabul ettiği bir şey değil ama işe yarıyor.

Aşağıdaki iki programı göz önünde bulundurun:

4 5+
"4""5"+

Her ikisi de 9 sonuçlanır . Bunun nedeni, her değerin ilk önce (ile ast.literal_eval) değerlendirilmesidir . Bu nedenle, tüm dize manipülasyon operatörlerini ints üzerinde ve tüm int manipülasyon operatörlerini dize üzerinde gerçekleştirebiliriz.

Örneğin , sonuçta 12345ûpalindromize olur 12345, sonuçta 123454321. Ondan sonra bu sayı üzerinde düzenli bir matematik yapabiliriz.

12345û50000-

Bu sonuçlanacaktır: 123404321 .


0

Gizli döngüler ve yineleyiciler

05AB1E aşağıdaki normal döngülere ve yineleyicilere sahiptir:

  • F, 0 ile yinelenir .. n-1 .
  • G, 1 ile yinelenir .. n-1 .
  • ƒ, 0 ile yinelenir .. n .
  • v, her elemanın üzerinde yinelenen s [0], s [1], .., s [n] .
  • ʒtam olarak bir döngü değil, bir süzgeç komutudur. Bu komutu her bir öğenin içinde döngüde bulunma biçiminin istenmeyen davranışı nedeniyle kötüye kullanıyoruz.

Bu döngüleri kullanarak, aşağıdaki gizli döngüleri türetebiliriz :

  • Bunun yerine, gFkullanılabilecek vbir Ndeindex olanı da kullanabilirsiniz .
  • vy -> ʒYedek biraz daha karmaşıktır:
    • Sonuçları hemen yazdırmanız gerekir. Bu, otomatik baskının yığının üst kısmından yazdırılmasını önler.
    • Kod pasajı bir cihazda çalıştırılır. yeni bir geçici yığında . Bu, yığına bağımlı snippet'lerin kullanılamayacağı anlamına gelir.
    • yBu tür ilmeklerde çağrı yapmak mümkün değildir.

Bu bir yıl önce nakledilmiş biliyorum ama değil [, µve εdöngüler / yineleme normalin de parçası?
Kevin Cruijssen

Ayrıca, yşimdi bunlardan bazıları ile çağırmak mümkündür.
Magic Octopus Urn,
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.