Eksportuj zmienną $ PATH, linia po linii

22

Inspirowane tym pytaniem na AskUbuntu.

Twoja praca jest niezwykle prosta. Weź zmienną środowiskową PATH ( echo $PATH) i wyeksportuj ją tak, aby każdy wpis (oddzielony :znakiem) znajdował się w osobnym wierszu.

Na przykład, jeśli PATH jest /bin:/usr/bin:/usr/local/bin, twój program powinien wypisać:

/bin
/usr/bin
/usr/local/bin

Twój program może nie zwracać wiodącej nowej linii, ale może zwrócić jedną końcową nową linię. Nie musisz sprawdzać, czy ŚCIEŻKA ma rację, czy katalog istnieje. Twój program nie powinien pobierać żadnych danych wejściowych, co oznacza, że ​​twój program jest odpowiedzialny za uzyskanie ŚCIEŻKI. Możesz bezpiecznie założyć, że obiekty w ŚCIEŻCE nie zawierają :ani nowych linii. Jednak spacje są uczciwe.

Implementacje referencyjne są obecne w odpowiedziach na powyższe pytanie.

Zasady

  • To jest (oczywiście) golfowy kod, więc najkrótsza odpowiedź wygra ceniony zielony znacznik wyboru.
  • Przyjęta odpowiedź zostanie przetestowana, aby upewnić się, że jest prawdziwa.
  • Wpisy Windows i * nix są akceptowane.
    • Jeśli jednak nie określisz wyraźnie systemu Windows, spróbuję uruchomić go w systemie Linux i nie powiedzie się. (Jeśli to oczywiste (cześć, Batch!), Nie trzeba tego jawnie określać.)
  • Tylko jedno rozwiązanie na odpowiedź. Jeśli masz zarówno wersję Windows, jak i * nix, policzę krótszą.
  • Jeśli dwie odpowiedzi mają taką samą długość, dam pierwszeństwo tej z wyższą liczbą głosów. Jeśli mają taką samą liczbę głosów, policzę starszą. Jeśli opublikowany czas jest taki sam, wybiorę ten, który działa szybciej. Jeśli wykonają w tym samym czasie, nie wiem.

Tabela liderów

Kaz Wolfe
źródło
Ahh! Trudno było odwiedzić pytanie AskUbuntu bez podania wskazówek dotyczących gry w golfa.
Roman Gräf
Niektóre odpowiedzi (powłoki) wydają się zakładać, że ścieżka nie zawiera spacji. Czy powinny zostać poprawione?
Dennis
@Dennis Zazwyczaj zmienna ścieżki nie powinna mieć spacji, ale jak mogą, należy je poprawić. Możemy jednak bezpiecznie założyć, że same ścieżki nie będą zawierać: ani nowego wiersza.
Kaz Wolfe
Czy funkcja jest akceptowalna?
corvus_192
@ corvus_192 O ile wyzwanie wyraźnie nie stanowi inaczej, funkcje są dozwolone.
Dennis

Odpowiedzi:

12

Powłoka Z (zsh), 13 bajtów

<<<${(F)path}

Używa $pathparametru , który jest specjalnym parametrem tablicowym używanym przez powłokę powiązaną z $PATHparametrem, oraz flagą rozszerzenia parametru, aby dołączyć tablicę z nowymi liniami.

Miles
źródło
3
Najwyraźniej po prostu nie gra się w golfa w Dennis ... Huh.
wizzwizz4
Jak zamienić na to słowo? Próbowałem, alias path="<<<${(F)path}"ale po wykonaniu drukuje, /usr/local/bin zsh: no such file or directory: /Library/Apple/usr/bin zsh: no such file or directory: /Library/Apple/bina następnie idzie dosbin
Daniel Springer
Ścieżka @DanielSpringer $ jest rozwijana podczas definiowania aliasu, czego nie chcesz. Zamiast tego użyj pojedynczych cudzysłowów:alias path='<<<${(F)path}'
GammaFunction
@GammaFunction, która działała! Dlaczego podwójne cudzysłowy nie działały?
Daniel Springer,
@DanielSpringe Nie za dużo miejsca, żeby wyjaśnić, oto wklejarka: ix.io/1RyW
GammaFunction
13

Bash / Coreutils, 17 16 bajtów

