Wydrukuj frazę, And she said, 'But that's his.'
używając tylko następujących znaków: abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
Żadnych znaków interpunkcyjnych ani niealfabetycznych. Możesz używać dowolnego języka programowania. Biała spacja jest całkowicie dozwolona. Najkrótszy program wygrywa.
code-golf
kolmogorov-complexity
restricted-source
Blue-Maned Hawk
źródło
źródło
a-zA-Z
. Teoretycznie mógłbym użyćw
rytuału iE
val do stworzenia niezbędnych instrukcji, ale żadnej z nich nie+-*,%'"
da się zbudować bez użycia (przynajmniej) jednej z nich+-*,%'"0-9
.(programmer-of (language 'lisp))
nie lubi tego.Odpowiedzi:
Biała spacja ,
417414349265 bajtów265 bajtów dzięki Kevin Cruijssen
Wypróbuj online!
Wyjaśniono:
źródło
Whitespace is completely allowed.
Widzę, że wziąłeś to dosłownie.NNN
znak końca, aby wyjść, ponieważ już kończy się na błędzie, gdy dodajesz przed print_char, więc nie pojawi się nawet po Jump_to_Label. Ponadto, dlaczego przechowywać63
na początku i pobierać go w pętli? Możesz go po prostu wcisnąć przed dodaniem. I dlaczego jest Label-nrTTSSSSTN
? Etykieta może być nawet pusta, więc wystarczyNSSN
utworzyć etykietę iNSNN
przejść do niej, jeśli używasz tylko jednej etykiety.63
? Nie jestem w 100% pewien, że jest to najkrótsza możliwa stała tutaj. Jeśli tak, coś jest nie tak z moim programem do ciągłego generowania, który napisałem dla wcześniejszego wyzwania. :)102
jest najbardziej wydajna: 281 bajtów (lub tutaj z podświetleniem ). (UWAGA: Użyłem również jednej kopii, aby zapisać 4 bajty na miejsce pomiędzyehs dnA
(skopiowane z miejsca międzydias ehs
).Perl 5 ,
13310295 bajtówWypróbuj online!
Wyjaśnienie:
Regeksy, drukowanie i krojenie
$_
są domyślnie stosowane do zmiennej .Zamienia pusty ciąg na
And she saidZ ZBut thatZs hisZZGjGGf
.Zastępuje każdy
Z
wynikiem ewaluacjichr oct oct oct ord chop
. To usuwa ostatni znak$_
, pobiera jego kod, interpretuje go jako ósemkowy trzykrotnie i konwertuje z powrotem na znak. Na przykładj
→ 106 → 70 → 56 → 46 →.
.Ze względu na sposób, w jaki działa zamiana, modyfikacje
$_
tego dokonane podczas oceny zamiany są tracone, podobnie jak$_
terazAnd she said, 'But that's his.'GjGGf
.Usuwa wszystko
G
,j
if
w$_
.źródło
print
zsay
do -2 znaków. Obecny meta konsensus mówi, że flagi wiersza poleceń-M5.010
nie liczą się do liczby bajtów.> <> ,
916915903 bajtówNa początku myślałem, że rozwiązanie w> <> jest niemożliwe, ale potem zdałem sobie sprawę ... kto potrzebuje warunkowej kontroli logicznej? :RE
Wypróbuj online
Wielokrotnie wypycham liczby (liczbę 15) na stos, następnie wypycham długość stosu i drukuję znak o tej wartości ASCII. Jeśli muszę zmniejszyć długość stosu, zmniejszam stos o trzy wartości naraz, używając
p
, lub jedną naraz,g
jeśli jestem w granicach trzech wartości docelowych. Program kończy się wywołaniemi
(wejście), które wypycha a,-1
ponieważ nie ma danych wejściowych, a następnie drukuje je, aby spowodować błąd.To jest program Python 3, którego użyłem do stworzenia rozwiązania, gdy pomyślałem o tym, jak to zrobić:
Wypróbuj online
źródło
p
: utworzenie 59 na stosie podczas przemieszczania się z miejsca nas
INsaid
, a następnie umieścić go w kodzie na drodze w dół odd
celu,
. (Zauważ, że (15,15) ma w tym momencie 15).l
ip
umieszczać kilka użytecznych postaci w prostokącie (10,10) - (15,15), a następnie odzyskiwać jeg
tam, gdzie jest to wygodniejsze.8086 Montaż na komputerze IBM,
1463845664 bajtówWyjaśnienie: Rzeczywistym źródłem języka asemblera jest wpis, a nie wygenerowany kod maszynowy.
Trudność polega na tym, że większość instrukcji x86 (takich jak ADD, SUB, JMP, skoki warunkowe, dostęp do pamięci) mają dwa argumenty i dlatego potrzebują przecinka lub adresu pamięci. Nie możemy więc używać dodawania, odejmowania, ifs ani pętli!
Podczas mojej pierwszej próby byłem w stanie „konstruować” liczby przy użyciu kombinacji inkrementacji, dekrementacji, mnożenia, dzielenia, sztuczek bajtowych i niejasnych instrukcji BCD (takich jak AAA, DAS). Po tym zdałem sobie sprawę, że ten pomysł można wykorzystać do stworzenia kodu do samokontroli i samokontroli.
Próba 1. (1463 bajtów)
Wykorzystano dostępne instrukcje do skonstruowania kodów ASCII i adresu 0xb800 bufora ekranu. Obliczenia każdego znaku w sekwencji zostały ręcznie zagrane w golfa.
Próba 2. (niekompletna)
Uświadomiono sobie, że dla każdej liczby całkowitej z zakresu 0x40-0x5f istnieje kod operacji. Ten zakres obejmuje AZ. Na przykład INC CX odpowiada 0x41 = „A”. (Ta tabela kodów operacyjnych jest bardzo przydatna).
Próbowałem skonstruować 3 ciągi „danych” i nałożyć je jedna na drugą. Pierwszy „tak jak jest” (wielkie litery), drugi „przesunięty” do strefy 0x60-0x7f (małe litery), a ostatni „przesunięty” do strefy 0x20-0x3f (interpunkcja).
Kod samomodyfikujący wytworzyłby pętlę lub trzy do iteracji danych.
Próba 3. (845 bajtów)
Podobnie jak w poprzednim podejściu, ale w celu ograniczenia danych, ciąg byłby kodowany tylko raz, z „mieszanymi znakami kontrolnymi”, aby przełączać zestawy znaków.
Próba 4. (664 bajty)
Jak pozbyć się postaci kontrolnych, które wymagają wielu łatanych instrukcji, aby radzić sobie z rozgałęzianiem? Biorąc pod uwagę, że używane są tylko dwie wielkie litery, zastanawiałem się, czy mógłbym „przerzucić” tabelę opcode, aby kodować małe litery przy użyciu zakresu 0x40-0x4f i interpunkcji przy użyciu zakresu 0x90-0x9f (odejmując od 0xc0). „A” i „B” można wstawić osobno.
Jednak tylko połowa kodów z zakresu 0x90-0x9f jest użyteczna i nie zgadzała się z potrzebnymi. Potem pomyślałem, że może uda mi się je przetasować za pomocą XOR i znalazłem taki, który zadziałał. I oto jest.
Gra w golfa:
Zbierz z
i uruchom w DOSBOX (najpierw uruchom CLS). Wygląda tak:
Skomentowano:
źródło
INC AX
gdy nie ma komentarzaINC AL
.label1 db
własną linię. Daje ostrzeżenie, ale nie ma błędu.Perl 6 ,
1299127212201215 bajtówDzięki Grimy za -27 bajtów.
-52 bajty, ponieważ w pierwszej kolejności nie potrzebowaliśmy królików.
Dzięki Jo King za -5 bajtów.
Wypróbuj online!
Zwraca ciąg z końcowym znakiem nowej linii. Jeśli nie chcesz tego, zamień ostatni
say
naprint
. Można również zastąpić znaki nowej linii w źródle spacjami.Wyjaśnienie
Ten kod drukuje ciąg znaków po znaku. Każdy znak jest tworzony przez wprowadzenie odpowiedniego kodu znakowego do
chr
funkcji i obniżenie go,lc
jeśli to konieczne.Obecnie wszystkie wartości są generowane przez generowanie ciągu zawierającego poprawną liczbę znaków; w niektórych przypadkach liczba znaków jest odwrotnością kodu znaku docelowego. Teoretycznie powinno być możliwe korzystanie z funkcji matematycznych, takich jak
log
iexp
bezpośrednio, ale nie uważałem, że korzystanie z nich jest bardzo łatwe.Do stosowania jako liczby, mamy
e
,pi
itau
; po prawej stroniex
lubxx
są ukryte. Wszystkie mają 17 znaków w swoich reprezentacjach łańcuchowych, więc używamye
do minimalnej liczby znaków. Mamy równieżi
(4 znaki),False
(5 znaków) iNaN
(3 znaki). Możemy pomnożyć długości łańcuchów przezx
;xx
mnoży jeden plus długość sznurka przez prawą stronę i dodaje jeden.chop
usuwa jeden znak z łańcucha na wypadek, gdybyśmy byli jeden od celu.Instrukcje drukowania są łączone w łańcuchy za pomocą
and
, co ma dość niski priorytet. To prawie cud, że istnieje; w przeciwnym razie musielibyśmy użyć nielegalnych średników.Znaki dla postaci znalazłem ręcznie. Warto szukać ich programowo, aby znaleźć krótsze wyrażenia.
źródło
Szerokość ,
6664 bajtówWypróbuj online!
Drukuje do debugowania. Aby wydrukować na standardowe wyjście, dołącz
ww
na końcu kodu, który wyskakuje i wysyła górę stosu.Wyjaśnienie
W opcji Szerokość każda litera koreluje z liczbą na podstawie jej „szerokości”, zgodnie z tą tabelą . Przypisuje to każdej literze cyfrę od 0 do 9. Następnie liczby te są używane do wykonania kodu.
W szczególności litera niż dopasowania
7
rozpocznie literał ciągu. Odczyta zestawy dwóch liter naraz, dopóki nie odczyta oryginalnej litery. Każdy zestaw dwóch liter zostanie przekonwertowany na ich liczby szerokości, odczytane jako liczba dziesiętna od 0 do 99, a znak, który będą równe, będzie ich indeksem w następującym ciągu:Na przykład indeks
!
wynosi 1, więc01
będą odpowiednie liczby szerokości. Zatemif
,iI
,jt
, etc wszystko będzie korelować na ciąg dosłownym!
.W tym przypadku przetłumaczyłem 31 znaków wymaganego wyniku na odpowiednie litery, używając
Q
jako cudzysłowu. Górna część stosu jest drukowana w celu debugowania po zakończeniu programu.źródło
kod maszynowy x86 (32-bit), 256 bajtów
Kiedy drukuję kod na konsoli 437 strony kodowej, widzę następujące informacje:
Zawiera niektóre znaki spacji, więc tutaj jest ten sam kod, gdy zastępuję wszystkie znaki tabulacji
→
wszystkimi znakami spacji (z kodem 255)*
:Hexdump:
Kilka wyjaśnień, jak to działa:
Przydatne instrukcje to:
push imm8
,push imm16
apush imm32
następniepop
generuj stałe. Może to również generować zero (inah
) podczas wypychania bajtu (imm8
).and [ecx+32], ah
- zakładając, że ah = 0, ustawia to bajt na zero. Tak się składa, że długość ciągu wyjściowego wynosi 32, więc kod wypełnia bufor od końca do początku.or [ecx+32], edx
- zakładając, że bajt wyjściowy jest ustawiony na zero, kopie teedx
(4 bajty) są wysyłane. Używam wariantu zdx
zamiastedx
końca bufora, ponieważ nie powinien on pisać poza buforem wyjściowym. Ograniczenia w kodzie uniemożliwiają pisanie w ten sposób pojedynczych bajtów!imul edx, [ecx+32], whatever
- to główny pomysł na szyfrowanie. Przy wystarczającej liczbie entropii[ecx+32]
i dowolnej liczbie może wygenerować dowolny wynik. Używam go do generowania 2 lub 3 bajtów potrzebnych wartości. Pewna komplikacja polega na tym, że zapisując ją na wyjściu, musi logicznie logować sięOR
z tym, co już tam jest. Czasami konieczne było ponowne wyzerowanie pamięci.jmp
instrukcji używany jest wariant instrukcji. Wybrałem go, ponieważ jest to kodowanie0xff
, które odpowiada niezłomnej spacji na stronie kodowej 437. Trochę rozciąga się na regułach, ale poza tym uważam, że zadanie jest niemożliwe ...Kod źródłowy asemblera wraz z programem C, który go uruchamia (używa składni Visual Studio):
źródło
dec ecx
+and [ecx+32], ah
rzeczy można rozdzielić.0xff
narusza „Żadnych znaków interpunkcyjnych ani znaków innych niż alfabetyczne”?PostScript,
889874837835 bajtówWypróbuj online!
Używa 32 kopii liczb całkowitych
89 25 20 6
. Wszystkie kody znaków ciągu docelowego można uzyskać za pomocą operacji na tych liczbach całkowitych, w kolejności stosu: na przykład „A” (ASCII 65) wynosi 89 - (25 i (20 + 6)). Wiele 4-krotnych liczb całkowitych ma tę właściwość; ten został wybrany, ponieważ są szczególnie łatwe do wygenerowania.Flat ma domyślną wartość 1, więc tworzy ciąg o długości 1 (inicjowany na
\0
).dup
nie jest głęboką kopią: tworzy drugie odwołanie do tego samego ciągu. rrand wypycha losowe ziarno, które domyślnie ma wartość 0. Stos jest teraz["\0", "\0", 0]
.count
wypycha liczbę elementów na stosie, więc oblicza 3 ^ (3 * (5 * 6)) = 89.4 * 5 = 20, 5 * 5 = 25, 6 = 6. Stos jest teraz
["\0", "\0", 0, 89, 25, 20, 6]
.Duplikuj cały stos pięć razy. W ten sposób otrzymujemy 32 kopie naszego początkowego 7-elementowego stosu. Potrzebujemy tylko 31 kopii, ponieważ ciąg docelowy ma 31 znaków, ale dodatkowa kopia nie zaszkodzi.
Oblicz kod znaków z czterech pierwszych liczb całkowitych, zapisz go pod indeksem 0 ciągu, a następnie wydrukuj ten ciąg.
Pomija domyślny monit.
źródło
Rubinowy ,
420 354338 bajtówWypróbuj online!
W porządku rosnącym wesołości:
Słowa zaczynające się od dużej litery można wydrukować, definiując klasę o tej nazwie i wywołując
display
w treści definicji klasy.Inne słowa można wyświetlić, definiując metody o tej nazwie, które zwracają symbol, a następnie rzutując je na ciąg znaków, aby usunąć wiodący dwukropek.
Inne znaki można wyświetlić, wywołując
putc
ich kod ASCII. Możemy wygenerować odpowiednie liczby, ponownie wykorzystującString def
lewę, aby uzyskać ciąg, a następnie pobierając sumę jego bajtów przy użyciu modułu określonego przez jego rozmiar. Niestety nie mamy możliwości wywoływania metod na obiekcie innym niż z definicji klasy tego obiektu, co utrudnia przekazywanie argumentów. Tak więc ostatnim hackiem jest przedefiniowanieString#inspect
, które jest wywoływane niejawnie podczas przekazywania ciągu dop
metody, aby obliczał i wyświetlał odpowiedni znak jako efekt uboczny, zanim zgłosi błąd, abyp
nie mógł dokończyć wykonywania i wydrukować Nowa linia. Następnie musimy uratować błąd w głównym kodzie.Edycja: Jordan sprawił, że liczba bajtów była o wiele mniejsza, hmm, wysoka z pewnym sprytnym sterowaniem golfem, a ja wyciąłem jeszcze kilka bajtów, zastępując
raise
jedno-nieistniejące wywołanie metody, które wywołuje błąd NameError.Edycja 2: Zauważyłem, że po
print String
wyodrębnieniu do metody taniej jest po prostu użyć tego z definicją metody, niż użyć sztuczki definicji klasy, ponieważ metody mogą być tytułami.źródło
sum size
suma modulo ma swój rozmiar, ale wszystko inne się sprawdza!> <> ,
233122 bajtówWypróbuj online!
Zaczęło się od golfa odpowiedzi mbomb , ale odkryłem fundamentalną zmianę, która oszczędza ogromną liczbę bajtów, więc zamieszczam ją jako własną odpowiedź.
Generowanie znaków niealfabetycznych na wyjściu odbywa się poprzez wielokrotne wypychanie wartości na stos, a następnie za pomocą
l
wypychania długości stosu. Nie musi to jednak być generowane natychmiast: za pomocąp
tej postaci można umieścić ją w dowolnej komórce, której współrzędne wynoszą od 10 do 15 włącznie, do późniejszego odzyskaniag
. Podobnie, znaki alfabetyczne mogą być umieszczane w początkowym kodzie źródłowym i czytane w ten sposób: ponieważ najwyższy niealfabetyczny kod znaków na wejściu to 46 (.
), oznacza to, że stos nie musi być przesuwany wyżej niż 62 potrzebny do przechowywania wszystkie 31 znaków wyniku.Dodatkowo,
v
w kodzie w kolumnie 7. umieszczany jest a . Gdy wskaźnik instrukcji zawija się i uderzav
, sekwencjago
jest wykonywana wielokrotnie w celu odczytania z popchniętych współrzędnych i wyprowadzenia odpowiednich znaków. W końcu stos staje się pusty ig
kończy działanie programu z błędem.Pierwsze 7 bajtów kodu jest ponownie wykorzystywane, gdy zarówno pierwsza 7, jak i ostatnia 7 współrzędnych są wypychane. Umieszczenie
v
w kolumnie 9 teoretycznie zaoszczędziłoby jeszcze dwa bajty, ale zmusiłoby znakiAinsv
do kwadratu 2x2 w kodzie, co jest niemożliwe. Wcześniejsza wersja używała kolumny 15, ale wymagała dodatkowej linii w kodzie źródłowym i kończyła się o sześć bajtów dłużej.źródło
r
przesunięcie linii trasowania, gdziekolwiek chcę. Jednak gra w golfa trochę boli mój mózg.CJam , 262 bajty
Wypróbuj online! Nowe linie są tutaj pokazane tylko dla jasności; każda linia reprezentuje znak.
Uff, było fajnie. Ograniczanie się do poleceń alfabetycznych stanowi interesujące wyzwanie:
{
i}
praktycznie nie ma możliwości sterowania przepływem (poza tymf
, że nie znalazłem okazji do użycia).\
,_
,;
, lub$
, nie mamy środki do manipulacji stosu.Oznacza to, że głównym celem będzie uzyskanie odpowiednich punktów kodu na stosie, a następnie przekształcenie ich w znaki za pomocą
c
.Problem polega na tym, że brakuje nam również podstawowych komend arytmetycznych, a także literałów całkowitych. Jest to w porządku, ponieważ
m
przestrzeń nazw zawiera wiele zaawansowanych operacji matematycznych i istnieje wiele zmiennych predefiniowanych do przydatnych liczb.Skończyło się na tym, że intensywnie korzystałem z pierwiastków kwadratowych (
mQ
imq
), funkcji wykładniczejme
i konwersji podstawy (b
), których można również użyć do emulacji mnożenia ([X 0] Yb
oblicza X * Y). Ponadto czasami łatwiej jest zbudować wieloznacznik, w którym to przypadku możemy użyćel
(przekonwertować na małe litery) wynikowego znaku.Nadal nie jestem zadowolony z niektórych dłuższych. No cóż.
Wyjaśnienie
To jest wyjaśnienie wyniku po znaku. Zanim zacznę, oto kilka krótkich sposobów tworzenia liczb:
T
,X
,Y
,Z
odpowiednio.A
doK
.Sci
(S
wypycha ciąg zawierający spację,c
pobiera pierwszy znak tego ciągu ii
konwertuje ten znak do punktu kodowego).S
jest również używany do spacji.GmQ
(pierwiastek kwadratowy z liczby całkowitej 16).AZbYb
(konwersja 10 na bazę 3, dając[1 0 1]
, i konwertuj wynikową tablicę liczb na bazę 2, dając 5).Ymei
(oblicza exp (2) i konwertuje na liczbę całkowitą).A
n
d
s
h
e
a
i
,
'
B
u
t
.
źródło
HYbYCtYbc
,HYbXAtYbc
iHYbXBtYbc
.Deadfish ~ , 943 bajtów
Wypróbuj online!
Pętle nie są dozwolone
:(
źródło
zło , 198 bajtów
Wypróbuj online!
To było całkiem fajne.
źródło
Stax ,
133958479 bajtówUruchom i debuguj
źródło
MATL ,
187158 bajtówWypróbuj online!
Bardziej czytelna wersja: Wypróbuj online! Ręczna próba zbudowania łańcucha. Prawdopodobnie jest dużo miejsca do gry w golfa, dzieląc sznurek na wygodne kawałki, używając
P
ih
obracając i budując sznurek. Mam nadzieję, że ktoś podejmie wyzwanie, by mnie obezwładnić. Głównym wyzwaniem jest to, że nie można użyć+
lub-
, tak podstawowa arytmetyka często nie jest możliwe.Najważniejsze:
KQthpYq
: 25-ta liczbaKQthp
pierwszaYq
wynosi 97, co odpowiada literzea
. Literas
(115) jest generowana podobnie z 113, 30-tej liczby pierwszej. Następnie jest szeroko ponownie wykorzystywany w schowkuJ
.his
jest skracany przez przechowywanieh
poprzedniego w schowkuJ
. Ponieważ to poprzednio przechowywanes
, budujemyhis
w odwrotnej kolejności, abyśmy mogli nadal pobierać ostatnios
używaney
i odwracać je po użyciuP
.h
navle
)źródło
v
może zepsuć to,h
co miałem wcześniej. Chyba powinienem to mieć, zamiast zakładać. Ponadto, dzięki za heads-up, nastąpiło nadgorliwe usunięcie. Jestem ciekawy, czy dasz radę lepiej ...U
oznacza^2
, że mogłem zaoszczędzić sporo bajtów ...MATL , 118 bajtów
Wypróbuj online!
Bardziej czytelna wersja (każda linia odpowiada jednemu znakowi, z wyjątkiem operacji przestawiania stosu).
Wyjaśnienie
Program generuje punkty kodowe wymaganych znaków, jako niezależne liczby. Na koniec wszystkie te liczby są łączone w wektor kolumny, przekształcane jako wektor wiersza i konwertowane na znaki. Wynik jest domyślnie wyświetlany.
Niektóre z zastosowanych sztuczek:
0
jest używany dla większości spacji, ponieważ kosztuje tylko bajt (O
).15
jest używana (generowana jakoKUq
), ponieważ można ją ponownie wykorzystać, dodając ją do100
(chard
), aby dać115
(s
). Przy innej okazji5
używa się miejsca (generowanego jakoKQ
), więc można go później odjąć od44
(,
), aby dać39
('
).J
służy do przechowywania znaków, które będą powtarzane: najpierws
, a potem'
. Podobnie, schowkiH
przechowują informacje100
przydatned
i do generowania innych znaków.Q
(dodawanie1
),q
(odejmowanie1
),E
(mnożenie przez2
) iU
(kwadrat), a także predefiniowane literały w schowkachI
(3
) iK
(4
).h
) i obliczenie jego sumy (s
) lub kolejnych różnic (d
).100
(d
) jest generowany jak4
w formacie binarnym interpretowanym jako liczba dziesiętna.110
(n
) jest uzyskiwane z65
(A
) przez konwersję na string ('65'
: punkty kodowe[54 53]
), dodawanie1
do punktów kodowych ([55 54]
), sumowanie ich razem i dodawanie1
.w
), bubble upb
).źródło
O
zamiastKWE
spacji. I potwierdziłeś moje podejrzenie, że prawdopodobnie lepiej poświęcić inny schowekH
.dc ,
240222209 bajtówWypróbuj online!
Moja pierwsza myśl była taka sama jak @seshoumara, po prostu wepchnąłem wystarczającą ilość rzeczy na stos, aby wygenerować wszystkie wartości ASCII znaków. Wtedy dotarło do mnie, że skoro
+
,-
i*
są operatorzy pojedynczej postaci, mogę tylko odtwarzać je i mieć możliwość korzystania z arytmetyki! Z pewnością byłoby to mniejsze!I nie zdziwiłbym się, gdybym mógł zagrać w więcej bajtów, ale na razie ... to zawiłe podejście udało się powiązać z naiwnym (ish).OOOOOziOOOOOOOOOOOOOOOOOOOOOOOOOOOzddddddzkdddzasBdzasAdzscdzdasCzsd
jest częścią podejścia podobnego do @ seshoumara, ale idziemy tylko do 46, czyli.
. Robimy to, ponieważ musimy zwiększyć do 45,-
a także potrzebujemy kropki w naszym ciągu, więc pójście o jeden krok dalej w tym okresie jest (myślę) najtańsze. Po drodze przechowujemy pewne wartości: 5, 32, 39, wszystkie przydają się później. 5 dla przedmiotów użytkowych, 32 i 39 dla ich wartości ASCII. Początkowo robiłem 1-5, ale to było drogie i mogłem po prostu uniknąć używania 4; użyjZ
( wpisz wartość, wciśnij liczbę cyfr, które ma) na trzy-, dwu- lub jednocyfrową liczbę dla tych wartości. Na 42, 43, i 45, możemy przekonwertować je na ciągi znaków (*
,+
, i-
, odpowiednio) i zapisać je jako makra (B
,A
, iC
odpowiednio, kolejno). Oznacza to, że bez używania znaków*+-
możemy teraz używać tych operatorów.Odtąd zaczynamy generować wartości ASCII przy użyciu mocy matematyki zamiast zwykłej akumulacji, przechowując niektóre powtórzenia po drodze. 100, 105 i 115 pojawiają się na tyle, że przechowywanie ich (w rejestrach lub w inny sposób) ma sens. Pierwotnie zostawiłem stos wypełniony 10s i użyłem ich do stworzenia 100; skończyło się to na zapisaniu bajtów, aby wypełnić stos 32s i użyć ich jako spacji później. Nieco bardziej czytelna wersja sekcji ASCII:
OOlAxlAxP OBlBxdIlAxoP AdlBxddsrIlAxssP P OP lsIZlCxddspP OZlCxP P OP lrdZlCxP lsP lrP lcP P KP dZlBxdZlAxP OAZlAxdP IZlCxdP rPdP lpP lrdZlCxP P KP OP P lpP lsP OP ldP KP
.Ogolono 18 bajtów poprzez: zapisanie liczby 5 jako podstawki wejściowej zamiast rejestru; liczba 32 jako precyzja zamiast rejestru; liczba 115 jako podstawa wyjściowa zamiast rejestru; Następnie było zmienić
KZ
abyIZ
wygenerować 1s iOZ
abyKZ
wygenerować 2s.Ogolono jeszcze 13 bajtów, zalewając stos 32s; ustawienie precyzji na 39; stosowanie manipulacji stosami, aby uniknąć przechowywania 116; wycinając podwójną pracę, którą przypadkowo zostawiłem.
źródło
a
odtworzyć tych operatorów, a następnie zadzwonić do nichx
. To pokazuje zachowanie danych w kodzie dc. Kiedy będę miał czas, zastosuję twoją najnowszą sztuczkę przechowywania danych w parametrach zamiast w rejestrach. Czy myślisz, że moglibyśmy uzyskać jeszcze krótsze rozwiązanie DC, nadużywając sposobu, w jaki P działa, aby drukować więcej liter na raz, jeśli mamy szczęście, że wprowadzamy potrzebną ogromną liczbę za pomocą tylko heksa?P
16750 lub 0x416E. Gdybyśmy po prostu mieli szczęście, a jeden z podłańcuchów składał się wyłącznie z wartości AF, to może nas to skrócić. To by było trochę szczęścia! W przeciwnym razie albo wprowadzilibyśmy duże liczby, wymyślając je, albo dodając i mnożąc przez 256. Co wydaje się ... bardziej skomplikowane niż kilkaP
s.Japt , 87 bajtów
Spróbuj
Wyjaśnienie
Pierwszy wiersz generuje
'
i przypisuje go do zmiennejU
.Drugi wiersz przypisuje
2
do zmiennejV
.Trzeci wiersz generuje
.
i przypisuje go do zmiennejW
.Ostatni wiersz buduje ciąg po jednym znaku na odwrót.
źródło
Qc dGaB
Czerwony , 272 bajty
Jeśli konieczne są podwójne cudzysłowy:
Czerwony , 344 bajty
Nie działa w TIO, ale działa w czerwonym tłumaczu.
Wyjaśnienie:
Słowa są trywialne - opisuję je (drukuj bez nowej linii) jako literały z
quote
. Czerwony ma wbudowane słowo oznaczające przestrzeń -sp
oraz,comma
idot
."
i'
bardziej interesujące: drukuję je, odejmując odpowiednio spacjęB
iG
, zaczynając od literału,B
iG
przekształcając je najpierw na ciąg znaków,mold
a następnie na znak (w celu użycia odejmowania na nich) za pomocąto sp
( czerwony ma konwersję według prototypu - przekonwertować ciąg do typusp
, który jest znakiem).źródło
'
, więc rozwiązanie 272 bajtów jest takie samo.Dalej (gforth), 351
Szkoda, że nie mogę przedefiniować CHAR lub EMIT na słowa jednoliterowe, ponieważ wymagałoby to użycia zarówno
:
i;
(np.: C CHAR ;
) Lub'
(np.' CHAR ALIAS C
)W rzeczywistości, gdybym mógł zdefiniować słowa, mógłbym zrobić,
: P CHAR EMIT ;
a następnie zrobić,P x
aby wydrukowaćx
. No cóż.Nie mogę nawet utworzyć bufora, zapisać tam sekwencji znaków, a następnie użyć jej jako danych wejściowych, ponieważ zapisywanie w pamięci wymaga użycia
!
lubC!
źródło
AlphaBeta ,
180 177 175163 bajtówWypróbuj online!
WIP
źródło
Pepe , 266 bajtów
Trzymam stos r pusty i mam „s” na stosie R.
To nie jest w TIO, ale możesz spróbować tutaj
źródło
dc , 240 bajtów
Główną ideą jest ciągłe powiększanie stosu o 1 (
K
), oszczędzając (sX
) rozmiar stosu (z
) w niestandardowych rejestrach, gdy pasuje do każdego unikalnego kodu ASCII. Drukowanie (P
) odbywa się przez cały czas.Wypróbuj online!
Zrobiłem pewną optymalizację, jak na przykład nie zapisywanie litery, jeśli nie jest ona później używana, na przykład powielanie (
d
) litery, np. T, na stosie w celu zapisania bajtu, ponieważ recall (lX
) ma 2 bajty.źródło
Kod maszynowy 80186+, format MS-DOS .COM,
822787 bajtówOprócz liter używane są tylko tabulatory i spacje. Biorąc pod uwagę, że większość kodów operacyjnych w dozwolonym zakresie to pewne przyrosty, zmniejszenia, wypychania, wyskakiwania i operatory pośredniczące w rejestrach i operatory OR, oprócz IMUL, korzystam z faktu, że rejestr stosu zawija się, gdy osiąga koniec segmentu, aby zmodyfikować kod w odwrotnej kolejności! Wymagany jest montaż 80186+, ponieważ przekazuję natychmiastowe wartości.
Źródło z adnotacjami (format TASM):
źródło
Befunge-98 (FBBI) ,
125124121 bajtówWypróbuj online! Dane wyjściowe do pliku o nazwie
\n
(pojedynczy nowy wiersz). Podziękowania dla Jo Kinga za scenariusz.Dane wyjściowe obejmują 10 nowych linii.
Dla tylko jednej nowej linii, +1 bajt , zmieniając następujący wiersz:
Wypróbuj online!
Wyjaśnienie:
Wskaźnik instrukcji porusza się w następujący sposób:
Program umieszcza znaki niealfabetyczne na swoim miejscu przed wypisaniem tego wiersza do pliku.
Befunge-98 zawiera instrukcje
a
...f
, które wypychają odpowiadającą im wartość szesnastkową na stos. Aby wygenerować inne liczby, przekazuje te wartości doy
(„Get SysInfo”) jako argumentów w celu uzyskania:Umieszczając większość kodu na y = 23,
ayy
można go użyć do wielokrotnego dostępu do wielkości stosu, który jest następnie wykorzystywany do generowania kodów znaków.źródło
Pyth , 210 bajtów
Wypróbuj online!
Znalazłem kilka liczb, które można wyrazić przy użyciu samych liter (np.
T
= 10,Z
= 0,lG
= długość (alfabet) = 26,Cd
= kod znaków (spacja) = 32) i kilka funkcji, które można wykonać przy użyciu samych liter (jakt
= zmniejszanie,h
= zwiększanie,hF
= wielokrotne stosowanie przyrostu = dodawanie), a następnie po prostu uruchomiłem wyszukiwanie z użyciem siły, aby znaleźć najkrótsze kombinacje tych funkcji i liczb, które skutkowały każdą z potrzebnych liter.źródło
16-bitowy kod zestawu x86, 665 bajtów
(plik binarny jest alfabetyczny, a nie źródło)Jakoś zapomniałem o regule zezwalającej na białe znaki. Z pewnością kod może zostać w ten sposób zagrany w golfa.
Kod bajtowy:
Źródło:
Działa w ten sposób:
przesuwa wskaźnik stosu na koniec kodu za pośrednictwem POP AX (nie może POP SP, ponieważ nie jest alfabetyczny);
konstruuje instrukcję do wywołania wywołania DOS (algorytmicznie, ponieważ nie jest to alfabetycznie);
konstruuje znaki niealfabetyczne;
umieszcza ciąg na stosie;
umieszcza instrukcję wysyłki na stosie na dokładnym końcu kodu, aby wykonanie przepływało bezpośrednio do tej instrukcji;
konstruuje instrukcję drukowania łańcucha;
wyświetla ciąg i natychmiast ulega awarii. : - / (Pełne wyjście wymagałoby więcej kodu)
źródło
Japt , 74 bajty
Spróbuj
źródło
05AB1E ,
145121109 bajtówWypróbuj online!
źródło
Kod maszynowy 80186 + DOS, 91 bajtów
Wersja tekstowa:
Wersja tekstowa, z tabulatorami (kod 9) zastąpionymi przez
9
i spacje (kod 32) zastąpione przez*
:Hexdump:
Kod maszynowy pojawia się w pliku z rozszerzeniem
.com
. Po uruchomieniu drukuje wymagany komunikat, a następnie zawiesza się (wykonując losowe dane).Ogólne wyjaśnienie tego, co robi:
,'.$
)int 21
instrukcję, która drukuje komunikatKod zestawu (można skompilować
tasm
):Używa
popa
instrukcji do wyskakiwania wszystkich rejestrów, ponieważ regularnepop
nie może wypełnić wszystkich potrzebnych rejestrów (np.pop di
Jest zabronionym kodem operacyjnym).Adresy bajtów do załatania są w zakresie 0x100 ... 0x160. Na szczęście można je przedstawić jako sumę 3 bajtów z dozwolonymi wartościami:
bp
si
lubdi
Łata bajtów w komunikacie działa logicznie
OR
na 0x20 (znak spacji) i małej stałej (4, 7, 12 lub 14). Mała stała jest uzyskiwana przez inicjalizacjęcx
idx
do 9 (znak tabulacji) i wykonywanieINC
lubDEC
w razie potrzeby.Patchowanie kodu korzysta z
IMUL
instrukcji. Znalazłem potrzebne 16-bitowe stałe do pomnożenia za pomocą wyszukiwania brute-force.Wreszcie adres wiadomości (0x13b) jest uzyskiwany przez pomnożenie. Aby zaoszczędzić miejsce, wziąłem jedną ze stałych z jednej z instrukcji, która zawiera bezpośrednią wartość
0x96d
. Tutaj9
część wybiera funkcję drukowania DOS, a6d
część jest parametrem wolnym. Okazuje się, że6d
jest to jedyna możliwość, która może dać 0x13b po pomnożeniu.Demontaż części kodowej:
Ciekawostka: normalnie używałbym
offset message
zamiast zakodowanego na13bh
stałe, ale w tym przypadku, ponieważ w czasie analizy jego adres jest nieznany, tasm generuje natychmiastowe 16-bitowe przesunięcie, marnując 1 bajt kodu:źródło