Wypisz piosenkę alfabetu „arâþ crîþ” bez użycia (m) żadnych liter


12

Twoim celem jest napisanie programu, który nie pobiera danych wejściowych i wyświetla następujący tekst:

ca e na ŋa va o sa;
þa ša ra la ła.
ma a pa fa ga ta ča;
în ja i da ða.
ar ħo ên ôn ân uħo;
carþ taŋ neŋ es nem.
elo cenvos.

Ale jest pewien haczyk: za każdą literę (każdą postać, której ogólna kategoria w Unicode zaczyna się L) w twoim źródle, otrzymasz karę w wysokości 20 znaków! (Dla odniesienia tekst do wydrukowania ma 81 liter.)

Poniższy kod Perl 6 ma 145 bajtów i 84 liter, więc otrzymuje wynik 1845:

say "ca e na ŋa va o sa;
þa ša ra la ła.
ma a pa fa ga ta ča;
în ja i da ða.
ar ħo ên ôn ân uħo;
carþ taŋ neŋ es nem.
elo cenvos."

Poniższy kod ma 152 bajty i 70 liter, więc uzyskuje wynik 1552:

$_="C e N ŋa V o S;
Þ Š R L Ł.
M a P F G T Č;
în J i D Ð.
ar ħo ên ôn ân uħo;
Crþ Tŋ neŋ es nem.
elo cenvos.";s:g/<:Lu>/{$/.lc~'a'}/;.say

Standardowe luki są zabronione.

Początkowo myślałem o całkowitym zakazaniu liter, ale nie sądzę, że istnieje wiele języków, które to umożliwiają. Zapraszamy do spróbowania.

(ŋarâþ crîþ [ˈŋaɹa̰θ kɹḭθ] jest jednym z moich współzależności. Chciałem tu wpisać wielką nazwę, ale dostaję tu brzydki duży eng. No cóż, język i tak nie używa wielkich liter w romanizacji.)

Edycja: zdałem sobie sprawę, że jedna z linii jest błędna, ale zachowam ją, ponieważ są już odpowiedzi. Prawidłowa wersja trzeciego wiersza to ma a fa ga pa ta ča; według własnego wyboru możesz zamiast tego utworzyć poprawiony tekst.


11
złożoność kolmogorowa , ograniczone źródło i specjalna punktacja to różnego rodzaju rzeczy, które czerpią wiele korzyści z dokładnego rozważenia w piaskownicy. Obecnie wydaje się, że najlepszym podejściem do tego wyzwania byłoby po prostu zapisanie wszystkich współrzędnych kodowych dziesiętnie, a następnie przekształcenie ich w tekst za pomocą wbudowanego skrótu do kodowania wszystkich znaków as - lub nie, w zależności od liczby potrzebowałaby liter, ponieważ 20 znaków to naprawdę duża kara (chociaż gdy wszystko inne jest oceniane według bajtów, nie jest to całkiem dobrze zdefiniowane ...)!
Niepowiązany ciąg

4
Biorąc pod uwagę wywołanie Unicode, prawdopodobnie potrzebne są pewne wyraźne reguły rządzące specjalnymi stronami kodowymi stosowanymi przez większość golflangów (wraz z linkami do skryptu w celu potwierdzenia punktacji).
Niepowiązany ciąg

Odpowiedzi:


21

7 , 410 znaków, 154 bajty w kodowaniu 7, 0 liter = wynik 154

55104010504200144434451510201304004220120504005434473340353241135014335450302052254241052253052244241052335452241114014241310052340435303052335442302052335500302052335430302052313340435303135014243241310335514052312241341351052302245341351525755102440304030434030421030442030424030455733413512410523142410523030523112411350143355142410523414252410523102410523002410523413342411145257551220304010420030455741403

Wypróbuj online!

W wyzwaniu, które nie lubi używania liter, jaki jest lepszy język niż ten składający się wyłącznie z cyfr?