tr : '
'<<<$PATH
Sergiy Kolodyazhnyy
źródło
tr : '\n'<<<$PATHpowinien również działać
Arnauld
To robi . . . edycja w tej chwili
Sergiy Kolodyazhnyy
Myślę, że możesz również usunąć spacje wokół <<<(testowane tylko na Ubuntu)
Arnauld
@Arnauld nie sądzę, że to jest Ubuntu, to jest bash, więc powinno działać w różnych dystrybucjach
Sergiy Kolodyazhnyy
6
Nie zapisuje żadnych bajtów, ale użycie \\nzamiast cytowanej zmiennej jest bardziej czytelne imho.
Dennis
10

Partia, 41 bajtów

@for %%a in ("%PATH:;=";"%")do @echo %%~a

PATHjest oczywiście rozdzielany średnikami w systemie Windows. Dogodnie, fordomyślnie dzieli się na średniki, ale niewygodnie, także na spacje, więc muszę użyć sztuczki zastępowania łańcucha, aby zacytować każdy element ścieżki przed podziałem. Następnie pozostaje usunąć cytaty.

Neil
źródło
1
Uruchomiony z wiersza poleceń można zastąpić %%z %oszczędności 2 bajty.
DavidPostill
@DavidPostill Czy to nie byłby fragment kodu, a nie program?
Neil,
Nie jestem pewien, jakie są dokładne zasady gry w golfa, ale czy większość innych odpowiedzi nie jest tylko fragmentami? Większość z nich wymaga „powłoki” jakiegoś opisu do uruchomienia ...
DavidPostill
9

Powłoka Z (zsh), 15 bajtów

<<<${PATH//:/
}

Możesz przetestować kod na Anarchy Golf : kliknij użyj formularza , wybierz zsh , wklej kod i prześlij.

Bash (czysty), 19 bajtów

echo "${PATH//:/
}"

Ten sam pomysł, ale z mniej golfową składnią Basha. Przetestuj na Ideone .

Dennis
źródło
6

PowerShell, 20 bajtów

$env:PATH-split':'

Edytować:

  • -2 bajty wyłączone. Dzięki @TimmyD

Stary:

$env:PATH.split(":")
Roman Gräf
źródło
5

Rubin, 25 bajtów

puts ENV["PATH"].split":"
Anwar
źródło
Ładne, nieco krótsze niż moja odpowiedź na oryginalne pytanie AskUbuntu
Sergiy Kolodyazhnyy
Nie musisz liczyć wywołania Ruby, tylko sam program, więc jest to tylko 26 bajtów.
Jordan
@Jordan tego nie wiedział. Czy to jest w FAQ?
Anwar,
@Jordan Jest pokazany na samej trasie. Więc edytowane. Dziękuję, że to powiedziałeś
Anwar,
1
Oh, również można zmieniać split ":"do split":"lub split ?:przez 1 bajt.
Jordan
4

Perl, 22 bajty

say$ENV{PATH}=~y/:/
/r

Potrzebuje -Elub -M5.010uruchomić:

perl -E 'say$ENV{PATH}=~y/:/
/r'
Dada
źródło
3

Bash + Python, 43 bajty

Użyjmy zmiennego rozszerzenia powłoki. Eliminuje to dzwonienie os.environ, a tym samym mniej kodu i mniej importów. To daje nam 46 bajtów, a wraz ze xnorsztuczką i usunięciem przestrzeni, zanim -cbędziemy mieli 43 bajty.

python -c"print('$PATH'.replace(*':\n'))"
Sergiy Kolodyazhnyy
źródło
Zauważ, że to się nie powiedzie, jeśli w ścieżce pojawi się katalog z pojedynczym cudzysłowiem lub ukośnikiem odwrotnym.
Joey Marianer
@JoeyMarianer Ponieważ w nazwie pliku / ścieżki może znajdować się prawie dowolny znak, więc tak - może się to nie powieść, ponieważ PATH rozwinie się do '/ dir'1: / dir2', co daje pythonowi niepoprawnie sformatowane polecenie. Odwrotny ukośnik niekoniecznie zawiedzie - po prostu interpretuje to, co jest w samym ciągu. IMHO, znaki odwrotnego ukośnika nie powinny pojawiać się w nazwach ścieżek normalnych użytkowników, więc w 99% przypadków jest to OK. Zgadzam się jednak - należy o tym pamiętać za każdym razem, gdy masz do czynienia z powłoką bezpośrednio lub pośrednio, jak w tym przypadku
Sergiy Kolodyazhnyy,
3

