Transponuj quine


10

W tym wariancie quine twój program musi wysyłać swój kod źródłowy transponowany po przekątnej od lewego górnego rogu do prawego dolnego rogu. Na przykład:

twój program
na
cztery linie

wyjścia

 yof
 ono
 u u
 r r
    
 p l
 r i
 o n
 g e
 r s
 a
 m

Biała spacja na wyjściu nie jest dowolna. Spacje pojawiają się w dwóch sytuacjach: gdy w oryginale jest spacja (np. Między ri lw czwartej kolumnie) i gdzie konieczne jest wypełnienie znaków (np. Wszystkie spacje w pierwszej kolumnie). Obie są wymagane, a spacje nie mogą się nigdzie pojawiać jeszcze w wyjściu.

Pojedynczy znak nowej linii na wyjściu można opcjonalnie zignorować. Końcowe znaki nowej linii w kodzie źródłowym nie mają wpływu na wynik, a wiodące znaki nowej linii w kodzie źródłowym muszą być obsługiwane jak w powyższym przykładzie. Załóżmy, że każdy znak, który nie jest znakiem nowej linii, ma szerokość jednej kolumny i wysokość jednego wiersza, chociaż w przypadku znaków takich jak tab może to prowadzić do brzydkich wyników.

Twoje rozwiązanie musi zawierać co najmniej dwa wiersze z co najmniej dwoma znakami nie będącymi nowymi wierszami i nie może być własną transpozycją (wynik nie może być identyczny ze źródłem).

Oszukiwanie quinesów, które odczytują z pliku zawierającego kod źródłowy, pobierają dane z adresu URL, używają wbudowanych funkcji quining i tak dalej, nie są dozwolone.

To jest kod golfowy: wygrywa najkrótszy kod w bajtach.


Czy to musi być prawdziwy quine?
lirtosiast

2
@ThomasKwa W przeciwieństwie do?
Martin Ender

@ MartinBüttner Być może istnieje język, w którym transponowane są literały. W razie czego.
lirtosiast

@ThomasKwa W porządku, o ile spełnia wszystkie określone zasady.
Luke

Czy korzystanie z zewnętrznych bibliotek (takich jak Lodash w Javascript) jest zabronione?
Mama Fun Roll

Odpowiedzi:


5

CJam, 14 bajtów

{`"_~".+N*}
_~

Sprawdź to tutaj.

Choć krótszy, prawdopodobnie nieco mniej interesujący niż rozwiązanie Fission.

Wyjaśnienie

{       e# Quine framework. Runs the block while another copy of it is on the stack.
  `     e# Stringify the block.
  "_~"  e# Push the remaining code as a string.
  .+    e# Element-wise append... essentially puts the two strings in a grid and 
        e# transposes it.
  N*    e# Join with linefeeds.
}_~

10

Rozszczepienie , 17 bajtów

Nadal moim ulubionym językiem quines ...

'"
!0
0+
;!
DN
"!

Wypróbuj online!

Wyjaśnienie

Jest to dość podobne do podstawowej quiny rozszczepienia . W rzeczywistości, jeśli nie było za „musi mieć co najmniej dwie linie z co najmniej dwa znaki nowej linii nie każdy” reguły, po prostu, że mogło być transponowane i wymienić Rz D. Ta zasada sprawia, że ​​rzeczy są nieco bardziej interesujące, ponieważ musimy wydrukować inną linię.

Przepływ kontrolny zaczyna się Dod jednego atomu zmierzającego na południe. Ponieważ uderzy ", zawinie się i wydrukuje

'!0;D

do STDOUT, podobnie jak w normalnym quine. '!następnie ustawia masę atomu na kod znaku !. 0Jest teleport który transportuje atomem, do drugiej kolumny, gdzie nadal się na południe.

Z +zwiększamy masę tego pyłku do wartości ". !N!drukuje cytat, podawanie linii, cytat. STDOUT wygląda teraz tak:

'!0;D"
"

Po owinięciu atom uderza w inny "i teraz drukuje dosłownie drugą linię:

'!0;D"
"0+!N!

Skończyliśmy teraz. Atom ponownie wykorzystuje teleporter i ląduje w tym, ;który go niszczy, a tym samym kończy program.

Podejrzewam, że najładniejszym fragmentem jest umieszczenie jednego "na dole, a drugiego na górze, dzięki czemu mogę wydrukować je za jednym razem, bez konieczności !ponownego ustawiania wartości (ponieważ zostałby zastąpiony przez ponowne wejście w tryb string).


3

JavaScript ES6, 90 bajtów

$=_=>[...(_=`$=${$};$()`.split`
`)[0]].map((x,y)=>_.map(v=>[...
v][y]).join``).join`
`;$()

Nieźle nieźle.

Wyjaśnienie

Oto standardowe ramy quine:

$=_=>`$=${$};$()`;$()

Aby zmodyfikować, po prostu podzieliłem ciąg znaków quine wzdłuż znaków nowej linii i znaków, aby utworzyć macierz znaków, transponowanych przy użyciu 2 funkcji mapy i połączonych w celu utworzenia wyniku.



2

Befunge-93 , 57 bajtów

^
_^
,@
+,
5*
52
,+
*9
28
+|
9
8#
|!
 ,
##
!:
,^
#
:
^
""

Działa to poprzez umieszczenie każdego znaku w pierwszej kolumnie na stosie (oprócz samego cytatu), a następnie wydrukowanie każdego elementu ze stosu. Następnie drukuje cytat, drukuje nowy wiersz, a następnie przechodzi do drugiej kolumny. Robi to samo bez drukowania nowej linii.

Możesz to przetestować w linku w tytule, ale musisz samodzielnie skopiować i wkleić kod do okna. Jeśli naciśniesz przycisk „wolny”, pokaże ci ścieżkę, którą podąża wskaźnik i stos w danym momencie.


Czy może być krótsze przeniesienie cytatu z drugiej kolumny na górę, tak jak to zrobiłem w odpowiedzi na rozłam?
Martin Ender

Mogę przenieść cytat na górę i przestawić drugą kolumnę, aby nadal działała, ale kończy się to na 57 bajtach, ponieważ pierwsza kolumna wciąż musi mieć tę samą wysokość
Kevin W.

Hm, w porządku, pomyślałem, że może to pozwolić wygenerować "tylko jeden raz, abyś mógł przenieść kod z pierwszej kolumny do drugiej.
Martin Ender

1

Python 2, 91 75 69 bajtów

s='#%r;print"s#\\n="+"\\n".join(s%%s)';print"s#\n="+"\n".join(s%s)
##

Wypróbuj online

Wyjaśnienie:

Wykorzystuje to modyfikację standardowego quine:

s='s=%r;print s%%s';print s%s

Po modyfikacji:

s='s=%r;print"\\n".join(s%%s)';print"\n".join(s%s)

Wystarczyłoby, gdyby dozwolona była jedna linia. Następnie dodałem dwa znaki do drugiej linii, aby spełnić to wymaganie. Te #znaki na drugiej linii można zastąpić niczym, tak długo, jak je zmienić w pierwszej linii, zbyt, a to sprawia, że program składniowo poprawny.

Aby wydrukować teraz poprawnie, muszę wydrukować #na końcu dwóch pierwszych wierszy. Więc usuwam pierwsze dwa znaki z łańcucha si drukuję je #przed drukowaniem s%s. Umieszczam jeden z #początku, saby zaoszczędzić trochę bajtów, usuwając literał nowego wiersza.

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.