Jest to pełny program, który kończy się przez awarię, więc istnieje dodatkowe wyjście dla stderr, ale standardowe wyjście jest prawidłowe.

Wyjaśnienie

Program 7 podczas pierwszej iteracji po prostu wypycha na stos pewną liczbę elementów (ponieważ spośród 12 poleceń istniejących w 7 tylko 8 z nich może być reprezentowanych w programie źródłowym, a te 8 specjalizują się w pisaniu kodu wypychanie określonych struktur danych na stos). Ten program nie używa 6polecenia (który jest najprostszym sposobem tworzenia zagnieżdżonych struktur, ale w przeciwnym razie nie pojawia się dosłownie w programie źródłowym), więc to tylko 7polecenia określają strukturę; 7wypycha nowy pusty element na szczyt stosu (podczas gdy polecenia 05po prostu dołączają się na szczyt stosu). Możemy zatem dodać do programu białe znaki, aby pokazać jego strukturę:

551040105042001444344515102013040042201205040054344 7

33403532411350143354503020522542410522530522442410523354522411140142413100523
40435303052335442302052335500302052335430302052313340435303135014243241310335
514052312241341351052302245341351525 7

55102440304030434030421030442030424030455 7

33413512410523142410523030523112411350143355142410523414252410523102410523002
41052341334241114525 7

551220304010420030455 7

41403

Elementy pod koniec programu są wypychane na końcu, więc znajdują się na szczycie stosu na początku drugiej iteracji. Podczas tej iteracji i wszystkich przyszłych iteracji 7 interpreter automatycznie tworzy kopię wierzchu stosu i interpretuje ją jako program. Literał 41403popycha (nie-literalny, aktywny kod) 47463(7 ma 12 poleceń, ale tylko 8 z nich ma nazwy; jako takie używam pogrubienia, aby pokazać kod, i niepogrubionego, aby pokazać literał, który generuje ten kod, co oznacza że np. 4jest to polecenie dołączane 4do elementu najwyższego stosu). Tak więc programem działającym przy drugiej iteracji jest 47463. Oto, co to robi:

47463 
4        Zamień dwa górne elementy stosu, dodaj pusty element między
  7       Dodaj pusty element stosu na górę stosu
   4      Zamień dwa górne elementy stosu, dodaj pusty element między
    6     Sprawdź, które polecenia wygenerują górny element stosu;
        dodaj to do elementu poniżej (i pop starą górę stosu)
    3    Wyjmij górny element stosu, pop element poniżej

Łatwiej to zrozumieć, jeśli spojrzymy na to, co stanie się ze stosem:

  • ... d c b a 47463 (kod uruchomić: 47463)
  • ... d c b opróżnić z (kod biegu: )47463 7463
  • ... d c b opróżnić z pustą (kod uruchomić: )47463 463
  • ... d c b pustej pustej pustej A (kod uruchomić: )47463 63
  • ... d c b pustej pusty " w " (kod uruchomić: )47463 3
  • D c b pusty (kod do uruchomienia: pusty )47463

Innymi słowy, bierzemy górę stosu a , sprawdzamy, jaki kod najprawdopodobniej go wytworzył i wypisujemy ten kod. Interpreter 7 automatycznie wyrzuca puste elementy ze szczytu stosu na końcu iteracji, więc kończymy z 47463powrotem na stosie, tak jak w oryginalnym programie. Powinno być łatwo zobaczyć, co będzie dalej: w końcu przeglądamy każdy element stosu jeden po drugim, wypisując je wszystkie, aż stos się przepełni i program się nie zawiesi. Zasadniczo stworzyliśmy prostą pętlę wyjściową, która sprawdza kod źródłowy programu w celu ustalenia, co należy wydrukować (nie wysyłamy struktur danych, które zostały wypchnięte na stos przez 05polecenia, zamiast tego odtwarzamy, które polecenia zostały użyte, sprawdzając, jakie struktury zostały utworzone i wysyłamy je). Tak więc, pierwszy fragment danych wyjściowych to 551220304010420030455(kod źródłowy, który generuje element stosu drugi od góry), drugi to 3341351…114525(kod źródłowy, który generuje element stosu trzeci od góry) i tak dalej.