Java, 58 bajtów

System.out.print(System.getenv("Path").replace(';','\n'));

Pełny program: 106 bajtów

class E {
    public static void main (String[] args) {
        System.out.print(System.getenv("Path").replace(';', '\n'));
    }
}
NoddySevens
źródło
3

GNU sed+ bash, 25 bajtów:

sed 's/:/\n/g' <<<"$PATH"

Jeśli PATHnie zawiera nazwy katalogu z białymi znakami, nie ma potrzeby cytowania, 23 bajty:

sed 's/:/\n/g' <<<$PATH

Jeszcze krótszy, transliterujący :do nowej linii, dzięki @Dennis :

sed y/:/\\n/<<<"$PATH"
heemayl
źródło
3

Vim, 19 bajtów

"=$PATH<CR>p:s/:/\r/g<CR>

Chwyć $PATHz rejestru wyrażeń i wklej go. Zamień :s w nowe linie. Nic trudnego.

udioica
źródło
Powinni umieścić to w samouczkach Vima. Jako ktoś czytający o tym, jak dostać się do Vima, doceniam ten przykład.
loa_in_
2

PHP, 36 35 33 32 bajty

Zapisano 1 bajt, dzięki Blackhole
Zapisano 2 bajty, dzięki user59178
zapisano 1 bajt, dzięki Martijn

* wersja nix

<?=strtr(getenv(PATH),":","
")?>

Wersja Windows

<?=strtr(getenv(PATH),";","
")?>
Arnauld
źródło
1
@ RomanGräf *nixto tylko sposób odwoływania się do systemu uniksopodobnego .
Arnauld
1
Jeśli chcesz mieć wersję „wieloplatformową”, możesz użyć stałejPATH_SEPARATOR
Ismael Miguel
1
Nie używaj \n, ale prawdziwa nowa linia zamiast tego zaoszczędzi ci jeden bajt.
Blackhole
1
można również upuść "S dookoła PATH. Pojawia się komunikat „użycie niezdefiniowanej stałej”, ale nadal działa, oszczędzając 2 bajty.
user59178,
1
Korzystanie z krótkiego echa <?=strtr(getenv(PATH),":","")?>skraca bajt (* nie mogę wstawić nowej linii w komentarzach)
Martijn,
2

Python 2, 49 bajtów

Zapisywanie 2 bajty dzięki @xnor i 1 bajt, zastępując environprzy getenvdzięki @Serg i @Oliver

import os
print os.getenv('PATH').replace(*':\n')

Dla Pythona 3, po prostu dodaj (i )wokół printargumentu i dodać 1 do liczby bajtów.

Karl Napf
źródło
W jaki sposób uzyska to wkład?
Anwar,
2
@Anwar z os.environ ['PATH'], który zwróci ciąg
Sergiy Kolodyazhnyy
1
@Serg ah. Rozumiem.
Anwar,
2
replacemoże przyjmować spakowane argumenty replace(*':\n').
xnor
3
@KarlNapf Tak, o to chodzi. Ten program w stanie „jak jest” nie działa w Pythonie 3, dlatego powinieneś określić wersję, z którą współpracuje.
Denker
2

C, 85 84 bajtów

-1 bajt do użycia #import

#import<stdlib.h>
main(){char*a=getenv("PATH");while(*a)putchar(*a++==58?10:a[-1]);}
Karl Napf
źródło
1

Rakieta 39 bajtów

Za pomocą komendy sed @ heemayl:

(system "sed 's/:/\\n/g' <<<\"$PATH\"")

Nie golfowany:

(define (f)
  (system "sed 's/:/\\n/g' <<<\"$PATH\"")
)

Testowanie:
(f)

Wydajność:

/usr/local/bin
/usr/bin
/bin
/usr/games
/usr/lib/java/bin
/usr/lib/java/jre/bin
#t
rnso
źródło
1

Scala, 31 bajtów

sys env "PATH"replace(':','\n')

W scala a b cjest cukrem syntaktycznym a.b(c), więc się kompilujesys.env("PATH").replace(':','\n')

corvus_192
źródło
1

Perl 6 ,  28 25  24 bajtów

%*ENV<PATH>.split(':')».put
put %*ENV<PATH>~~tr/:/\n/
put %*ENV<PATH>~~tr/:/
/
Brad Gilbert b2gills
źródło
1

C #, 64 bajty

x=>Environment.GetEnvironmentVariable("PATH").Replace(";","\n");

Anonimowa funkcja, która zwraca zmienną ścieżki, każdy katalog w osobnej linii. Zauważ, żex jest to tylko atrapa obiektu, aby zapisać 1 bajt zamiast go używać ().

Pełny program:

using System;

namespace ExportPathVariable
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<object,string>f= x=>Environment.GetEnvironmentVariable("PATH").Replace(";","\n");

            Console.WriteLine(f(0));
        }
    }
}

