Esporta la variabile $ PATH, riga per riga


22

Ispirato da questa domanda su AskUbuntu.

Il tuo lavoro è estremamente semplice. Prendi la variabile d'ambiente PATH ( echo $PATH) ed esportala in modo tale che ogni voce (separata dal :carattere) sia sulla sua riga.

Ad esempio, se il PERCORSO è /bin:/usr/bin:/usr/local/bin, il tuo programma dovrebbe produrre:

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

Il programma potrebbe non restituire una nuova riga iniziale, ma potrebbe restituire una singola riga finale finale. Non è necessario verificare se il PERCORSO è corretto o se la directory esiste. Il tuo programma non dovrebbe ricevere input, il che significa che il tuo programma è responsabile per ottenere il PERCORSO stesso. Puoi tranquillamente presumere che gli oggetti nel PERCORSO non contengano :né newline. Tuttavia, gli spazi sono un gioco equo.

Le implementazioni di riferimento sono presenti nelle risposte alla domanda sopra.

Regole

  • Questo è (ovviamente) code-golf, quindi la risposta più breve vincerà il prezioso segno di spunta verde.
  • La risposta accettata verrà testata per accertarsi che sia effettivamente legittima.
  • Sono accettate entrambe le voci Windows e * nix.
    • Tuttavia, se non specifichi esplicitamente Windows, proverò a eseguirlo su Linux e fallirò. (Se è ovvio (ciao, Batch!), Non è necessario specificare esplicitamente.)
  • Hai solo una soluzione per risposta. Se hai una versione Windows e * nix, conterò quella più corta.
  • Se due risposte hanno la stessa lunghezza, darò la priorità a quella con il voto più alto. Se hanno lo stesso voto totale, conterò quello più vecchio. Se il tempo pubblicato è lo stesso, sceglierò quello che verrà eseguito più velocemente. Se eseguono nello stesso lasso di tempo, non lo so.

Classifica


Ahh! È stato difficile visitare la domanda AskUbuntu senza dare alcuni consigli sul golf.
Roman Gräf,

Alcune delle risposte (shell) sembrano supporre che il percorso non contenga spazi. Dovrebbero essere corretti?
Dennis,

@Dennis In genere, la variabile path non dovrebbe avere spazi, ma come possono, dovrebbero essere corretti. Tuttavia, possiamo tranquillamente presumere che i percorsi stessi non contengano: o una nuova riga.
Kaz Wolfe,

Una funzione è accettabile?
corvus_192,

@ corvus_192 A meno che la sfida in modo esplicito dice il contrario, le funzioni sono ammessi.
Dennis,

Risposte:


12

Z shell (zsh), 13 byte

<<<${(F)path}

Utilizza il $pathparametro , che è uno speciale parametro dell'array utilizzato dalla shell collegata al $PATHparametro e un flag di espansione del parametro per unire un array con le nuove righe.


3
Apparentemente si fa semplicemente fuori campo da golf @Dennis ... Huh.
wizzwizz4,

Come alias qualche parola a questo? Ho provato alias path="<<<${(F)path}"ma quando eseguito viene stampato /usr/local/bin zsh: no such file or directory: /Library/Apple/usr/bin zsh: no such file or directory: /Library/Apple/binpoi va asbin
Daniel Springer il

Il percorso @DanielSpringer $ viene espanso durante la definizione di alias, che non si desidera. Utilizzare invece virgolette singole:alias path='<<<${(F)path}'
GammaFunction

@GammaFunction che ha funzionato! Perché le doppie virgolette non hanno funzionato?
Daniel Springer,

@DanielSpringe Non c'è molto spazio qui per spiegare, ecco un pastebin: ix.io/1RyW
GammaFunction

13

Bash / Coreutils, 17 16 byte

tr : '
'<<<$PATH

tr : '\n'<<<$PATHdovrebbe funzionare anche
Arnauld

Lo fa. . . editing in questo momento
Sergiy Kolodyazhnyy,

Penso che puoi rimuovere anche gli spazi <<<(testato solo su Ubuntu)
Arnauld,

@ArnaNon posso pensare che sia l'unica cosa di Ubuntu, è una cosa da
schifo

6
Non salva alcun byte, ma l'utilizzo al \\nposto della variabile tra virgolette è un imho più leggibile.
Dennis,

10

Lotto, 41 byte

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

PATHovviamente è delimitato da punto e virgola su Windows. Convenientemente, si fordivide sui punti e virgola per impostazione predefinita, ma in modo scomodo, anche sugli spazi, quindi devo usare il trucco di sostituzione delle stringhe per citare ogni elemento del percorso prima della divisione. Resta quindi da rimuovere le virgolette in seguito.


