Експортуйте змінну $ PATH, рядок за рядком


22

Натхненний цим питанням на AskUbuntu.

Ваша робота надзвичайно проста. Візьміть змінну середовища PATH ( echo $PATH) та експортуйте її таким чином, що кожен запис (відокремлений :символом) знаходиться у власному рядку.

Наприклад, якщо PATH є /bin:/usr/bin:/usr/local/bin, ваша програма повинна вивести:

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

Ваша програма може не повернути провідний новий рядок, але може повернути один зворотний новий рядок. Вам не потрібно перевіряти, чи PATH правильний, чи каталог існує. Ваша програма не повинна брати ніяких внесків, тобто ваша програма відповідає за отримання ПАТХ самої. Ви можете сміливо припускати, що об'єкти в PATH не містять :чи нові рядки. Однак простори - це чесна гра.

Реалізація посилань присутня у відповідях на питання вище.

Правила

  • Це (очевидно) код-гольф, тому найкоротша відповідь виграє цінувану зелену галочку.
  • Прийнята відповідь буде перевірена, щоб переконатися, що вона насправді законна.
  • Приймаються як записи Windows, так і * nix.
    • Однак, якщо ви чітко не вкажете Windows, я спробую запустити його в Linux і вийти з ладу. (Якщо це очевидно (привіт, Пакет!), Вам не потрібно чітко вказувати.)
  • Майте одне рішення на відповідь. Якщо у вас є і версія Windows, і * nix, я буду рахувати більш коротку.
  • Якщо дві відповіді мають однакову тривалість, я віддаю перевагу тому, хто має більший загальний обсяг голосів. Якщо у них однаковий загальний голос, я підрахую старший. Якщо опублікований час буде однаковим, я виберу той, який виконується швидше. Якщо вони виконують за той самий проміжок часу, я не знаю.

Таблиця лідерів


А-а! Важко було відвідати питання AskUbuntu, не даючи порад про гольф.
Роман Ґраф

Деякі відповіді (оболонки), здається, припускають, що шлях не містить пробілів. Чи слід їх виправляти?
Денніс

@Dennis Як правило, змінна контура не повинна мати пробілів, але, як вони можуть, їх слід виправити. Однак ми можемо сміливо припустити, що самі шляхи не містять: або новий рядок.
Каз Вулф

Чи прийнятна функція?
corvus_192

@ corvus_192 Якщо виклик прямо не говорить інше, функції дозволені.
Денніс

Відповіді:


12

Z оболонка (zsh), 13 байт

<<<${(F)path}

Використовує $pathпараметр , який є спеціальним параметром масиву, використовуваним оболонкою, яка прив’язана до $PATHпараметра, та прапор розширення параметра для приєднання масиву з новими рядками.


3
Мабуть один робить просто через гольф @Dennis ... Так.
wizzwizz4

Як псевдонім до цього слова? Я намагався , alias path="<<<${(F)path}"але при виконанні він друкує /usr/local/bin zsh: no such file or directory: /Library/Apple/usr/bin zsh: no such file or directory: /Library/Apple/binпотім йдеsbin
Daniel Springer

@DanielSpringer $ шлях розширюється під час визначення псевдоніму, якого ви не хочете. Використовуйте замість одиничних лапок:alias path='<<<${(F)path}'
GammaFunction

@GammaFunction, яка працювала! Чому подвійні цитати не спрацювали?
Даніель Спрінгер

@DanielSpringe Тут не так багато місця для пояснення, ось пастбін
GammaFunction

13

Bash / Coreutils, 17 16 байт

tr : '
'<<<$PATH

tr : '\n'<<<$PATHповинні також працювати
Арнольд

Це робить . . . редагування прямо зараз
Сергій Колодяжний

Я думаю, ви можете також видалити пробіли навколо <<<(тестується лише на Ubuntu)
Arnauld