Działa również w systemach UNIX, jeśli zastąpi ;się :, zakładając bibliotek Mono są dostępne. Wypróbuj online ideone , .NET Fiddle zwraca wyjątek bezpieczeństwa.

Alternatywnie, pełny program w języku C #, który jest dość szczegółowy:


C #, 118 bajtów

using System;class P{static void Main(){Console.Write(Environment.GetEnvironmentVariable("PATH").Replace(";","\n"));}}
adrianmp
źródło
1

Haskell, 72 bajty

import System.Environment
m ':'='\n'
m x=x 
map m<$>getEnv"PATH">>=putStr

Kosztowny import i brak replacestandardowej biblioteki powoduje, że jest on dość długi.

nimi
źródło
na pewno m ':'...nie potrzebuje tej przestrzeni?
kot
1
@cat: spacja jest obowiązkowa, ponieważ 'jest poprawnym znakiem w identyfikatorach. Bez spacji zdefiniowalibyśmy funkcję o nazwie m'.
nimi
1

C (x86), 60 bajtów

f(){char*p=getenv("PATH");for(;*p;p++)putchar(*p-58?*p:10);}

Nie będzie to działać na platformach 64-bitowych bez dołączenia pliku stdlib.h , ponieważ getenv zwraca int (32 bity), podczas gdy wskaźniki char mają 64 bity.

Muszę jeszcze znaleźć online 32-bitowy kompilator C.

C (x86-64), 70 bajtów

f(){char*getenv(),*p=getenv("PATH");for(;*p;p++)putchar(*p-58?*p:10);}

Zamiast dołączać plik stdlib.h , deklarujemy getenv jako funkcję zwracającą wskaźnik char .

Przetestowałem to z gcc i clang na Linuksie; inne ustawienia mogą płakać krwią. Wypróbuj na Ideone .

Dennis
źródło
1

Współczynnik , 28 bajtów

dla osób lubiących uniks. Nie wiem, jak to zrobić w systemie Windows, ponieważ nie jestem w oknie systemu Windows.

"PATH"getenv ":" "\n"replace
kot
źródło
1

jq, 18 znaków

(16-znakowy kod + 2-znakowa opcja wiersza poleceń)

env.PATH/":"|.[]

Przykładowy przebieg:

bash-4.3$ PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'

bash-4.3$ jq -nr 'env.PATH/":"|.[]'
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
człowiek w pracy
źródło
1

Awk, 51 44 znaków

BEGIN{$0=ENVIRON["PATH"];gsub(":",RS);print}

Dzięki:

  • ninjalj za sugerowanie użycia gsub()zamiast manipulowania zmiennymi wbudowanymi (-7 znaków)

Typowym awksposobem byłoby ustawienie wbudowanych zmiennych, które wpływają na sposób awkautomatycznego manipulowania danymi:

BEGIN{FS=":";OFS=RS;$0=ENVIRON["PATH"];$1=$1;print}

Przykładowy przebieg:

bash-4.3$ PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'

bash-4.3$ awk 'BEGIN{FS=":";OFS=RS;$0=ENVIRON["PATH"];$1=$1;print}'
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
człowiek w pracy
źródło
Doh Masz rację, @ninjalj. Miałem skupić się na robieniu tego w awkspecyficzny sposób. Dziękuję Ci.
manatwork
0

Node.js, 36 bajtów

_=>process.env.PATH.split`:`.join`
`

Całkiem prosto.

Huntro
źródło
0

MATLAB, 34 bajty

disp(strrep(getenv('PATH'),58,10))

Oto demo online w Octave z niewielką modyfikacją, ponieważ strrepw oktawie drugie i trzecie dane wejściowe muszą być charzmienne, a nie wartości liczbowe.

Suever
źródło
0

Groovy, 43 bajtów

System.env['PATH'].replaceAll(":","\n")​​​​
Urna Magicznej Ośmiornicy
źródło
0