Oczywiście te fragmenty kodu źródłowego nie są generowane w postaci niezakodowanej. 7 zawiera kilka różnych języków specyficznych dla domeny do kodowania danych wyjściowych; po wybraniu języka specyficznego dla domeny pozostaje on w użyciu aż do jawnego wyczyszczenia, ale jeśli żaden z języków nie został jeszcze wybrany, pierwsza cyfra wyprowadzanego kodu określa, którego języka należy użyć. W tym programie używane są tylko dwa języki: 551i 3.

551jest dość proste: jest to w zasadzie stary kod Baudot / teletype używany do przesyłania liter za pomocą teletypów, jako 5-bitowy zestaw znaków, ale zmodyfikowany tak, aby wszystkie litery były małe. Tak więc pierwsza część kodu, który ma zostać wydrukowany, dekoduje w następujący sposób:

551  22 03 04 01 04 20 03 04  55
     c  a  SP e  SP n  a  SP  reset output format

Jak widać, dopasowujemy każdy znak do dwóch cyfr ósemkowych, co jest dość przyzwoitym stopniem kompresji. Pary cyfr z zakresu 0-5 dają nam 36 możliwości, w przeciwieństwie do 32 możliwości, których potrzebuje Baudot, więc pozostałe cztery są używane do specjalnych poleceń; w tym przypadku 55na końcu usuwa zapamiętany format wyjściowy, co pozwala nam użyć innego formatu dla następnego produkowanego przez nas fragmentu.

3jest koncepcyjnie jeszcze prostszy, ale z pewnym zwrotem. Podstawową ideą jest pobranie grup trzech cyfr (ponownie w zakresie 0-5, ponieważ są to cyfry, dla których możemy zagwarantować, że możemy odtworzyć oryginalny kod źródłowy z jego wyniku), interpretować je jako trzycyfrowe liczba w bazie 6 i po prostu wyślij go jako bajt w formacie binarnym (pozwalając w ten sposób wypisać znaki wielobajtowe w żądanym wyniku po prostu przez wyprowadzenie wielu bajtów). Skręt wynika jednak z faktu, że w bazie 6 jest tylko 216 liczb trzycyfrowych (z możliwymi zerami wiodącymi), ale 256 możliwych bajtów. 7 omija to, łącząc liczby od 332₆ = 128₁₀ w górę do dwóch różnych bajtów; 332może wyprowadzać bajt 128 lub 192, 333bajt 129 lub 193, i tak dalej, aż do 515bajtów 191 lub 255.

Skąd program wie, która z dwóch możliwości wyjścia? Możliwe jest użycie trojaczków cyfr od 520góry, aby to wyraźnie kontrolować, ale w tym programie nie musimy: domyślnie 7 wybiera wszystkie niejednoznaczne bajty w taki sposób, że wyjście jest poprawne UTF-8! Okazuje się, że zawsze jest co najwyżej jeden sposób, aby to zrobić, tak długo, jak chcemy UTF-8 (i robimy w tym przypadku), możemy po prostu pozostawić to dwuznaczne, a program i tak działa.

Koniec każdej z 3…sekcji to 525, która resetuje format wyjściowy, pozwalając wrócić do 551następnej sekcji.


Jest to albo 410 bajtów + 0 liter w rozpakowanej reprezentacji, albo 154 bajty + wiele liter w spakowanej reprezentacji. Liczenie bajtów w jednym i liter w drugim wydaje się oszukiwane.
Grimmy,