@Arnauld я не думаю, що це єдине Ubuntu, це баш-річ, тому слід працювати по всій дистрибуції
Сергій Колодяжний

6
Він не економить жодних байтів, але використання \\nзамість цитованої змінної є більш зрозумілим imho.
Денніс

10

Пакет, 41 байт

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

PATHЗвичайно, це обмежено крапкою з комою в Windows. Зручно, forрозбивається на крапки з комою за замовчуванням, але незручно, також на пробіли, тому я маю використовувати хитрість заміни рядків, щоб цитувати кожен елемент шляху перед розбиттям. Потім залишається прибрати лапки згодом.


1
Запуск з командного рядка можна замінити %%з %економією 2 байта.
DavidPostill

@DavidPostill Чи не це зробить фрагмент коду, а не програму?
Ніл

Я не впевнений, які точні правила гольфу на коді, але хіба більшість інших відповідей не є також фрагментами? Більшість із них вимагає "оболонки" якогось опису для запуску ...
DavidPostill

9

Z оболонка (zsh), 15 байт

<<<${PATH//:/
}

Ви можете перевірити код на Anarchy Golf : натисніть форму використання , виберіть zsh , вставте код та надішліть.

Баш (чистий), 19 байт

echo "${PATH//:/
}"

Ця ж ідея, але з менш симпатичним синтаксисом Баша. Перевірте це на Ideone .


6

Powershell, 20 байт

$env:PATH-split':'

Редагувати:

  • -2 байт вимкнено Завдяки @TimmyD

Старий:

$env:PATH.split(":")

5

Рубін, 25 байт

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

Приємний, крихітний трохи коротший, ніж моя відповідь на оригінальне запитання про AskUbuntu
Сергій Колодяжний

Вам не потрібно рахувати виклик Ruby, лише сама програма, тому це лише 26 байт.
Йорданія

@ Джордан цього не знав. Це в FAQ?
Анвар

@Jordan Це показано в самому турі. Отже, відредаговано. Дякую за те, що ви сказали це
Анвар

1
О, також ви можете змінити split ":"на 1 байт split":"або split ?:на нього.
Йорданія

4

Perl, 22 байти

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

Потрібно -Eабо -M5.010запустити:

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

3

Bash + Python, 43 байти

Давайте скористаємося змінним розширенням оболонки. Це виключає дзвінки os.environ, тим самим менше коду та менше імпорту. Це дає нам 46 байт, і з xnorхитрості і видалення місця, перш ніж у -cнас буде 43 байти.

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

Зверніть увагу, що це не вдається, якщо у вашому PATH з'явиться каталог з однією цитатою або зворотною косою рисою.
Joey Marianer

@JoeyMarianer Оскільки у імені файлу / рядку файлу може бути майже будь-який символ, то так - це може вийти з ладу, і PATH перейде до '/ dir'1: / dir2', що дає неправильно відформатовану команду python. Зворотна косої риси не обов'язково провалюється - вона просто інтерпретує те, що знаходиться в самій рядку. IMHO, ухили від косої риски не повинні відображатися у звичайних іменах користувачів, тому для 99% випадків це нормально. Однак я погоджуюся - це слід пам’ятати, коли ви працюєте зі снарядом прямо чи опосередковано, як у цьому випадку
Сергій Колодяжний

3

Java, 58 байт

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

Повна програма: 106 байт

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

3

GNU sed+ bash, 25 байт:

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

Якщо PATHім'я каталогу не містить пробіл, не потрібне цитування, 23 байти:

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

Ще коротше, перекладаючи :на новий рядок, завдяки @Dennis :

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

3

Вім, 19 байт

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

Візьміть $PATHз регістра виразів і вставте його. Перетворіть :s у нові рядки. Нічого хитрого.


They should put this in Vim tutorials. As someone reading about how to get into Vim I appreciate this example.
loa_in_

2

PHP, 36 35 33 32 bytes

