Transponuję kod źródłowy, transponujesz dane wejściowe!

31

Rip-off z rip-off z rip-off z rip-off . Głosujcie za tymi!

Twoim zadaniem, jeśli chcesz to zaakceptować, jest napisanie programu / funkcji, która wyprowadza / zwraca dane wejściowe / argument¹. Problem polega na tym, że jeśli transponuję kod źródłowy², wynik / wynik również musi zostać transponowany.

  1. Możesz wybrać, jaki rodzaj danych 2D może zaakceptować twoje rozwiązanie. Na przykład lista list, macierz, lista ciągów itp. Określ, który z nich obsługuje. Możesz założyć, że wejście będzie zawsze prostokątne i będzie miało długość 1 lub więcej wzdłuż każdego wymiaru.

  2. Do celów transpozycji krótkie linie w kodzie źródłowym będą traktowane jako dopełniane spacjami końcowymi, dopóki nie będą prostokątne, jednak te dopełniane spacje końcowe nie wpływają na długość kodu.

Ponieważ jest to , celem jest optymalizacja liczby bajtów oryginalnego kodu źródłowego (nie transponowanej wersji).

Przykłady

Załóżmy, że twoje rozwiązanie przyjmuje macierz numeryczną, a kod źródłowy to

AB
DEF

a jego wejście / argument to [[1,2],[3,4],[5,6]]. Jeśli napiszę

AD
BE
 F

zamiast tego i uruchom go, wyjście / wynik musi być [[1,3,5],[2,4,6]].

Załóżmy, że Twoje rozwiązanie pobiera ciąg oddzielony od linii, a kod źródłowy to

ABC

a jego wejście / argument to "96\n". Jeśli napiszę

A
B
C

zamiast tego i uruchom go, wyjście / wynik musi być "9\n6\n".

Adám
źródło
23
Mój Boże. Czy możemy przestać?
JL2210
3
@ Night2 Nie, to komplikuje sprawy.
Adám
14
@ JL2210 Nie, mam duży w pracach.
Adám
7
Wyzwania te stają się niemożliwe w językach proceduralnych bez poważnego nadużywania komentarzy.
JL2210
2
@ JL2210 Przekształca .
Adám

Odpowiedzi:

27

Python 3 + numpy, 45 bajtów

lambda\
a:a
ma= """
b.    "
dT"   "
a "
\ """

Wypróbuj online!

Dzięki @EriktheOutgolfer wskazując błąd poprzedniej wersji

Transponowano:

lambda\
a:a.T  
ma= """
b     "
d "   "
a "    
\ """  

Wypróbuj online!

Funkcje pobierają macierz liczbową jako dane wejściowe i wyjściowe. Rozwiązanie nie opiera się na komentarzach, jak wiele innych rozwiązań, ale zamiast tego wykorzystuje ciągi wieloliniowe.

Joel
źródło
3
To naprawdę miłe!
Adám
Hm, jestem prawie pewien, że transponowana wersja będzie wypełniona spacjami, więc ostatni wiersz będzie zawierał spacje końcowe, dlatego też \wyrzuci a SyntaxError. Aby to naprawić, musisz przenieść cytaty w obu kierunkach.
Erik the Outgolfer
@EriktheOutgolfer Naprawiono. Dzięki.
Joel
15

Galaretka , 2 bajty

Dane wejściowe to lista list. Podziękowania dla Luisa Mendo i Nicka Kennedy'ego za poprawę odpowiedzi.

ZZ

Wypróbuj online! Spróbuj transponować!

Program transponuje dane wejściowe dwukrotnie, zwracając oryginalne dane wejściowe. Wersja transponowana ignoruje pierwszą linię i transponuje tylko raz.

ovs
źródło
13

R , 5 4 bajtów

#t
I

Wypróbuj online!

Funkcja R, funkcja tożsamości Ilub funkcja transpozycjit transpozycji po transpozycji. Stopka na TIO pokazuje wyniki obu.

Dzięki @RobinRyder za uratowanie bajtu!

Nick Kennedy
źródło
Nie potrzebujesz finału #.
Robin Ryder
@RobinRyder dzięki! Z jakiegoś powodu wypełniałem prostokąt, mimo że widziałem stwierdzenie, że nie jest to konieczne.
Nick Kennedy
10

C (gcc) , 209 205 203 201 bajtów

Normalna

