Wiele języków programowania jest pisanych przy użyciu wyłącznie ASCII, zakładek i znaków nowej linii do wydruku. Te 97 znaków jest następnie zapisywanych w 8-bitowych bajtach (które są w stanie pomieścić 256 różnych znaków!), Co jest po prostu strasznie nieefektywne - szczególnie w grze w golfa, gdzie liczy się każdy bajt! W tym wyzwaniu będziesz w stanie obniżyć swój wynik za pomocą konwersji podstawowej.
Wyzwanie
Twój program / funkcja pobiera ciąg znaków lub tablicę znaków jako dane wejściowe, które następnie interpretuje jako liczbę podstawową 97 . Następnie konwertuje to na liczbę podstawową 256 i zlicza liczbę symboli (tj. Bajtów) niezbędnych do przedstawienia tej liczby. Liczba ta będzie wartością wyjściową / zwracaną przez twój program / funkcję.
Prosty przykład z użyciem base-2 i base-10 (binarny i dziesiętny): jeśli wejście jest 10110
, wyjście będzie 2, ponieważ 10110 2 = 22 10 (dwie cyfry potrzebne do przedstawienia wyjścia). Podobnie 1101 2 staje się 13 10 , co daje również wynik 2, a 110 2 staje się 6 10 , więc wtedy wynik wyniósłby 1.
Ciąg wejściowy może zawierać wszystkie 95 znaków ASCII do wydrukowania, a także \n
tabulację nowego wiersza i literału \t
, która tworzy alfabet źródłowy 97 symboli dla konwersji podstawowej. Dokładna alfabet będzie zatem (zastępując \t
oraz \n
z rzeczywistego karcie dosłownym i nowa linia; uwaga dosłowne następujące miejsca w nowej linii) :
\t\n !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
Zauważ, że kolejność tego alfabetu jest ważna: na przykład base-97 \t
odpowiada dziesiętnej 0
i !
dziesiętnej 3
.
Niektóre przypadki testowe: (nie musisz obsługiwać pustego ciągu)
Input Output
'[email protected]' 15
'All your base are belong to us!' 26
' abcd' 9
'~ abcd' 10
'ABCDEFGHIJK' 9
'zyxwvutsrpq' 10
'{".~"}.~' 7
'\t\t\t\t\t\t\t\t' 1 (with \t a literal tab; the result is 0, which can be represented with 1 byte)
'!\t\t\t\t\t\t\t\t' 7 (with \t a literal tab)
Punktacja
Jeśli twój wpis używa tylko ASCII do wydruku, nowej linii i / lub tab: Wynik twojego programu będzie wyjściem twojego programu, jeśli podasz własny kod źródłowy jako dane wejściowe.
Jeśli twój wpis używa znaków, które nie są drukowalne ASCII, nowej linii lub tabulacji: Wynik twojego programu to po prostu liczba bajtów, jak w golfie kodowym .
źródło
Odpowiedzi:
Python 2 , wynik
737271Edycja: -1 dzięki @Jonathan Allan
Wypróbuj online!
źródło
/
myślę, że tylko jedna powinna być OKor 1
|1
w tym przypadku może zostać zastąpione przezJapt , wynik 19 (23 bajtów)
Przetestuj online!
Zbiegiem okoliczności, nie sądzę, że można w nią grać w golfa nawet przy znakach spoza ASCII ...
Wyjaśnienie
źródło
Galaretka ,
1817 bajtów - wynik1817-1 bajt dzięki Erik the Outgolfer (nie ma potrzeby listy list do tłumaczenia)
Wypróbuj online!
W jaki sposób?
- Najlepsze, co mam tylko z ASCII, to wynik 29 :
- jest to również wyjątkowo nieefektywne. Tłumaczy porządki jak wyżej, ale konwersję z bazy 97 uzyskuje się przez powtórzenie wartości i sumowanie, zamiast bezpośredniego mnożenia - to znaczy do konwersji
{".~"}.~
, dostaje skorygowane indeksy,[93,4,16,96,4,95,16,96]
następnie odwraca (U
) i powtarza je, aby wykonać,[[96,96,..., 97⁷ times ...,96],[16,16,... 97⁶ times ...16],[95,95,... 97⁵ times ...95],[4,4,... 97⁴ times ...4],[96,96,... 97³ times ...96],,[16,16,... 97² times ...,16],[4,4,... 97 times ...4],[93]]
a następnie sumuje, konwertuje na bazę 256 i pobiera długość (jeśli nie zabrakło jej pamięci: p).źródło
J , 36 bajtów, wynik = 30
Wypróbuj online!
J używa tylko 7-bitowych znaków ASCII w swoich operacjach podstawowych.
Wyjaśnienie
źródło
Gaia , 14 bajtów, wynik 14
Wypróbuj online!
Wyjaśnienie
Tylko ASCII
To najlepsze, co mogłem wymyślić używając tylko ASCII, dając wynik 19:
Trudność polega na konwersji danych wejściowych. Jedynym rozsądnym sposobem konwersji z systemu base-97 jest użycie
B
, ponieważ mapowanie wymaga kodu innego niż ASCII¦
. Ponadto, obecnie nie ma sposobu na stworzenie zasięgu postaci bez mapowaniac
na zakres liczbowy, który ma ten sam problem. Najlepszym rozwiązaniem, jakie mogłem zobaczyć, było skonstruowanie łańcucha₵R
i sprawdzenie go.źródło
₵R
i₵r
nie są łatwe do zastąpienia, choć₸
oczywiście jest), ale może być interesujące zobaczyć, jak to się porównuje.₵
jest to kod 8373 i nie mogę również wykonywać zakresów znaków tylko w ASCII, co jest nieco frustrujące, ponieważ większość tego programu to ASCII.c
ale zastosowane do każdej postaci,$
pokazuje tylko wszystkie liczby)c
listę, która byłabyc¦
₵r
jest łatwa do wymiany, ponieważ mógłbym po prostu użyć256
zamiast tego, użyłem tego tylko, ponieważ jest o 1 bajt krótszy, a program i tak nie był tylko ASCII.Python 2 , ocena 60
Wypróbuj online!
Mapowanie do base-97
Wartość znaku jest uzyskiwana przez
ord(c)-[30,9][c<' ']
: jego kod ASCII, minus 9 dla tabulatorów i znaków nowej linii (które poprzedzają' '
leksykograficznie) lub minus 30 dla wszystkiego innego.Konwersja na liczbę
Używamy
reduce
do konwersji ciągu na liczbę. Jest to równoważne z przetwarzaniemPodstawa obliczeniowa-256 długości
Zwracana wartość
bin
to ciąg znaków, który wygląda mniej więcej tak:Nazwij jego długość
L
. Wartość zn
-bitową reprezentacją binarną ma reprezentacjęceil(n/8)
-bit base-256. Możemy obliczyćn
jakoL-2
; równieżceil(n/8)
można zapisać jakofloor((n+7)/8)
=n+7>>3
, więc naszą odpowiedzią jestL-2+7>>3
=L+5>>3
.Przypadek, w którym łańcuch wejściowy ma wartość 0, jest obsługiwany poprawnie, ponieważ
bin
zwraca"0b0"
, więc zwracamy3+5>>3
= 1.źródło
c>=' '
bo inaczej odwzorujesz przestrzeń na 23 zamiast 2. W zwykłym kodzie golfowymc>'\x1f'
(surowy bajt) pomógłby mi, ale to nie jest drukowalne ASCII…APL, wynik 24 (bajtów *)
Zakłada wartość domyślną
⎕IO←1
, w przeciwnym razie wystarczy zmienić ¯31 na ¯30.Wyjaśnienie:
Przykłady:
________________
*: APL można zapisać we własnym starszym
⎕AV
zestawie znaków (zdefiniowanym przez ) zamiast w Unicode; dlatego program APL, który używa tylko znaków ASCII i symboli APL, może zostać oceniony jako 1 znak = 1 bajt.źródło
⎕AV
(przynajmniej dla Dyalog), takie jak⍸
. Wszystkie twoje symbole liczą się jednak jako jeden bajt. Tak więc nie każdy symbol APL = 1 bajt, jak podano w przypisie. (Pomyślałem, że dam ci znać.) Z którego dialektu APL korzystasz?Perl 5 , 76 + 1 (-F) = 77 bajtów
Wypróbuj online!
W jaki sposób?
Niejawnie oddziel znaki wejściowe (
-F
), przechowując je w @F. Zamknij niejawnąwhile
pętlę i uruchom nowy blok (}{
) ( Dzięki, @Dom Hastings! ). Dla każdej postaci pomnóż jej wartość przez 97 do odpowiedniej mocy. Oblicz liczbę znaków, znajdując wielkość sumy w podstawie 256, używając logarytmów.źródło
Galaretka , wynik: 18 (bajtów)
Wypróbuj online!
źródło
Rubinowy , 70 bajtów, wynik 58
Wypróbuj online!
źródło
MATL (19 bajtów), wynik 16
Znaki niedrukowalne (tab, znak nowej linii) w ciągu wejściowym wprowadza się, łącząc ich kody ASCII (
9
,10
) z resztą ciągu.Część początkowa
9=?1}G
jest konieczna tylko z powodu błędu w funkcjiZa
(konwersji podstawowej), który powoduje, że kończy się ona niepowodzeniem, gdy dane wejściowe składają się tylko z „zer” (tabulatory tutaj). Zostanie to naprawione w następnej wersji języka.Wyjaśnienie
źródło
Befunge-93,
8379 bajtów, wynik7465Wypróbuj tutaj!
Program najpierw konwertuje dane wejściowe na liczbę base-97, a następnie liczy, ile cyfr jest wymaganych dla liczby base-256. W związku z tym liczba podstawowa 97 jest ogromna, tak duża, że TIO wyświetli maksymalną wartość 8 dla dużych wartości; jednak interpreter JS nie dba o to i wyświetli poprawną wartość.
źródło