Wprowadzenie
Napisz kompletny program, który obraca prostokątny blok znaków ASCII o 90 stopni w prawo. Gdy sam program jest obracany o 90 stopni w kierunku zgodnym z ruchem wskazówek zegara, obraca blok znaków ASCII o 90 w kierunku przeciwnym do ruchu wskazówek zegara.
Zasady
- Wielu nie używa wbudowanych, które obracają lub transponują matryce. Na przykład w MATLAB / Octave
rot90
i operator transpozycji'
nie są dozwolone. - Musisz napisać pełny program, który używa STDIN i STDOUT lub najbliższego odpowiednika.
- Twój program musi być prostokątny i zakładać, że wejście jest również prostokątne.
- Dane wejściowe i wyjściowe są ciągami oddzielonymi znakiem nowej linii i nie będą miały końcowych znaków nowej linii.
Po uruchomieniu z kodem źródłowym jako danymi wejściowymi program musi obracać się o 90 stopni w kierunku zgodnym z ruchem wskazówek zegara. Wyjściem musi być drugi program w tym samym języku, który obraca wejście o 90 stopni przeciwnie do ruchu wskazówek zegara. Kiedy obrócony program otrzymuje kod źródłowy jako dane wejściowe, powinien wypisać kod źródłowy oryginalnego programu.
Uwaga: Oba programy muszą działać na dowolnym wejściu, nie tylko na własnym kodzie źródłowym, więc znak jednoznakowy jest niedozwolony.
Przykład
Powiedzmy, że poniżej znajduje się poprawny program, który obraca wejście o 90 stopni w hipotetycznym języku ExampleLang.
^f a2% 3
lk (^_^&
v
D8 $4 /
Po uruchomieniu z samym sobą jako wejściem, wyświetla inny prawidłowy program, który obraca swój sygnał wejściowy przeciwnie do ruchu wskazówek zegara:
D l^
8 kf
$ (a
4 ^2
_%
^
/v&3
Ten drugi program, podany samemu sobie jako dane wejściowe, wyświetla oryginalny program. Zwróć uwagę, że pusta linia powinna mieć cztery spacje, aw drugiej do ostatniej linii znajduje się spacja, której nie można wyrenderować w przecenie. W celu wyjaśnienia:
$ examplelang program < program > rotProg
$ examplelang rotProg < rotProg > program1
$ diff -s program program1
Files program and program1 are identical
Najkrótszy program wygrywa. Standardowe luki są zabronione.
źródło
:.+
da się rozbić na kilka linii?:
i.
zależy od znaku po nim, a linie znaków nie są ważne po żadnym z nich (a nawet gdyby tak było, zmieniłoby to znaczenie programu).C (gcc) ,
14201399463 bajtówAch ... radość ze strun o nieokreślonej długości!
Zakłada
sizeof(char*) == sizeof(int)
isizeof(char**) <= 16
.Nowe podejście
Wypróbuj online!
Wynik powyższego
Ostatecznie rozwiązanie było krępująco łatwe. Tworzysz jeden program A, który obraca rzeczy zgodnie z ruchem wskazówek zegara, i jeden program B, który obraca się przeciwnie do ruchu wskazówek zegara:
ZA
b
Zrób prostokąt o rozsądnych proporcjach i ogranicz do tego A i umieść wokół niego strażników komentarzy:
Ogranicz program B do kwadratu o tej samej szerokości co kwadrat dla A plus dwa (dla dodatkowych linii komentarzy na dolnej krawędzi), obróć go w lewo i uderz w prawo od programu A, a otrzymasz rozwiązanie powyżej.
Stare podejście
Wypróbuj online!
Wynik powyższego
źródło