1
In esecuzione dalla riga di comando è possibile sostituire %%con il %salvataggio di 2 byte.
DavidPostill

@DavidPostill Non lo renderebbe uno snippet di codice piuttosto che un programma?
Neil,

Non sono sicuro di quali siano esattamente le regole del codice golf, ma la maggior parte delle altre risposte non sono solo frammenti? Molti di loro richiedono una "shell" di alcune descrizioni per funzionare ...
DavidPostill

9

Z shell (zsh), 15 byte

<<<${PATH//:/
}

Puoi testare il codice su Anarchy Golf : fai clic su usa modulo , seleziona zsh , incolla il codice e invia.

Bash (puro), 19 byte

echo "${PATH//:/
}"

Stessa idea, ma con la sintassi meno golfosa di Bash. Provalo su Ideone .


6

Powershell, 20 byte

$env:PATH-split':'

Modificare:

  • -2 byte di sconto. Grazie a @TimmyD

Vecchio:

$env:PATH.split(":")

5

Rubino, 25 byte

puts ENV["PATH"].split":"

Bello, un po 'più breve della mia risposta sulla domanda originale su AskUbuntu
Sergiy Kolodyazhnyy,

Non è necessario contare l'invocazione di Ruby, ma solo il programma stesso, quindi si tratta di soli 26 byte.
Giordania,

@Jordan non lo sapeva. È nelle FAQ?
Anwar,

@Jordan È mostrato nel tour stesso. Quindi, modificato. Grazie per averlo detto
Anwar,

1
Oh, anche tu puoi cambiare split ":"in split":"o split ?:per 1 byte.
Giordania,

4

Perl, 22 byte

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

Necessità -Eo -M5.010esecuzione:

perl -E 'say$ENV{PATH}=~y/:/
/r'

3

Bash + Python, 43 byte

Usiamo l'espansione variabile della shell. Elimina le chiamate os.environ, quindi meno codice e meno importazioni. Questo ci dà 46 byte, e con xnoril trucco e la rimozione dello spazio prima -cche abbiamo 43 byte.

python -c"print('$PATH'.replace(*':\n'))"

Si noti che ciò non riesce se una directory con una virgoletta singola o una barra rovesciata appare nel PERCORSO.
Joey Marianer,

@JoeyMarianer Dal momento che può esserci quasi qualsiasi carattere nella stringa nome file / percorso, allora sì - questo potrebbe non riuscire e poiché PATH si espanderà in '/ dir'1: / dir2', che fornisce a Python un comando formattato in modo errato. La barra rovesciata non necessariamente fallisce: interpreta semplicemente ciò che è nella stringa stessa. IMHO, le escape backslash non dovrebbero apparire nei nomi dei percorsi dell'utente normale, quindi per il 99% dei casi è OK. Sono comunque d'accordo - questo dovrebbe essere tenuto presente ogni volta che si tratta di shell direttamente o indirettamente come in questo caso
Sergiy Kolodyazhnyy,

3

Java, 58 byte

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

Programma completo: 106 byte

class E {
    public static void main (String[] args) {
        System.out.print(System.getenv("Path").replace(';', '\n'));
    }
}

3

GNU sed+ bash, 25 byte:

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

Se il PATHnon contiene alcun nome di directory con spazi bianchi, non è necessaria la citazione, 23 byte:

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

Ancora più breve, traslitterando :a newline, grazie a @Dennis :

sed y/:/\\n/<<<"$PATH"

3

Vim, 19 byte

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

Prendi $PATHil registro delle espressioni e incollalo. Trasforma la :s in nuove righe. Niente di complicato.


Dovrebbero metterlo nei tutorial di Vim. Come qualcuno che legge su come entrare in Vim apprezzo questo esempio.
loa_in_

2

PHP, 36 35 33 32 byte

Salvato 1 byte, grazie a Blackhole
Salvato 2 byte, grazie all'utente 59178
salvato 1 byte, grazie a Martijn

* versione nix

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

Versione di Windows

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

1
@ RomanGräf *nixè solo un modo per riferirsi a un sistema simile a Unix .
Arnauld,

1
Se vuoi una versione "multipiattaforma", puoi usare la costantePATH_SEPARATOR
Ismael Miguel,

1
Non usare \n, ma una nuova riga vera invece, ti farà risparmiare un byte.
Blackhole,

1
puoi anche far cadere la "s in giro PATH. Si ottiene un avviso "uso di costante non definita" ma funziona ancora, risparmiando 2 byte.
user59178,

1
L'uso dell'eco breve consente di <?=strtr(getenv(PATH),":","")?>salvare un byte (* non posso newline nei commenti)
Martijn,

2