Saved 1 byte, thanks to Blackhole
Saved 2 bytes, thanks to user59178
saved 1 byte, thanks to Martijn

*nix version

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

Windows version

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

1
@RomanGräf *nix is just a way of referring to a Unix-like system.
Arnauld

1
If you want a "multi-plataform" version, you can use the constant PATH_SEPARATOR
Ismael Miguel

1
Don't use \n, but a true newline instead, it'll save you one byte.
Blackhole

1
you can also drop the "s around PATH. You get an "use of undefined constant" notice but it still works, saving you 2 bytes.
user59178

1
Using the short echo <?=strtr(getenv(PATH),":","")?> safes a byte (*cant newline in comments)
Martijn

2

Python 2, 49 bytes

Saving 2 bytes thanks to @xnor and 1 byte by replacing environ with getenv thanks to @Serg and @Oliver

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

For Python 3, just add ( and ) around the print argument and add 1 to the byte count.


How will this get the input?
Anwar

2
@Anwar from os.environ['PATH'] , that will return the string
Sergiy Kolodyazhnyy

1
@Serg ah. got it.
Anwar

2
replace can take packed arguments replace(*':\n').
xnor

3
@KarlNapf Yea, thats the point. This program as-is does not run in Python 3, so you should specify the version it works with.
Denker

2

C, 85 84 bytes

-1 byte for using #import

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

1

Racket 39 bytes

Using sed command of @heemayl :

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

Ungolfed:

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

Testing:
(f)

Output:

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

1

Scala, 31 bytes

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

In scala, a b c is syntactic sugar for a.b(c), so this compiles to sys.env("PATH").replace(':','\n')



1

C#, 64 bytes

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

Anonymous function which returns the path variable, each directory on a separate line. Note that x is just a dummy object to save 1 byte instead of using ().

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

Also works on UNIX systems if you replace ; with :, presuming Mono libraries are available. Try it online on ideone, .NET Fiddle returns a security exception.

Alternatively, a full C# program, which is rather verbose:


C#, 118 bytes

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

1

Haskell, 72 bytes

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

An expensive import and no replace within the standard library make it quite long.


surely m ':'... doesn't need that space?
cat

1
@cat: the space is mandatory, because ' is a valid character within identifiers. Without space we'd define a function named m'.
nimi

1

C (x86), 60 bytes

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

This won't work on 64-bit platforms without including stdlib.h, since getenv returns an int (32 bits) while char pointers are 64 bits wide.

I have yet to find an online 32-bit C compiler.

C (x86-64), 70 bytes

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

Instead of including stdlib.h, we declare getenv ourselves as a function returning a char pointer.

I've tested this with gcc and clang on Linux; other setups may cry blood. Try it on Ideone.


1

Factor, 28 bytes

for unix-likes. I dunno how to do it on Windows since I'm not at a Windows box.

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

1

jq, 18 characters

(16 characters code + 2 characters command line option)

env.PATH/":"|.[]

Sample run:

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 characters

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

Thanks to:

  • ninjalj for suggesting to use gsub() instead of manipulating built-in variables (-7 characters)

The typical awk way would be to set up the built-in variables which influences how awk manipulates the data automatically:

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

Sample run:

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. You are right, @ninjalj. I was to focused on doing it in awk-specific way. Thank you.
manatwork


0

MATLAB, 34 bytes

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

Here is an online demo in Octave with a slight modification since strrep in octave requires the second and third inputs to be char variables rather than numeric values.




0

Gema, 36 characters

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

Sample run:

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

Befunge-98 + EVAR fingerprint, 34 bytes

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

Loads the EVAR fingerprint ("RAVE"4() to easily access environment variables, gets the PATH envvar ("HTAP"G), and for each character, exits the program if the character is "\0" (:!k@), substracts ASCII 48 "0" if the char is ASCII 58 ":" (:':-!'0*-), and outputs the character (,).


0

ELF/x86, 78 bytes

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

NASM source:

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="
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.