f(n,L,r,c)char**L;{for(c=0;0?L+  c:c<n;c+=puts(""))for(r=0;0?r :L[c][r];r++)putchar(L[ c ][ r ]);}/*
          \\\      \\      1 [0][]      \ \\\  \   \\      1 <n          \  \\\\\\   r+-c c+-r    */

Wypróbuj online!

Transponowane

f 
( 
n 
, 
L 
, 
r 
, 
c 
) 
c\
h\
a\
r 
* 
* 
L 
; 
{ 
f\
o\
r 
( 
c 
= 
0 
; 
01
? 
L[
+0
 ]
 [
c]
: 
c 
< 
n 
; 
c 
+\
= 
p\
u\
t\
s 
( 
"\
" 
) 
) 
f\
o\
r 
( 
r 
= 
0 
; 
01
? 
r<
 n
: 
L 
[ 
c 
] 
[ 
r 
] 
; 
r 
+\
+ 
) 
p\
u\
t\
c\
h\
a\
r 
( 
L 
[r
 +
c-
 c
] 
[c
 +
r-
 r
] 
) 
; 
} 
/*
*/

Wypróbuj online!

gastropner
źródło
8

Haskell , 51 bajtów

Ta wersja jest ważna, ale nie zostanie zatrzymana, gdy zostanie podana []jako dane wejściowe.