Python 2, 49 byte

Salvataggio di 2 byte grazie a @xnor e 1 byte sostituendo environcon getenvgrazie a @Serg e @Oliver

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

Per Python 3, basta aggiungere (e )attorno printall'argomento e aggiungere 1 al conteggio dei byte.


Come otterrà l'input?
Anwar,

2
@Anwar di os.environ ['PATH'], che restituirà la stringa
Sergiy Kolodyazhnyy,

1
@Serg ah. fatto.
Anwar,

2
replacepuò accettare argomenti complessi replace(*':\n').
xnor

3
@KarlNapf Sì, questo è il punto. Questo programma così com'è non funziona in Python 3, quindi dovresti specificare la versione con cui funziona.
Denker,

2

C, 85 84 byte

-1 byte per l'utilizzo #import

#import<stdlib.h>
main(){char*a=getenv("PATH");while(*a)putchar(*a++==58?10:a[-1]);}

1

Racchetta 39 byte

Usando il comando sed di @heemayl:

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

Ungolfed:

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

Test:
(f)

Produzione:

/usr/local/bin
/usr/bin
/bin
/usr/games
/usr/lib/java/bin
/usr/lib/java/jre/bin
#t

1

Scala, 31 byte

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

In scala, a b cè lo zucchero sintattico per a.b(c), quindi questo si compilasys.env("PATH").replace(':','\n')



1

C #, 64 byte

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

Funzione anonima che restituisce la variabile path, ogni directory su una riga separata. Si noti che xè solo un oggetto fittizio per salvare 1 byte invece di utilizzarlo ().

Programma completo:

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));
        }
    }
}

Funziona anche su sistemi UNIX se si sostituisce ;con :, presumendo che siano disponibili librerie Mono. Provalo online su ideone , .NET Fiddle restituisce un'eccezione di sicurezza.

In alternativa, un programma C # completo, che è piuttosto dettagliato:


C #, 118 byte

using System;class P{static void Main(){Console.Write(Environment.GetEnvironmentVariable("PATH").Replace(";","\n"));}}

1

Haskell, 72 byte

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

Un'importazione costosa e nessuna replaceall'interno della libreria standard la rende piuttosto lunga.


sicuramente m ':'...non ha bisogno di quello spazio?
gatto

1
@cat: lo spazio è obbligatorio, poiché 'è un carattere valido all'interno degli identificatori. Senza spazio definiremmo una funzione chiamata m'.
nimi,

1

C (x86), 60 byte

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

Questo non funzionerà su piattaforme a 64 bit senza includere stdlib.h , poiché getenv restituisce un int (32 bit) mentre i puntatori char sono larghi 64 bit.

Devo ancora trovare un compilatore C online a 32 bit.

C (x86-64), 70 byte

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

Invece di includere stdlib.h , dichiariamo getenv noi stessi come una funzione che restituisce un carattere puntatore .

Ho provato questo con gcc e clang su Linux; altre configurazioni possono piangere sangue. Provalo su Ideone .


1

Fattore , 28 byte

per unix-like. Non so come farlo su Windows poiché non sono in una finestra di Windows.

"PATH"getenv ":" "\n"replace

1

jq, 18 caratteri

(Codice di 16 caratteri + opzione della riga di comando di 2 caratteri)

env.PATH/":"|.[]

Esecuzione di esempio:

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

1

Awk, 51 44 caratteri

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

Grazie a:

  • ninjalj per aver suggerito di usare gsub()invece di manipolare le variabili incorporate (-7 caratteri)

Il awkmodo tipico sarebbe quello di impostare le variabili integrate che influenzano il modo in cui awki dati vengono manipolati automaticamente:

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

Esecuzione di esempio:

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

Doh. Hai ragione, @ninjalj. Dovevo concentrarmi sul farlo in awkmodo specifico. Grazie.
arte

0

Node.js, 36 byte

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

Abbastanza diretto.


0

MATLAB, 34 byte

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

Ecco una demo online in Octave con una leggera modifica poiché strrepin ottava richiede che il secondo e il terzo input siano charvariabili anziché valori numerici.




0

Gema, 36 personaggi

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

Esecuzione di esempio:

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

0

Impronta digitale Befunge-98 + EVAR, 34 byte

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

Carica l'impronta digitale EVAR ( "RAVE"4() per accedere facilmente alle variabili di ambiente, ottiene il PATH envvar ( "HTAP"G) e per ogni carattere, esce dal programma se il carattere è "\ 0" ( :!k@), i substrati ASCII 48 "0" se il carattere è ASCII 58 ":" ( :':-!'0*-) e genera il carattere ( ,).


0

ELF / x86, 78 byte

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

Fonte 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="
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.