EDYCJA Zmodyfikowałem sformułowanie zasad, aby niektóre rzeczy, które były ukryte, były bardziej wyraźne. Położyłem też nacisk na wyjaśnienie niektórych punktów pozornego zamieszania i wyraźnie zdefiniowałem opcję tworzenia samodzielnego programu zamiast funkcji.
Celem jest tutaj utworzenie funkcji, która pobierze plik tekstowy (lub ciąg znaków) i przetransponuje go, tak aby linie stały się kolumnami i odwrotnie.
Przykład:
Jestem SMS-em Transponuj mnie. Możesz to zrobić?
Prowadzi do:
ITC ra aan mn sy apo ou ts eed xo tm .ei .t ?
Zasady:
- Masz prawo przypuszczać, że tylko białych znaków stosowane są
" "
i"\n"
i że nie ma końcowe białe znaki na każdej linii. - Możesz założyć, że plik to ASCII. Który znacznik linii końcowej, którego chcesz użyć, zależy od Ciebie (CRLF lub LF). Musi działać poprawnie na przykładzie, ale powinien również działać na każdym wejściu, który spełnia powyższe założenia.
- Być może będziesz musiał wstawić spacje (jak w przykładzie) tam, gdzie ich nie było, aby utrzymać kolumny w linii.
- Twój wynik nie może zawierać końcowych białych znaków w żadnej linii .
- Ostatni znak nowej linii (dla ostatniego wiersza) jest opcjonalny.
- Powinna to być funkcja lub pełny program. Jeśli twoja funkcja akceptuje ciąg, powinien zwrócić wyniki jako ciąg. Jeśli akceptuje nazwę pliku, zwracana jest nazwa pliku, w którym zapisano wynik. Dodatkowo możesz napisać pełny program, który akceptuje dane wejściowe ze STDIN i wypisuje poprawny wynik do STDOUT; jeśli to zrobisz, musisz nie wyjście coś na stderr.
- Najkrótsza procedura wygrywa, ale będę głosować za każdą odpowiedzią, którą lubię.
W oparciu o reguły dane wyjściowe w tym przykładzie mają długość 53 lub 52 bajty (dla nowych linii LF) w zależności od tego, czy dołączony jest końcowy nowy wiersz, czy nie.
Uwaga: Nie jest to szczególne wymaganie, ale jeśli twoja funkcja, gdy uruchomisz ją dwa razy z rzędu, nie jest identyczna z oryginalną (końcowa nowa linia może być inna, a puste linie na końcu pliku zostaną usunięte), oznacza to, że prawdopodobnie złamanie jednej z zasad.
Odpowiedzi:
Japt , 6 bajtów
Spróbuj
Uruchom go dwa razy - zwraca oryginalny ciąg
Wyjaśnienie
Transponuj dane wejściowe
Mapa nad każdą linią
Przytnij w prawo
źródło
J (
3140)Jest to funkcja, która pobiera ciąg znaków i zwraca ciąg znaków (tj. Wektor znakowy z liniami wstawionymi w odpowiednich miejscach, a nie macierz).
Edycja: brak spacji końcowych w żadnej linii.
Test:
źródło
?\n
.cut
lubdlb
domyślnie, a ich pisanie zajmuje kilka znaków nawet w APL.Ruby 111
Gra w golfa:
Nie golfowany:
Ruby ma funkcję transpozycji tablicy, więc po prostu uzupełnia linie, zamienia je w tablicę znaków, używa funkcji transpozycji tablicy Ruby, a następnie zamienia tablicę znaków z powrotem w linie.
Gra w golfa polegała po prostu na użyciu jednoznakowych identyfikatorów, usuwaniu spacji, używaniu tymczasowego dla text.lines i wstawianiu obliczeń dla max_length inline (nie ma punktów za wydajność).
źródło
"\n"
ją?\n
..to_a
jest zbędny. Możesz tam zdobyć kolejne 5 postaci.R 171
Przykład użycia:
Końcowe białe znaki są usuwane.
źródło
Python 2.7 (
97799490)EDYCJA: pominięto wymaganie funkcji;
Jestem całkiem pewien, że to się poprawi, ponieważ jestem tu trochę początkującym, ale na początek;
Kod wykorzystuje prosty
split
do podzielenia łańcucha na wektor wierszy. Następnie używamap
z wartością funkcji asNone
(funkcja jedności) i operatorem splat do transponowania izip_longest
wypełnienia wektora (podobna funkcjonalność jak w Python3)Reszta kodu po prostu odwzorowuje
None
przestrzeń, przycina i ponownie składa matrycę w pojedynczy ciąg znaków.źródło
map
. Ciągle szukam miejsca, w którym mógłbym z tego skorzystać ... a ty mnie po prostu pobiłeś. ;)Bash + coreutils + sed, 83
fold
ipaste
wykonuj ważną pracę. Reszta to tylko formatowanie.Akceptuje dane wejściowe ze standardowego wejścia i wyjścia na standardowe wyjście:
źródło
C (278 bajtów)
Edycja: To faktycznie łamie reguły, ponieważ bierze nazwę pliku jako argument, ale zapisuje na standardowe wyjście. Przeredaguję go później, aby zapisać do pliku, a następnie wydrukuję nazwę pliku na standardowe wyjście.
To jest mój pierwszy golf w historii, więc zmiłuj się. Niektóre zwykłe stare C. Umieść dane wejściowe
test.txt
i pozwól, aby się uruchomiły!clang transpose.c -o transpose && ./transpose test.txt
Używając krótkich nazw zmiennych, usuwając nieuzasadnione formatowanie i pozwalając na wyciekanie uchwytów plików oraz wyłączając wszystkie ostrzeżenia, zmniejsza się to do 278 bajtów. (Ponieważ używa to niejawnego importu, może nie działać poprawnie na wszystkich systemach. Działa na moim komputerze!)
źródło
int
skrócenia niektórych swoich deklaracji, czy jest to teraz nielegalne?A,B,D,I,J,*F
jako zmienne globalne, aby uniknąćint
słowa kluczowego. Podobnie możesz usunąćint
zmain
deklaracji iC
argumentów. WC
,int
jest opcjonalne w wielu miejscach.AutoHotkey 210
Test
źródło
Ruby: 88 znaków
(Wysłano, ponieważ jest krótsze niż inne rozwiązania Ruby. Nie sprawdziłem, czy mój kod wprowadza coś nowego w porównaniu do tych. Jeśli już opublikowałeś rozwiązanie Ruby i uważasz, że jest to w większości Twoja kopia, proszę o komentarz, a ja wycofam swoją odpowiedź. )
Przykładowy przebieg:
źródło
Bash, 124 bajty
Odczytuje standardowe wejście i zapisuje standardowe wyjście. Spróbuj:
Jak to działa:
split
wejście do pojedynczych wierszy (pliki w katalogu tymczasowym$D
)grep
(pliki * +)paste
(kolumny rozdzielone tabulatorami)sed
Edytować:
;rm -r $D
(dzięki Tim)+
zamiast_
sufiksu i skróć${F}_
do$F+
L
z podzielonych plików wynikówźródło
rm
z liczby postaci.Rubin - 144 znaków
Oto moja pierwsza próba gry w golfa:
Aby uzyskać wynik, uruchom
puts f text
gdzietext
jest dowolny ciąg wielu wierszy zgodny z powyższymi regułami. Wersja bez golfa znajduje się poniżej:Aby znaleźć podobne, ale ostatecznie lepsze rozwiązanie w Ruby, sprawdź powyższy kod Wayne'a Conrada.
źródło
transpose
twojej odpowiedzi, zanim napisałem swoją. Nie wydaje mi się dość koszerne, że zasadniczo przepisałem twoją odpowiedź, tylko trochę lepiej. :(transpose
, możliwe jest, że lepsze rozwiązanie Ruby by się nie ujawniło. Jedną z rzeczy, które najbardziej lubię w programowaniu, jest chęć współpracy i zapylanie pomysłów. Aż się znów spotkamy, miły panie. Twoje zdrowie!PHP 194
Nie golfa:
To moja pierwsza gra w golfa, więc proszę bądź miły! Również wskazówki / sugestie będą mile widziane!
źródło
"
wokół nich"trim"
. php wyświetli ostrzeżenie, ale działa dobrze.@
aby ukryć ostrzeżenia.MATHEMATICA 117 znaków
źródło
f
! .. tksPerl (92 + 1)
czyta standardowe wejście i pisze na standardowe wyjście. dodanie 1 do wyniku dla
say
źródło
CJam,
3225 bajtówCJam jest nowszy niż to wyzwanie, więc ta odpowiedź nie kwalifikuje się do zaakceptowania.
Znacząco skrócony przez user23013.
Sprawdź to tutaj.
źródło
JavaScript, 103
Mniej golfa
Test
źródło
Siatkówka , 40 bajtów
Wypróbuj online!
Na podstawie tego programu, który stworzyłem do transponowania dowolnego rozmiaru prostokąta, który wykorzystuje sugestię Leo do transponowania prostokąta o znanym rozmiarze.
Edycja: więcej gra w golfa i nie ma już spacji na liniach.
źródło
Perl 5 , 25 bajtów
Zauważ, że wykorzystuje to sekwencje specjalne ANSI i jako takie nie działa na TIO, możesz jednak zobaczyć to tutaj .
Wyjaśnienie
Ten kod najpierw zmienia wartość separatora listy (
$"
) na tabulator pionowy, a następnie sekwencję zmiany znaczenia ANSI dla „cofnij się o 1 kolumnę” (\x1b[1D
), a następnie ustawiamy domyślnie drukowaną zmienną$_
na ciąg znaków rozpoczynający się sekwencją zmiany znaczenia ANSI dla „rozpocznij drukowanie w kolumnie 1 wiersza$.
(gdzie$.
jest bieżący wiersz tekstu)” (\x1b1;$.H
) i interpoluje listę@F
(która jest listą wszystkich znaków w tym wierszu, wypełnioną przez autosplit (-a
) z pustym wzorem podziału (-F
)) który umieszcza zawartość$"
pomiędzy poszczególnymi elementami, przesuwając kursor pionowo w dół zamiast kontynuować wyświetlanie po poprzednim znaku.Wypróbuj online!
źródło
C ++ (243 znaki)
Oto funkcja, która pobiera i zwraca ciąg znaków.
Mógłbym ogolić kilkadziesiąt znaków, ale postanowiłem zachować go jako niezbyt głupi kod (działa szybko, czyta się dobrze). Może postanowiłem to zrobić, ponieważ to mój pierwszy golf w golfa ... Nie jestem jeszcze wystarczająco hardkorowy :)
Z formatowaniem:
źródło
using namespace std;
.using namespace std;
powinien zostać dodany do liczby postaci.Python 2.7 - 115 znaków :
oneliner:
i w czystszym druku:
w 115 znakach:
źródło
\n
jest uważany zalen
jeden znak, ale to dwa :)\n
jest jeden. Więc mówię, że jeden jest w porządku.len("\n")
pokaże 1, chociaż z pewnością są to 2 osobne znaki w kodzie źródłowym. Zapisanie źródła do pliku spowodujels
wyświetlenie 116. Samo powiedzenie, żelen
nie jest to najlepszy sposób na zmierzenie rozmiaru kodu ze względu na przetwarzanie znaków ucieczki przetwarzanych przed pomiarem :)GolfScript, 51 znaków
To jest pierwsza próba; Podejrzewam, że można to poprawić. Większość kodu ma być zgodna z wymogami wypełniania i usuwania spacji końcowych - bez nich
n%zip n*
wystarczyłoby.Ps. Następująca 46- znakowa wersja wykona zadanie dla danych wejściowych próbki, ale zawiesi się, jeśli dowolna kolumna wejściowa składa się całkowicie ze spacji:
Zakładam, że to wystarczy, aby go zdyskwalifikować, nawet jeśli wyzwanie nie mówi wprost.
źródło
Schemat / Rakieta 113
Tekst:
Bez nowych linii i dodatkowych białych znaków:
Wersja przyjazna dla użytkownika
źródło
Haskell
Było tak krótko, że musiałem dodać białe znaki ...
źródło
I am a text..?
Transpose met
Can you do i
.Python
89103 znakówCzuję się brudny
90104 znaków dla wersji o wytrzymałości przemysłowej. : ^)źródło
Mathematica, 95 znaków
źródło
K, 56
To powinno teraz spełniać specyfikację.
Akceptuje ciąg, zwraca ciąg.
.
źródło
{`/:x@'/:!max@#:'x:`\:x}
dla 26.Groovy, 98 znaków
online
bez golfa:
źródło
Pyth , 11 bajtów
Wypróbuj online!
Pobiera dane wejściowe jako ciąg znaków, wyświetla listę list
Pyth , 25 bajtów
Pobiera dane wejściowe jako ciąg, generuje ciąg.
Wypróbuj online!
źródło
J,
2826 bajtówOszczędność 2 bajtów dzięki frownyfrog
Bierze ciąg, zwraca ciąg. Nie jestem pewien, czy istnieje krótsza wersja czasownika
funkcyjnego„cutopen” , której mogłabym użyć.Jest też krótszy
Ale nie jestem pewien, czy spełnia on wytyczne PO, ponieważ zwraca tablicę znaków.
Jak to działa:
Druga wersja działa tak samo, ale nie konwertuje transponowanej tablicy na poprawnie sformatowany ciąg.
Przykłady:
źródło
cutLF
.0|:>@cutLF
Lua ,
203189 bajtówWypróbuj online!
Widziałem tutaj inne rozwiązanie Lua, ale nie sądzę, że jest problem z opublikowaniem 2 rozwiązań w tym samym języku. Jeśli tak, powiedz mi :)
źródło