Teraz, kiedy jestem całkowicie uzależniony od Code Golf, prawdopodobnie nadszedł czas, aby spróbować wybrać kilka języków golfowych.
Biorąc pod uwagę, że gram prawie wyłącznie w JavaScript, Japt wydaje się logicznym językiem na początek. Zagłębię się w dokumentację przy następnej okazji, ale w międzyczasie proszę zamieścić wszelkie wskazówki dla Japt w odpowiedziach poniżej.
Jako że jestem początkującym w językach Japt i ogólnie w golfa, gdybyś mógł „przetłumaczyć” swoje wskazówki na JavaScript, tam gdzie to możliwe, byłoby to bardzo pomocne w pomaganiu mi w opanowaniu różnych rzeczy.
Odpowiedzi:
Przejście z JavaScript do Japt
Jak zapewne wiesz, Japt to po prostu skrócona, rozszerzona wersja JavaScript. Stworzyłem Japt, ponieważ miałem już dość długich nazw nieruchomości, takich jak
String.fromCharCode(x)
iMath.floor(x)
, oraz żmudności robienia takich rzeczy, jak tworzenie zasięgu. Oto absolutne minimum, które musisz wiedzieć, przechodząc z JavaScript do Japt:U
,V
,W
,X
,Y
, iZ
; pełna tablica jest przechowywana wN
. Wynik ostatniego wyrażenia jest drukowany automatycznie.a
-z
(ià
-ÿ
) do liczb, ciągów i tablic. Gdy użyjesz jednej z tych liter, Japt wypełnia.
i(
;Uc
w Japt jest równoważne zU.c(
JavaScript, co może oznaczać ceil, charCodeAt lub concat, w zależności od typuU
. Stąd pochodzi większość mocy Japt; Pełne listy tych metod można znaleźć w sekcjach „_____ funkcje” dokumentów Japt (u tłumacza ).)
i)
reprezentuje))
. Dzieje się tak, ponieważ kiedy pierwszy raz zaprojektowałem Japt, chciałem zaoszczędzić jak najwięcej bajtów, i tak po raz pierwszy pomyślałem o zrobieniu tego. (ChoćUs w n
wygląda lepiej niżUs)w)n)
, IMHO.)ABC{...}
, gdzieABC
może być dowolnym ciągiem zmiennych. Funkcje działają w przeważającej części tak, jak działają w JS, a główną różnicą jest automatyczne zwracanie ostatniego wyrażenia (zamiast konieczności używaniareturn
lub wymyślania nawiasów ES6).'
oznacza pojedynczy ciąg znaków (tj'a
jest taki sam jak"a"
) i#
pobiera następny kod i staje się tą liczbą (#e
jest taki sam jak101
).$
pozostaje takie samo podczas procesu transpilacji. Możesz użyć tego do implementacjifor
pętli, na przykład, ponieważ Japt ich nie ma, ale sugerowałbym użycie innych metod (takich jakm
łańcuchy i tablice lubo
liczby).""
,0-9
,(
,+
,=
, itd. - pozostają takie same, gdy transpiled (w przeważającej części, w każdym razie).I to wszystko, co musisz wiedzieć, aby napisać podstawowy kod Japt. Osiągnięcie maksymalnej mocy golfa w Japt wymaga więcej wiedzy, ale można to znaleźć w innych odpowiedziach.
Oto podstawowy przykład. Załóżmy, że chcesz pobrać ciąg znaków ASCII i zastąpić je szesnastkowym kodem znaków. Oto jak możesz to zrobić w JavaScript:
Teraz przekonwertuj na Japt.
.split("")
w JS jest równoważne zq""
Japt, a nawet krótszym, właśnieq
..join("")
jest również sprawiedliwyq
, z tą różnicą, że obiekt jest tablicą zamiast łańcucha..map(
jestm
,.charCodeAt(
jestc
i.toString(
jests
. Więc nasz kod Japt może wyglądać następująco:Jednak w Japt
m
działa równie dobrze na łańcuchach, jak na tablicach, więc możemy usunąć obaq
s:Przetestuj online!Jak widać w polu „Kod JS”, transponuje się to bezpośrednio do:
Gdy nauczysz się pracować z Japt, będziesz coraz mniej koncentrować się na konwersji w tę iz powrotem z JavaScript i będziesz mógł pisać w Japt jako własnym języku. Oto wyjaśnienie, w którym całkowicie pominięto część JavaScript:
źródło
Um_c s16
?¡Xc s16
?Kompresowanie tablic łańcuchowych
Wprowadzenie
Jeśli masz tablicę ciągów w kodzie, najbardziej oczywistym sposobem na skompresowanie byłoby uruchomienie każdego z nich
Oc
osobno. Na potrzeby tej wskazówki będziemy pracować z tablicą["lollipop","marshmallow","nougat","oreo"]
, która początkowo waży 42 bajty. Uruchomienie każdego ciąguOc
daje nam:To teraz 33 bajty, przyzwoita oszczędność.
Krok 1
Ale możemy zrobić lepiej. Jeśli połączymy tablicę z ciągiem oddzielonym znakiem nowej linii, możemy pozbyć się nawiasów, przecinków i obcych znaków tylnych i podzielić się na linii nowej, aby uzyskać naszą tablicę. Zastosowanie tego do naszej przykładowej tablicy daje nam następujące możliwości:
Do 26 bajtów teraz.
Krok 2
Ale możemy jeszcze lepiej! Możemy użyć małej litery do rozgraniczenia ciągów zamiast nowej linii, która może zostać uwzględniona w kompresji.
z
nie jest używany w żadnym z naszych ciągów, więc wpuśćmy to i zobaczmy, jak sobie radzimy.Ach, orzechy - nie ma poprawy; nasza liczba bajtów wzrosła o jeden! Nie może być inna litera można użyć, ale w zależności od strun, nie może być sporo, aby spróbować - w naszym przykładzie jest 11:
b,c,d,f,j,k,q,v,x,y,z
. Wypróbowanie każdego z nich byłoby dość żmudne, i tu właśnie pojawia się to przydatne narzędzie ; podaj mu ciągi rozdzielone znakiem nowej linii, a on spróbuje rozgraniczać ciągi każdą literą, która nie jest zawarta w żadnej z nich, i wypisz:Przeprowadzenie przez nas naszych ciągów próbek pokazuje, że
b
daje najlepsze wyniki:I masz, mamy tylko 24 bajty.
Krok 3
Ale możemy zrobić jeszcze lepiej! Jeśli kolejność ciągów w tablicy nie ma znaczenia, być może istnieje inna permutacja w połączeniu z innym ogranicznikiem, który może działać jeszcze krócej. Jednak wypróbowanie każdej z tych możliwości będzie znacznie bardziej uciążliwe. Dzięki naszym 4 ciągom możesz wypróbować 24 różne kombinacje. Z każdą z 11 możliwych liter, które stają się 264! Właśnie wtedy to narzędzie wchodzi w grę. Ponownie podaj go jako ciągi rozdzielone znakiem nowej linii, a on wypróbuje każdą kombinację każdej permutacji i każdej litery ograniczającej, generując:
Running nasze przykładowe ciągi przez to pokazuje, że
"nougat","oreo","lollipop","marshmallow"
zeb
jako ogranicznik daje najlepsze rezultaty, z ostatecznym rozrachunku tylko 23 bajtów z:Dodatkowa wskazówka: Kompresja tablic liczb całkowitych
Możesz zastosować tę samą zasadę do tablic liczb całkowitych, najpierw konwertując każdą z nich na wyższą bazę. Korzystając z tej próbki, tablica 36 bajtów:
Możemy to zmniejszyć do 29 bajtów, najpierw konwertując go na tablicę podstawowych ciągów 32, a następnie uruchamiając przez pierwszy program do kompresji:
Lub zaledwie 27 bajtów za pomocą drugiego programu:
Możesz być w stanie zapisać jeszcze jeden bajt lub 2, przenosząc konwersję liczb całkowitych na metodę, którą już uruchomiłeś na tablicy.
Notatki
q<letter>(<space>)
kosztuje ponad·
. Chociaż możesz użyć jednego ze skrótów Unicode, aby odzyskać bajt, w zależności od ogranicznika (qÊ
jest taki sam, jakql<space>
na przykład).Kredyty
źródło
Kompresujące struny
Japt (obecnie) używa biblioteki shoco do kompresji ciągów. Możesz skompresować dowolny ciąg znaków
Oc
, o ile zawiera on ciąg małych liter:Daje to wynik
HÁM, WŽld!
(cóż,Ž
technicznie jest to drukowalny charakter). Możesz to zdekompresować, zawijając go w backticks:Przetestuj online!
Alternatywnie możesz użyć
Od
funkcji do dekompresji dowolnego ciągu. Nie jest to zwykle przydatne, ale ma swoje cele ...źródło
HÁM, WŽld!
czy też musiałby być umieszczony w backticksie? Zgaduję to drugie.Skracanie liczb za pomocą kodów char
W Japt możesz użyć
#
znaku, a następnie znaku, aby utworzyć kod znakowy. Jest to przydatne przy skracaniu dłuższych liczb.Jak wspomniano w @ETHproductions, działa to tylko w przypadku trzycyfrowych przebiegów w zakresie 100-255, chyba że zechcesz przejść na UTF-8.
Przykłady:
123
można skrócić do#{
101
można skrócić do#e
Możesz nawet połączyć je razem:
123101
można skrócić do#{#e
Możesz użyć
String.fromCharCode(123)
w JavaScript lub123d
Japt, aby znaleźć odpowiedni znak.String.fromCharCode(123)
zwroty{
źródło
String.fromCharCode()
jest jedną z tych (wielu!) nieprzyjemnie długich metod JS, które mogą zwiększyć liczbę bajtów. Przypuszczalnie byłyby to liczby całkowite? tzn. jeśli potrzebuję liczby całkowitej123
w rozwiązaniu, mogę użyć#{
do zapisania bajtu.-Q
flagę do okna wprowadzania, możesz lepiej wyświetlić typ wyniku: cudzysłowy wokół ciągów , tablic itp.String.fromCharCode(123)
działa w JavaScript, ale możesz to zrobić123d
w Japt, aby uzyskać ten sam wynik ;-) Ponadto działa to tylko na trzycyfrowe przebiegi w zakresie100
-255
(chyba że chcesz przejść na UTF-8)Szybka wskazówka: pusta tablica
[]
Japt ma stałą dla pustego tablicy:
A
. Ale aby uzyskać do niego dostęp, musisz przygotować średnik;
w swoim programie, aby użyć alternatywnych stałych Japt, w przeciwnym razieA
będzie10
. Stosując tak;A
faktycznie oferuje oszczędność na 0 bajt[]
, ale będzie zaoszczędzić bajtów jeśli trzeba przypisać tablicę do zmiennej (npA=[]
).Jeśli jednak (i tylko wtedy) twój program nie pobiera żadnych danych wejściowych, możesz uzyskać dostęp do pustej tablicy za pomocą tylko 1 bajtu, używając
N
zmiennej, która jest tablicą danych wejściowych - bez danych wejściowych byłby pusty. Wypróbuj tutaj .Ma to również tę dodatkową zaletę, że pozwala używać domyślnych stałych wartości w programie, a w niektórych przypadkach może nadal oszczędzać bajtów,
;A
nawet jeśli program pobiera dane dzięki skrótom dos1
is2
.źródło
N
, fajny pomysł.Ocena JavaScript
Japt pozwala na wykonanie surowego JavaScript poprzez owijanie go
$...$
.Na przykład,
$alert("hello world")$
Można to skrócić, korzystając z automatycznego zamykania
$
i)
.$alert("hello world")$
można skrócić do$alert("hello world"
Kompresowanie JavaScript
Możesz także skompresować JavaScript za pomocą
Ox
.Jeśli istnieje funkcja JavaScript, której chcesz użyć, powiedzmy
screen.width
, możesz skompresować ciąg"screen.width"
za pomocąOc
, a następnie wstawić wynik pomiędzy Ox` ... `Zwróć uwagę, że nie potrzebujesz zamykających cudzysłowów w Japt, jeśli nie następuje po nim nic innego.
źródło
Ox
do oceny ciągu. W przeciwnym razie po prostu wyślesz tekst"screen.width"
. PrzykładPoznaj flagi
Zgodnie z najnowszym meta konsensusem (grudzień 2017 r.) Flagi wiersza polecenia nie są już liczone do bajtów. To naprawdę świetna wiadomość dla Japt, ponieważ ma wiele flag dla dodatkowego leczenia na wejściu / wyjściu.
Wszystkie dostępne flagi w Japt są opisane poniżej, w kolejności oceny . Flagi w tej samej grupie są dla siebie wyłączne. Należy zauważyć, że flagi w różnych grupach może być stosowany w skojarzeniu, w wyniku czegoś podobnego to :)
mdefæ
Cały program jest odwzorowany na pierwszy argument (
U
).Jeśli obecnych jest więcej argumentów, są one przekazywane w stanie, w jakim się znajdują (tzn. Nie są mapowane parami). W przeciwnym razie drugim argumentem jest indeks, a trzecim - podobnie jak cała tablica
U.m
. JeśliU
jest liczbą, jest konwertowana na zakres; ciąg znaków jest konwertowany na tablicę znaków, a wyniki są łączone ze sobą.-m
: Stosuje powyższe i nic więcej.-d
: Zwraca,true
jeśli jakiś wynik jest prawdziwy, wfalse
przeciwnym razie.-e
: Zwraca,true
jeśli wszystkie wyniki są zgodne z prawdą, wfalse
przeciwnym razie.-f
: Zwraca tablicę elementów,U
których wyniki są zgodne z prawdą.-æ
: Stosuje-f
i zwraca swój pierwszy element.gh
Pobiera element o określonym indeksie.
-g
: Pobiera pierwszy element (indeks 0).-gX
: Pobiera element pod indeksemX
(może być dowolną liczbą całkowitą dodatnią).-h
: Pobiera ostatni element.!¡
Konwertuj wynik na wartość logiczną.
-!
: Zastosuj wartość logiczną nie.-¡
: Zastosuj wartość logiczną nie dwukrotnie (zwraca prawdziwość).N
Konwertuj wynik na liczbę. Używany jest unary plus.
PRSQ
Konwertuj na ciąg znaków.
-P
: Dołącz do tablicy za pomocą""
.-R
: Dołącz do tablicy za pomocą"\n"
.-S
: Dołącz do tablicy za pomocą" "
.-Q
: ZastosujJSON.stringify
(może być dowolnym obiektem, nie tylko tablicą). Przykład .x
Stosuje funkcję
x
do wyjścia. (Dosłowniex
nie jest to „żadna pojedyncza funkcja małych liter”).źródło
Skróty Unicode
Istnieje wiele struktur powszechne w Japt które po prostu nie mogą być przechowywane w jednym ASCII char, takie jak
qS
,p2
,mX{
,}
, itd. Tak więc, aby obejść ten problem, Japt ma „skrótów Unicode”, które są w zakresie znaków\xA1
-\xDE
(¡
-Þ
), które rozszerzają się na te wspólne struktury. Pełną ich listę znajdziesz w dokumentach tłumacza .Ponadto
@
oznaczaXYZ{
i_
oznaczaZ{Z
pomoc w budowaniu funkcji. Zagrajmy więc w nasz przykładowy program z innej odpowiedzi :Po pierwsze, możemy wymienić
X{X
się_
, co daje nam:Wtedy możemy wymienić
m_
z®
oszczędności kolejny bajt:Albo możemy wymienić
X{
z@
, co daje nam:To pozwala nam użyć
¡
skrótu do zapisania dwóch bajtów:Jedną z tych dwóch ścieżek można skrócić o 1 bajt więcej niż drugą. Czy możesz dowiedzieć się, który?
źródło
®c s16
za 6 bajtów - czy mogę wygrać ciasteczko ?!®c sG
bylocsG
.Skorzystaj z predefiniowanych zmiennych
Zmienne
A
-S
są wstępnie ustawione na wspólne wartości, które reprezentują więcej niż jeden bajt w Japt:A
-G
są10
-16
.H
jest32
,I
jest64
,J
jest-1
,L
jest100
.K
jest zdefiniowany jakonew Date()
, którym można manipulować na różne sposoby.M
iO
są obiektami o różnych przydatnych funkcjach. Możesz dowiedzieć się więcej w dokumentacji.P
jest pustym ciągiem,Q
jest znakiem cudzysłowu,R
jest znakiem nowej linii iS
jest spacją.T
jest ustawiony na0
, więc w razie potrzeby można go użyć jako akumulatora.Jeśli pierwszym znakiem w programie jest średnik
;
,A-L
są resetowane w następujący sposób:A
jest pustą tablicą[]
.B
jest"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
.C
jest"abcdefghijklmnopqrstuvwxyz"
.D
jest"QWERTYUIOP\nASDFGHJKL\nZXCVBNM"
.E
jest"[a-z]"
iF
jest"[A-Za-z]"
(przydatne przed dodaniem ich jako funkcji wyrażenia regularnego)G
is36
,H
is65
iI
is91
(przydatne dla zakresów alfabetu).J
jest pojedynczym przecinkiem;L
, pojedynczy okres.Obecnie tylko
A
,B
,C
, iD
z tej listy są naprawdę przydatne. Planuję dodać lepszy system, który pozwala na 256 zmiennych dwubajtowych, które zostaną ustawione na te wartości i wiele więcej.źródło
Użyj funkcji automatycznych
Najprawdopodobniej już to wiesz
@
i_
są to odpowiednio skróty do (XYZ{
iZ{Z
opisane w skrótach Unicode) odpowiedzi na ). Ale czasami możesz skrócić funkcje.Załóżmy, że masz tablicę znaków i chcesz zamapować każdy znak na jego kod znaków. Możesz to zrobić za pomocą jednego z poniższych:
Ale jest lepszy sposób. Jeśli metoda lub operator jest pierwszym elementem po innej metodzie lub a
(
, zostaje zamieniona na ciąg znaków. Te dwie linie są równoważne:Ale jak to pomaga w naszych funkcjach? Cóż, większość metod, które akceptują funkcje, jeśli otrzyma ciąg reprezentujący metodę lub operator, zinterpretuje to jako funkcję. Co oznacza, że możesz to również zrobić:
Nazywam te „funkcjami automatycznymi”. Istnieje kilka różnych odmian:
m@Xc}
→mc
m@Xc1}
→mc1
m@X+1}
→m+1
m@1+X}
→m!+1
m@2pX}
→m!p2
Mam nadzieję, że masz pomysł. Aby zamienić argumenty, po prostu prefiks metody lub operatora za pomocą
!
.źródło
m@2pXÃ
→m!p2<space>
→m!²
.Domniemane przypisanie zmiennej
Za każdym razem, gdy zaczynasz nową linię w Japt, wynik poprzedniej linii jest automatycznie przypisywany do jednej ze zmiennych wejściowych (
U
-Z
), przy czym pierwszą linią jestU
drugaV
, i tak dalej.Weźmy przykład: powiedzmy, że chcesz utworzyć 2 tablice do pracy, z których jedna zawiera liczby 1-10, a druga zawiera ich kwadraty. Dalsza droga do tego byłaby taka:
Jednak przy użyciu automatycznego przypisywania zmiennych można skrócić do:
Tam zapisaliśmy 4 bajty. Ale w tym przypadku możemy zapisać jeszcze jeden bajt, ponieważ tablica 1-10 jest przypisana
U
iU
może zostać pominięta w niektórych scenariuszach :Uwaga
Jedną z rzeczy, na które należy uważać, jest to, że nie zastępujesz żadnych zmiennych wejściowych, które mogą być później potrzebne w twoim programie. Można tego uniknąć, pozostawiając jedną lub więcej pustych linii na początku. W poniższym przykładzie 2 tablice zostaną przypisane do zmiennych
V
&W
zamiastU
&V
:źródło
Poznaj Javascript
Ponieważ każdy kod Japt działa jako transponowany JS, dobre zrozumienie operatorów JS i wbudowanych metod bardzo pomaga w golfie fragmentów kodu Japt.
Odpowiednie wskazówki JS
U
a następnie oceniaV.m
. (Posiadanie nowego wiersza aktywuje niejawne przypisanie doU
pierwszego wiersza).0
Nad'0
)Odpowiednie wbudowane funkcje JS
Przyjrzyj się dokładnie, jakie parametry są przekazywane do argumentów funkcji.
Array.prototype.map
Array.a/b/m/x/y/í
,Number.o/õ
,String.m/y/í
Array.prototype.reduce
Array.r/å
,String.å
; boå
czwarty argument nie został przekazany.Array.prototype.some
Array.d
Array.prototype.every
Array.e
W przypadku metod łańcuchowych dobrze jest wiedzieć, jak różnią się zachowania między przekazywaniem łańcucha lub wyrażenia regularnego z
g
flagą lub bez .String.prototype.match
String.f/o
String.prototype.search
String.â
String.prototype.replace
String.e/k/r
e/r
przekazywanie funkcji jako drugi argument jest w porządku, a zrozumienie parametrów funkcji jest bardzo zalecane.źródło
W razie potrzeby użyj wielu linii
W przypadku większości niezbyt trudnych wyzwań możesz wyrazić rozwiązanie w jednej linii Japt, jako sekwencję stosowania wbudowanych funkcji. Ale bardziej złożone będą wymagać użycia zapętlonych konstrukcji, rekurencji lub ponownego użycia dużych fragmentów kodu. Tutaj pojawia się programowanie wieloliniowe.
Usuń zamykające się pareny
Zadanie : mając tablicę liczb, sparuj każdy element z kwadratem indeksu i posortuj go według sumy.
[5,1,17,9,3] => [[5,0],[1,1],[17,4],[9,9],[3,16]] => [[1,1],[5,0],[9,9],[3,16],[17,4]]
Rozwiązanie jednoliniowe jest
íUm@Yp2})ñx
, ale})
kosztuje dwa bajty (i nie ma skrótu jednobajtowego). Możesz usunąć})
, po prostu przesuwając znak końcañx
do następnego wiersza, aby kod wyglądał następująco:a transponowana JS staje się:
Widać wyraźnie, że robi to to samo, co rozwiązanie jednowierszowe, po prostu przypisując wynik pośredni do
U
.Powtórz z niejawnymi argumentami
Funkcja rekurencji
ß
przyjmuje wszystkoUVWXYZ
jako domyślny parametr, jeśli nie został określony.U
jest oczywiście głównym wejściem, ale możesz użyć dowolnego z nich,VWXYZ
aby śledzić inne potrzebne wartości. Na przykład możesz wykonać następujące czynności:Alternatywnie, jeśli wszystko, czego potrzebujesz, to zmienna tymczasowa, możesz użyć przypisania wbudowanego, takiego
(T=...)
jak zmiennaT
(0) jest rzadko używana jako taka.Użyj ponownie długiej funkcji
W tym celu nie wydaje mi się, żebym mógł wymyślić dobre przykładowe zadanie, dlatego odwołam się do jedynego rozwiązania, w którym zastosowano tę wskazówkę , i przedstawię kilka ogólnych pomysłów.
{
,@
lub_
spełnia swoje zadanie. Możesz też zrobić coś takiego, jak(T=@...})
osadzić przypisanie funkcji w bardziej złożonym wierszu.V
jest funkcją i chcemy wywołaćV(U)
JS.VU
nie działa, ponieważ po prostu oznaczaV,U
.V(U
też nie; to jestV,(U)
. Nawet metody funkcyjne nie są zbyt pomocne. Najlepszym sposobem, jaki znaleźliśmy, jest:[U]xV
(mapa i suma), jeśli wynikiem jest liczbaUmV
ifU
jest pojedynczym znakiem iV
zwraca ciąg znaków, lub$V($U
lub[U]mV g
ogólnie.UmV
. Aby znaleźć pierwszą liczbę całkowitą, która spełniaV
, użyjVa
.źródło
Zabawa z automatycznymi funkcjami
Jako kontynuacja ogólnej wskazówki ETH na temat funkcji automatycznych , ta wskazówka przedstawi kilka konkretnych przykładów sztuczek oszczędzania bajtów, które możesz z nimi osiągnąć, do których dodam, gdy będę myśleć o więcej.
Uzyskaj największą liczbę całkowitą w tablicy.
Załóżmy, że mamy tablicę
[3,1,4,2]
przypisaną do zmiennejU
i chcemy pobrać z niej największą liczbę. Możemy to zrobić w 4 bajtach, sortując tablicę, a następnie wstawiając ostatni element:Minusem jest to, że zmodyfikowaliśmy oryginalną tablicę;
U
jest teraz,[1,2,3]
co nie zawsze może być pożądane. Na szczęście istnieje sposób, aby to zrobić bez modyfikowania tablicy, która jest także o jeden bajt krótsza:To, co tam zrobiliśmy, zmniejsza tablicę za pomocą
w
metody, która, gdy zostanie użyta na liczbie całkowitej, zwraca większą liczbę całkowitą i argument metody (np.2w5
Zwraca5
). Więc powyższe jest odpowiednikiemUrÈwY
lubUrXY{XwY}
. Pamiętaj jednak, że ta wskazówka nie zadziała w przypadku wszystkich liczby całkowite w tablicy będą ujemne.źródło
Gdy nie należy używać
í
í
jest użytecznym wbudowanym parami (lubzip
tablic lub ciągów i opcjonalnie mapuje każdą parę za pomocą funkcji. Jednak obecnie ma kilka drobnych problemów, gdy podano nierówne tablice lub ciągi:undefined
.Może to utrudnić, powiedzmy, porównanie dwóch nierównych ciągów i pobranie znaku z wyższym punktem kodowym z każdej pary. Nawet jeśli wiesz, że
U
to będzie dłuższe, nadal zajmuje wiele bajtów, aby rozwiązać to proste zadanie:Zamiast tego możesz wziąć dane wejściowe jako tablicę dwóch ciągów, transponować tablicę za pomocą
y
, a następnie zamapować każdy wiersz na poprawny wynik:Ma to tę zaletę, że zawsze wypełnia krótsze sznurki spacjami, dzięki czemu bułka z masłem przechodzi przez całe oba sznurki.
Przykłady z życia: 1 , 2
źródło
Wygeneruj zakres ASCII
Chociaż Japt nie ma (jeszcze) wbudowanego zakresu ASCII, możesz wygenerować tablicę znaków w zaledwie 5 bajtach:
Spróbuj
Jak to działa
95o
tworzy zakres[0,95)
z każdym elementem przechodzącym przez funkcję automatyczną,d
która, gdy zostanie użyta na liczbie, zwraca znak w tym punkcie kodowym. Przekaż liczbę jako argument dod
W tym przypadku metodyH
stałą Japt dla 32, a zostanie ona dodana do pierwotnej liczby przed konwersją.Równoważnym rozwiązaniem w JavaScript byłoby:
Losowe postacie
Aby uzyskać losowy znak z zakresu ASCII, użyj
ö
zamiast niego, który zwraca losową liczbę z zakresu[0,X)
, gdzieX
jest liczbą, na którą jest uruchamiany.Lub, aby uzyskać tablicę wielu losowych znaków, podaj liczbę znaków, których potrzebujesz, jako argument
ö
. Poniższe zwróci 10 znaków:źródło
Usuń niepotrzebne znaki strukturalne
Przez znaki strukturalnych, to znaczy
{}
,()
,$
, nawet"
a`
. Zazwyczaj możesz usunąć te znaki za każdym razem, gdy wystąpią one bezpośrednio na końcu programu (npUmX{Xc +"; "} -> UmX{Xc +";
.).Dodatkowo możesz usuwać pareny lub spacje, ilekroć pojawiają się w następujących miejscach:
;
(lub końcowi programu);{
(i przez rozszerzenie@
) lub[
, lub na lewo od]
lub}
.Również przecinki są bardzo rzadko potrzebne do oddzielenia argumentów. Jeśli piszesz
AB
na przykład Japt wie pan myśliA
iB
oddzielnie. Naprawdę potrzebujesz przecinka, aby oddzielić dwa literały liczbowe, takie jakUs2,5
.Wreszcie, jeśli nie jest to
U
na początku programu lub po{
lub;
, a następnie wywołanie metody (mała litera lub związanych skrótów Unicode) lub dowolnego operatora binarnego bez+
i-
(*
,&
,==
, itd.), Można usunąćU
, aby zaoszczędzić byte i Japt wstawią go za ciebie.źródło
U
można je pominąć, nawet jeśli nie ma go na początku programu.{
lub;
. Czy znasz jeszcze jakieś osoby? (Minęło trochę czasu, odkąd kodowałem tę funkcję: P)Zmodyfikuj ostatni element w tablicy
Czasami może być konieczne zmodyfikowanie ostatniego elementu w tablicy, więc oto wyjaśnienie krótkiego sposobu na zrobienie tego. Będziemy pracować z tablicą
[2,4,8,32]
przypisaną do zmiennej wejściowejU
i dzieląc ostatnią liczbę całkowitą (32
) przez 2.Oczywistym sposobem na osiągnięcie tego byłoby zastosowanie tego 9-bajtowego rozwiązania ( Demo ):
hnx
ustawia element o indeksien
dox
.gn
zwraca element o indeksien
.J
jest stałą Japt dla-1
, która dzięki wsparciu Japt dla indeksu ujemnego pozwala nam pracować z ostatnim elementem w tablicy; przydatne, gdy nie znasz rozmiaru tablicy./2
jest po prostu podzieleniem przez 2.Więc powyższych zestawów element z indeksem
-1
w tablicy do elementu o indeksie-1
w tablicy podzielonej przez 2. Albo w javascript:U[3]=U[3]/2
. Kiedy piszesz to w ten sposób, wydaje się, że jest to zbyt długa droga. Na szczęście jest krótsza droga; moglibyśmy usunąć ostatni element z tablicy, zmodyfikować go i zepchnąć z powrotem do tablicy. Wykonanie każdej z tych operacji osobno zajęłoby więcej niż 9 bajtów, ale możemy wykonać je wszystkie jednocześnie za zaledwie 7 bajtów, co oznacza oszczędność 2 bajtów ( Demo )Przetłumaczone na JS, jest to odpowiednik:
źródło