f
--(:[|,<zabf=]f
--abx(y-i$]
-- ):x) pf;x[:x
 y =y

Wypróbuj online!

Transponowano, 75 bajtów

f---
 ---y
 (a
 :b)=
 [x:y
 |(x
 ,y)
 <-
 zip
 a$f
 b];
 f x
 = [
 ] :
 f x

Wypróbuj online!

Haskell , 51 bajtów

Ta wersja jest poprawna, ale ulega awarii []jako dane wejściowe dla transponowanej wersji.

f
--d[(idi)z[.]d!0
-- m!)|,<i0.$ !]
-- a! (_-p
 p=p

Wypróbuj online! Transponowane

Haskell , 75 67 57 bajtów

Co najmniej 7 bajtów zaoszczędzonych dzięki Ørjanowi Johansenowi

Ta wersja wyświetla się, []gdy jest podawana []jako dane wejściowe.

f
--[[d(i<di)z[.$!0
--]]=!)$|,<i0.d!]
-- ;[! >(_-p ]
 f=f

Wypróbuj online!

Transponowane

Kreator pszenicy
źródło
60 bajtów
Ørjan Johansen
@ ØrjanJohansen Thanks! Próbowałem czegoś takiego wcześniej, ale nie mogłem tego uruchomić. Jest również dość łatwy sposób na usunięcie 3 dodatkowych bajtów z twojego 60.
Wheat Wizard
7

Python 3 , 51 bajtów

lambda\
a:a
mz= '''
bi'   '
dp'   '
a('
 *
 a
\)'''

Wypróbuj online!

Na podstawie podejścia Joela . Wejście jest tuplew tuples, a wyjście jest zip(w przeliczeniu na Atuple ciągu TIO dla lepszej widoczności).

Transponowano:

lambda  \
a:zip(*a)
ma='''  '
b       '
d '     '
a '      
\ '''    

Wypróbuj online!

Erik the Outgolfer
źródło
5

Perl 6 , 20 11 bajtów

#&
*[
#Z
 ]

Wypróbuj online!

Transponowane

#*# 
&[Z]

Wypróbuj online!

Obie funkcje działają na liście list.

*[ ] jest kodem typu WhthingCode zwracającym plasterek zen argumentu, skutecznie funkcją tożsamości.

&[Z] jest operatorem zip.

nwellnhof
źródło
5

Haskell, 185 161 bajtów

t i
 =
 i
af

 n m
 u a e i
 l p s d
 lu h=u
 (
 h
 e
 a
 d

 a
 )
 t
 h
 e
 n
 [
 ]
 e
 l
 s
 e

 m
 a
 p

 h
 e
 a
 d

 a
 :
 t
 (
 m
 a
 p

 t
 a
 i
 l

 a
 )

Wypróbuj online!

Transponowano:

t  a
 =if null(head a)then[]else map head a:t(map tail a)
i       u
     map
        h
      es=
        u
      id

Wypróbuj online!

Bez komentarzy, bez literałów łańcuchowych, tylko dodatkowe definicje funkcji.

Edycja: -24 bajty dzięki @ Ørjan Johansen.

nimi
źródło
2
161 bajtów
Ørjan Johansen
4

PHP (7.4), 114 86 70 bajtów

Moje pierwsze doświadczenie z robieniem czegoś takiego w PHP, musi istnieć lepszy sposób, którego nie widzę! Dane wejściowe to tablica tablic takich jak[[1,2],[3,4],[5,6]] .

Normalna:

fn($a)=>$a/*
nu         /
(l
$l
a,
).
=.
>.
a$
ra
r)
a/
y*
_
m
a
p
(*/

Wypróbuj online!

Transponowane (wypełnione spacją):

fn($a)=>array_map(
null,...$a)/*    *
(                /
$                 
a                 
)                 
=                 
>                 
$                 
a                 
/                 
*/                

Wypróbuj online!

Noc 2
źródło
3

Węgiel drzewny , 19 bajtów

A¿⁰«
‖⁰¿
↗⁰
¿⁰
⁰¿
«

Wypróbuj online! Pobiera dane wejściowe jako tablicę ciągów. Objaśnienie: domyślnie wypisuje jawne dane wejściowe, podczas gdy ¿⁰jest warunkowy, a 0jako warunek, który dlatego zawsze jest fałszywy. «następnie uruchamia blok bezsensownego kodu Charcoal, który nigdy nie zostanie wykonany. (Może być możliwe usunięcie niektórych z tych bajtów, ale w takim przypadku nie jestem pewien, czy Charcoal poprawnie przeanalizuje program). Transponowane, 17 bajtów:

A‖↗¿⁰«
¿⁰⁰⁰¿
⁰¿
«

Wypróbuj online! Objaśnienie: Podobnie jak w poprzednim programie, z wyjątkiem dodania polecenia transpozycji ‖↗.

Mam alternatywne rozwiązanie, w którym zarówno oryginalny, jak i transponowany program ma 18 bajtów:

A⊞υ”y
‖υ⁺y
↗⁺
⊞⁺
υ

Wypróbuj online! Objaśnienie: jak wyżej; ⊞υwypycha wartość do predefiniowanej pustej listy (co nie wpływa na dane wyjściowe); ”yrozpoczyna dowolny ciąg znaków (kończy się na końcu programu lub dopasowania ). Transponowano:

A‖↗⊞υ
⊞υ⁺⁺
υ⁺
”y
y

Wypróbuj online! Objaśnienie: A‖↗jak wyżej; ⊞υjak wyżej; niewielką różnicą tutaj jest to, że pcham konkatenacje mniejszych ciągów, ponieważ nie chcę powtarzać .

Neil
źródło
3

Brain-Flak (BrainHack) , 382 375 337 bajtów

Bez komentarza!

  ( <( <>)<> ><>) ({})  {}{}   {( )()<({}<{}<><>>{}<><>{}) ( <>) ({}<><( [ ]({}<{}( )<({}()<{}<><>>){} ><><{}<< ><> ( [ ]( <>)<>)>{}<>>>)){}>)> ( ){ {}[]} <>[]{
(({}({}  ( ))   <>( ))[( [ ])])({}[ ] [ ](   )  (   ) < ><>{}  <>(   ){{}()<( )( ({} {  [ ](   )   } <>)  (  (())  {{}()<{}    >}  )  ) >}    )}[] {} ( ){} ( ){}({}<>)<>([])}<>

Wypróbuj online!

Dla danych wejściowych pierwsze dwie liczby oznaczają wymiary macierzy, a pozostała część to zawartość macierzy. Dane wyjściowe są podawane w tym samym formacie.

Transponowane

Brain-Flak (BrainHack) , 465 bajtów

 (
 (
({
 }
<(
({
 }
<
>
)(
<
>)
 )
>
<
>
)<
 >
((
{
})
))
 [
 (
{
}[
{
}]
 )
 ]
 )
{(
({
 }
)[
(
)]
<
([
{
}]
<( 
{
}
<
>)
<
>
>(
{
}
<
>)
<
><
{
}>
)<
 >
({
 }
<
>
)<
 >
((
{
}
<
>)
<{
({
 }
[(
 )
]<
((
{
})
<(
{
}(
({
 }
)
<{
(
{
}[
(
)]
<(
{
}
<
>)
<
>
> 
)}
{
}<
 >
>)
<
>
<(
{
}
<(
<(
 )
>)
<
>
 {
({
 }
[(
 )
]<
({
 }
<
>
)
<
>>
)}
>
{
})
<
>
>)
>
)>
)}
{
}
>
)
>)
 }
([
 ]
)
{{
 }
{
}(
[
])
}{
 }
<
>(
[
])
{{
 }
 (
 {
 }
 <
 >
 )
 <
 >
 (
 [
 ]
 )
 }
 <
 >

Wypróbuj online!

Kreator pszenicy
źródło
3

Japt , 2 bajty

ÕU

Wypróbuj | Transponowane

ÕU     :Implicit input of string/array U
Õ      :Transpose U
 U     :Original U
       :Implicit output
Õ\nU     :Implicit input of string/array U
Õ        :Transpose U
 \n      :Reassign to U
   U     :Newly transposed U
         :Implicit output
Kudłaty
źródło
2

Haskell ,153 144 bajty

(dzięki, Sriotchilism O'Zaic )

f
 [
 ]=
   [
   ];
    f(
     x:
      l)
       =(
        :)
         x l
-- :   z $
-- f   i f
-- [   p
-- ]   W
--     i
--     t
--     h

Wypróbuj online!

Spróbuj transponować!

przestał się obracać w lewo
źródło
Oto wersja 144-bajtowa z zachowaniem struktury. ( Transponowane ).
Wheat Wizard
Oto 70-bajtowa wersja, która jest nadal podobna, ale z pewnymi zmianami strukturalnymi. ( Transponowane ).
Wheat Wizard
Dzięki. Druga wersja nie ma jednak głównej idei (ponowne użycie foldrrekurencji dla obu wersji), nie podoba mi się to.
przestał obracać przeciwny
Wiesz, to wyzwanie i twoja nazwa użytkownika są ze sobą sprzeczne, ponieważ w tej transponowanej wersji Twój kod zmienił się w lewo. ; p
Kevin Cruijssen
2

APL (Dyalog Unicode) , 7 bajtów

{⍵

⍵}

Wypróbuj online!

Transponowano:

{⍉⍵
 }

Prawdopodobnie dość nudna odpowiedź, ale i tak tu jest.

Definicja funkcji wbudowanej {...}może obejmować wiele linii. W takim przypadku każda linia jest wykonywana sekwencyjnie, ale każda linia bez przypisania natychmiast zwraca obliczoną wartość. Tak więc pierwsza funkcja powraca, a druga wraca ⍉⍵.

Jeszcze bardziej nudną odpowiedzią byłoby nadużycie komentarza:

APL (Dyalog Unicode) , 4 bajty

⍝⍉

Chyba nie jest potrzebne TIO ...

Bubbler
źródło
1

05AB1E , 3 bajty

øø
q

Wypróbuj online.

øq
ø

Spróbuj transponować.

Wyjaśnienie:

W przeciwieństwie do niektórych innych języków, znaki nowego wiersza są po prostu ignorowane w 05AB1E, więc nie sądzę, że 2-bajtowe jest możliwe (chociaż chciałbym, aby udowodniono, że się mylę).

ø    # Transpose the (implicit) input
 ø   # Transpose it back
  q  # Stop the program (and output the top of the stack implicitly as result)

ø    # Transpose the (implicit) input
 q   # Stop the program (and output the top of the stack implicitly as result)
  ø  # No-op, since the program has already stopped
Kevin Cruijssen
źródło
1

Rubin , 35 bajtów

#-sz##
->hip{
 hip  }
#{f
#ht*
#..h

Wypróbuj online!

Biodro ma być kwadratowe! (Prawie)

Akceptuje ruby ​​macierzy jako dane wejściowe (tablice tablic)

GB
źródło
0

Python 3 , 118 95 bajtów

Dane wejściowe i wynikowe to listy krotek.

f=lambda i:i;"""
=              "
l              "
a
m
b
d
a

i
:
[
*
z
i
p
(
*
i
)
]
;
"
"
"""

Wypróbuj online!

Nishioka
źródło
0

Cjam , 13 bajtów

qo
~
z
`

Wypróbuj online!

Wersja transponowana:

q~z`
o

Wypróbuj online!

Format wejściowy

Format wejściowy to standardowy format macierzy CJam: [[1 2] [3 4]]

Wersja bez awarii, 12 bajtów

Normalna wersja ulega awarii po wydrukowaniu tablicy. Wersja, która nie ulega awarii to:

qo{
~
z
` };

Wypróbuj online!

lub transponowane:

q~z`
o
{  };

Wypróbuj online!

Prawdopodobnie jest kilka dodatkowych bajtów, które można zapisać, przypadkowo najpierw pracowałem nad transponowaną wersją, co doprowadziło do kilku dodatkowych podziałów linii i minęło dużo czasu, odkąd ostatnio użyłem CJam. Wszelkie ulepszenia są mile widziane.

Roman Gräf
źródło
0

Zsh , 75 bajtów

  <<<${(F)@}
fa<
o[<
r+$
 +{
si(
;]F
i+)
==a
&$}
&s
r[
ei
p+
e1
a]
t

$
#
s

TIO: normalna transponowana

Śmieci pod głównym drukiem są nieszkodliwe, drukuje błąd przy napotkaniu nowej linii po fa<i wychodzi. 86 bajtów, aby usunąć ten błąd.

Wersja transponowana jest tutaj. Po wydrukowaniu wyświetla błąd na <końcu linii i kończy działanie.

 for s;i=&&repeat $#s
 a[++i]+=$s[i+1]
<<<${(F)a}
<
<
$
{
(
F
)
@
}
Funkcja Gamma
źródło
0

Runiczne Zaklęcia , 88 bajtów

vrlril1-{)?\:',=4*?~r0[
i! '${U [0r/?*7̸0l{$
$ka6 ̹\!$,'/;? =  ̹
'              ̸

$

Wypróbuj online!
Spróbuj transponować!

Dane wejściowe są oddzielone spacjami dla każdej wartości i oddzielone przecinkami dla każdego wiersza (znaki nowej linii są opcjonalne) i obsługuje zarówno ciągi, jak i (niezerowe) liczby. Ułatwia to analizowanie danych wejściowych, ponieważ dane wejściowe są automatycznie przerywane spacjami i znakami nowej linii. Na przykład dane wejściowe:

1 2 3 , 4 5 6 , 7 8 9

Byłby reprezentowany w formie zagnieżdżonej tablicy jako [[1,2,3],[4,5,6],[7,8,9]]. Minimalna obsługa tablic poszarpanych (tylko ostatnia może być krótka), ale ponieważ dane wejściowe powinny być prostokątne, spełnia to wymaganie.

Dane wyjściowe są reprezentowane w tym samym formacie (wersja transponowana wyświetla znaki nowej linii, ale bajty zerowe różnią się od siebie, aby zamiast tego użyć spacji). Wersja normalna ma spację końcową, wersja transponowana ma przecinek końcowy i znak nowej linii (z powodu trudności z określeniem, kiedy nie ma już danych do wydrukowania).

Normalna wersja ma znaki modyfikujące w dziwnych miejscach (np. 7̸0), Ale wynika to z potrzeby ich umieszczenia we właściwym miejscu, gdy źródło jest transponowane, a normalne wykonanie wykorzystuje tylko lewą kolumnę instrukcji.

Wyjaśnienie

Wyjaśnienie transponowanego źródła będzie miało formę bez transpozycji. Strzałki będą reprezentować kierunkowość IP na wejściu i wyjściu z różnych bloków.

→rlril1-{)?\:',≠4*?~r0[    Initial position. Read and parse input.
           ↓               Input loop exit and direction

Dane wejściowe są odczytywane, a po ,znalezieniu znaku wypychana jest nowa podstacja. Dzięki temu każdy stos może przechowywać każdy wiersz osobno w pamięci. Przechodzi do następnej sekcji od góry.

           ↓
.. '${̹L [0r/?*7≠0l{̹$       When no more input:
      ↑    ↓

[0(wykonywane w lewo) ustawia pusty stos, który działa jak granica między pierwszym rzędem a ostatnim rzędem, a następnie obraca się do pierwszego stosu ( ) i rozpoczyna drukowanie elementów i obracanie stosów. Nie i!jest wykonywany i {̹L [0rjest wykonywany tylko raz. Gdy zostanie znaleziony stos o zerowym rozmiarze, pętla kończy się.

      ↑    ↓
$ka6  \!$,'/;?             Row separation formatting

Po znalezieniu pustego stosu ,drukowane są znaki ai nowa linia, a pętla wartości jest ponownie wprowadzana. Kolejność wykonywania (dublowane dla czytelności) gdzie .jest komenda un-stracony: \',$!.6ak$?....../. Zmiana akna '<space>wypisuje spacje zamiast nowego wiersza.

Wykonanie zatrzymuje się, gdy program próbuje pisać z pustego stosu; dlatego tylko jagginess w ostatnim rzędzie działa poprawnie i dlaczego ,na wyjściu występuje ciąg : przecinek został już wydrukowany, zanim program dowie się, że nie ma już żadnych danych.

Draco18s
źródło