1
@Grimy: Mylisz bajty ze znakami. Spakowana reprezentacja składa się z 154 bajtów w kodowaniu 7, które kodują 410 cyfr ósemkowych, z których każda jest cyfrą, a nie literą. Twoje rozumowanie sugeruje, że powiedzmy, że ɓw Jelly nie jest literą (ponieważ jego kodowanie w kodowaniu Jelly odpowiada kodowi sterującemu „CSI”, jeśli jest interpretowane jako typowy 8-bitowy zestaw znaków, a nie litera). Podobnie jak Jelly, 7 używa również niestandardowego kodowania; ale ponieważ 7 nie używa liter, kodowanie nie musi kodować liter i dlatego nie może.
ais523

10

Haskell, 0 liter, 423 bajty = wynik 423

(['\10'..]!!)<$>[89,87,22,91,22,100,87,22,321,87,22,108,87,22,101,22,105,87,49,0,244,87,22,343,87,22,104,87,22,98,87,22,312,87,36,0,99,87,22,87,22,102,87,22,92,87,22,93,87,22,106,87,22,259,87,49,0,228,100,22,96,87,22,95,22,90,87,22,230,87,36,0,87,104,22,285,101,22,224,100,22,234,100,22,216,100,22,107,285,101,49,0,89,87,104,244,22,106,87,321,22,100,91,321,22,91,105,22,100,91,99,36,0,91,98,101,22,89,91,100,108,101,105,36]

Wypróbuj online!


6

Galaretka ,  274 260  212 bajtów + 2 litery =  314 300  252

-48 bajtów dzięki Nickowi Kennedy'emu

“19ב+49;7883,8220,8216,7884Ọ“19937801,1169680277365253“38“68112“;107¤+1+\“@“&%"("/%"@%"6%"0"3%$!<%" %"2%"-%"?%#!.%"%"1%")%"*%"4%"=%$!9/",%"+"'%":%#!%2">0"8/";/"7/"5>0$!&%2<"4%@"/(@"(3"/(.#!(-0"&(/603#“_32¤”;";/V

(Używa !"#$%&'()*+,-./0123456789:;<=>?@V\_¤×Ọ‘“”których Vi są litery Unicode i są stosowane raz każdy)

Wypróbuj online!




@NickKennedy Grałem w golfa, ale nie cofnąłem się i nie szukałem po prostu wyrównania porządków, dobre rzeczy - dzięki!
Jonathan Allan,

3

PowerShell , strzelił 601 546

-join(67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,78,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14|%{[char]($_+32)})

Wypróbuj online!

Podejście naiwne; Właśnie wziąłem punkty kodu i przekonwertowałem je na dziesiętne, odejmowałem 32, a następnie ten kod traktuje je jako charprzed -joinscaleniem go z powrotem w pojedynczy ciąg.




3

Galaretka , 321 bajtów + 2 litery = wynik 361

3343781777797791350694255572961968519437585132057650209974147122192542459108221624793330048943528237823681411832154316740173721249435700067706302064570847610741421342406380917446310820012503592770000532190167243585300911078873144513786923305473352724133578818457026824110152529235136461572588027747840738399150398304b354Ọ

Wypróbuj online!

To jest ohydne i ktoś może zdecydowanie lepiej.

Sprawdź wynik .


1
właściwie mniej zły niż się wydaje
tylko ASCII

2

Python 3 , 380 bajtów + 5 liter = 480

print("""\143\141 \145 \156\141 \513\141 \166\141 \157 \163\141;
\376\141 \541\141 \162\141 \154\141 \502\141.
\155\141 \141 \160\141 \146\141 \147\141 \164\141 \415\141;
\356\156 \152\141 \151 \144\141 \360\141.
\141\162 \447\157 \352\156 \364\156 \342\156 \165\447\157;
\143\141\162\376 \164\141\513 \156\145\513 \145\163 \156\145\155.
\145\154\157 \143\145\156\166\157\163.""")

Wypróbuj online!


1

Siatkówka , 140 znaków, 159 bajtów, 14 liter = wynik 439


%# ' 1# !# 9# 2 6#;¶þ# š# 5# /# ł#.¶0# # 3# (# )# 7# č#;¶î1 ,# + &# ð#.¶#5 ħ2 ê1 ô1 â1 8ħ2;¶%#5þ 7#! 1'! '6 1'0.¶'/2 %'1926.
T`!--/-9`ŋ\`-{

Wypróbuj online! Edycja: Zapisano 1 literę, przechodząc z K`do nowej linii. Teraz działa również w Retina 0.8.2 (ale tytuł byłby za długi).


1

Japt -S , 304 286 bajtów + 2 1 litera s = 344 306

Cóż, to po prostu okropne!

"3 1
5
14 1
235 1
22 1
15
19 1 -37 -86 158 1
257 1
18 1
12 1
226 1 -50 -86 13 1
1
16 1
6 1
7 1
20 1
173 1 -37 -86 142 14
10 1
9
4 1
144 1 -50 -86 1 18
199 15
138 14
148 14
130 14
21 199 15 -37 -86 3 1 18 158
20 1 235
14 5 235
5 19
14 5 13 -50 -86 5 12 15
3 5 14 22 15 19 -50"·®¸®°d96} ¬

Spróbuj


1

PHP -a, 402 bajty + 200 punktów karnych = 602 punktów

foreach([67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,8,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14] as $i){echo ''.mb_chr($i+32);}

Odpowiedź Portu Artermis Fowl i mój pierwszy wpis w codegolf!

Pozostawia mi życzenia, które chr()mogłyby obsługiwać UTF-8; te dodatkowe 3 bajty + 40 znaków boli!


Witamy w PPCG :)
Shaggy