Gema, 36 znaków

\A=@subst{\\:=\\n;@getenv{PATH}}@end

Przykładowy przebieg:

bash-4.3$ PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'

bash-4.3$ gema '\A=@subst{\\:=\\n;@getenv{PATH}}@end'
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
człowiek w pracy
źródło
0

Odcisk cyfrowy Befunge-98 + EVAR, 34 bajty

"RAVE"4("HTAP"Gv
:!k@:':-!'0*-, >

Ładuje odcisk palca EVAR ( "RAVE"4() w celu łatwego dostępu do zmiennych środowiskowych, pobiera PATH envvar ( "HTAP"G) i dla każdego znaku wychodzi z programu, jeśli znak to „\ 0” ( :!k@), odejmuje ASCII 48 „0”, jeśli char to ASCII 58 „:” ( :':-!'0*-) i wyświetla znak ( ,).

ninjalj
źródło
0

ELF / x86, 78 bajtów

00000000  7f 45 4c 46 01 00 00 00  43 0f 00 00 43 5f eb 10  |.ELF....C...C_..|
00000010  02 00 03 00 0c 50 eb 10  0c 50 eb 10 04 00 00 00  |.....P...P......|
00000020  5f 5f b1 05 be 49 50 eb  10 3d 20 00 01 00 5f f3  |__...IP..= ..._.|
00000030  a6 75 ef 89 f9 80 3f 3a  75 03 80 2f 30 42 ae 75  |.u....?:u../0B.u|
00000040  f4 4a 04 04 cd 80 93 cd  80 50 41 54 48 3d        |.J.......PATH=|
0000004e

Źródło NASM:

BITS 32                                         ;
ORG 0x10eb5000                                  ;
                                                ;   ELF HEADER    --   PROGRAM HEADER
; ELF HEADER                                    ; +-------------+
DB 0x7f,'E','L','F'                             ; | magic       |    +--------------------+
                                                ; |             |    |                    |
; PROGRAM HEADERS                               ; |             |    |                    |
DD 1                                            ; |*class   32b | -- | type: PT_LOAD      |
                                                ; |*data   none |    |                    |
                                                ; |*version   0 |    |                    |
                                                ; |*ABI    SysV |    |                    |
DD 0xf43        ; offset = vaddr & (PAGE_SIZE-1); |*ABI vers    | -- | offset             |
                                                ; |             |    |                    |
entry:  inc     ebx     ; STDOUT_FILENO         ; |*PADx7       | -- | vaddr = 0x10eb5f43 |
        pop     edi     ; discard argc          ; |             |    |                    |
        jmp     short skip                      ; |             |    |                    |
DW 2                                            ; | ET_EXEC     | -- |*paddr LO           |
DW 3                                            ; | EM_386      | -- |*paddr HI           |
DD 0x10eb500c                                   ; |*version     | -- | filesz             |
DD 0x10eb500c                                   ; | entry point | -- | memsz              |
DD 4                                            ; | ph offset   | -- | flags: RX          |
                                                ; |             |    |                    |
skip:   pop     edi     ; discard argv[0]       ; |*sh offset   | -- |*align              |
        pop     edi     ; discard argv[1]=NULL  ; |             |    |                    |
env:    mov     cl,5    ; \ strlen("PATH=")     ; |             |    |                    |
        mov     esi,PATH; > "PATH="             ; |*flags    /--|    |                    |
DB 0x3d         ; cmp eax,0x10020               ; |*ehsize      |    +--------------------+
DW 32                                           ; | phentsize   |
DW 1                                            ; | phnum       |
                                                ; |             |
        pop     edi     ; > envp                ; |*shentsize   |
        repe    cmpsb   ; > strcmp(envp,"PATH="); |*shnum       |
        jne     env     ; /                     ; |*shstrndx    |
        mov     ecx,edi                         ; +-------------+

nlcolon:cmp     byte[edi],58  ; \ if (char == ':')
        jne     nosub         ; >
        sub     byte[edi],48  ; >   char -= '0'
nosub:  inc     edx           ; > wlen++
        scasb                 ; >
        jne     nlcolon       ; / while(char != 0)

        dec     edx           ; wlen--
        add     al,4
        int     0x80          ; write(1, ecx, wlen)
        xchg    eax,ebx
        int     0x80          ; exit(...)

PATH: db "PATH="
ninjalj
źródło