1

05AB1E , wynik 209 (189 bajtów + 20 kar za 1 literę)

•£?;\:'%¢;.'¡£/':¢?'¢°':¢°#@¢«>#%¡¤;®[¢:¥¢:©¢:¦¢;®¢>#¡£#¨¢#&¢+¢#,¢:§¡¤#¬¢#@¢#)¢#(¢#<¢#¢#/¡£#¯¢#.¢#>¢#±¢#«¡¤#?¢;¢#\¢#°¢#:¢'¢#%•[₅‰`©®_#∞158+902201401301670804020409010150250102709022¾¡.¥>:ç?

Wypróbuj online!

Jedyny list to ç. Symbole walut €£¢nie są traktowane jako litery w Unicode.


0

Python 3 , 397 bajtów + 19 liter = 777 punktów

print(''.join(chr(i+32)for i in[67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,78,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14]))

Wypróbuj online!

Odpowiedź portu AdmBorkBork .




562 , -2, jeśli używasz Pythona 2
tylko ASCII

TIO nie działa w mojej organizacji, więc będę musiał czekać, aż wrócę do domu, aby je dodać.
Artemis wciąż nie ufa SE

0

R , 384 bajty + 12 liter * 20 punktów = 684 punktów

Niezbyt oryginalnie.

cat(intToUtf8(c(67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,78,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14)+32))

Wypróbuj online!


0

05AB1E , wynik 383 365 (325 bajtów + 2 litery * 20 punktów karnych)

3343781777797791350694255572961968519437585132057650209974147122192542459108221624793330048943528237823681411832154316740173721249435700067706302064570847610741421342406380917446310820012503592770000532190167243585300911078873144513786923305473352724133578818457026824110152529235136461572588027747840738399150398304 354вç.««

Port odpowiedzi galaretki @HyperNeutrino .

Spróbuję ulepszyć tutaj. Liczba jest podzielna przez kilka liczb , ale żaden z nich nie zapisałby niestety żadnych bajtów, a większe dzielniki zawierają co najmniej 1 literę.

-18 (+2 bajty i -20 kara) dzięki @Grimy , zastępując literę J( łącz ) z.«« (zmniejsz przez konkatenację).

Wypróbuj online.


1
Jmoże być .««dla -18. Lub zupełnie inne podejście, patrz moja odpowiedź .
Grimmy,

@Grimy Thanks! :) I miła odpowiedź!
Kevin Cruijssen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.