Xuất biến $ PATH, từng dòng


22

Lấy cảm hứng từ câu hỏi này trên AskUbfox.

Công việc của bạn cực kỳ đơn giản. Lấy biến môi trường PATH ( echo $PATH) và xuất nó sao cho mỗi mục (được phân tách bằng :ký tự) nằm trên một dòng riêng.

Ví dụ: nếu PATH là /bin:/usr/bin:/usr/local/bin, chương trình của bạn sẽ xuất ra:

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

Chương trình của bạn có thể không trả về một dòng mới hàng đầu, nhưng nó có thể trả về một dòng mới duy nhất. Bạn không cần phải kiểm tra xem PATH có đúng không, hoặc thư mục có tồn tại không. Chương trình của bạn sẽ không mất dữ liệu đầu vào, có nghĩa là chương trình của bạn chịu trách nhiệm lấy chính PATH. Bạn có thể giả định một cách an toàn rằng các đối tượng trong PATH không chứa :hoặc dòng mới. Tuy nhiên, không gian là trò chơi công bằng.

Tham khảo thực hiện có mặt trong các câu trả lời cho câu hỏi trên.

Quy tắc

  • Đây là (rõ ràng) mã golf, vì vậy câu trả lời ngắn nhất sẽ giành được dấu kiểm màu xanh lá cây được đánh giá cao.
  • Câu trả lời được chấp nhận sẽ được kiểm tra để đảm bảo rằng nó thực sự hợp pháp.
  • Cả hai mục Windows và * nix đều được chấp nhận.
    • Tuy nhiên, nếu bạn không chỉ định rõ ràng Windows, tôi sẽ thử chạy nó trong Linux và thất bại. (Nếu nó rõ ràng (hi, Batch!), Bạn không cần chỉ định rõ ràng.)
  • Chỉ có một giải pháp cho mỗi câu trả lời. Nếu bạn có cả phiên bản Windows và * nix, tôi sẽ tính phiên bản ngắn hơn.
  • Nếu hai câu trả lời có cùng độ dài, tôi sẽ ưu tiên cho câu trả lời có tổng số phiếu cao hơn. Nếu họ có tổng số phiếu bầu tương tự, tôi sẽ tính người lớn tuổi hơn. Nếu thời gian đăng là như nhau, tôi sẽ chọn thời gian thực hiện nhanh hơn. Nếu họ thực hiện trong cùng một khoảng thời gian, tôi không biết.

Bảng xếp hạng


À! Thật khó để truy cập Câu hỏi AskUbfox mà không đưa ra một số mẹo chơi gôn.
Roman Gräf

Một số câu trả lời (shell) dường như cho rằng đường dẫn không chứa khoảng trắng. Họ có nên được sửa chữa?
Dennis

@Dennis Thông thường, biến đường dẫn không nên có khoảng trắng, nhưng khi có thể, chúng nên được sửa. Tuy nhiên, chúng ta có thể giả định rằng các đường dẫn sẽ không chứa: hoặc một dòng mới.
Kaz Wolfe

Là một chức năng có thể chấp nhận?
corvus_192

@ corvus_192 Trừ khi thách thức một cách rõ ràng nói cách khác, chức năng được phép.
Dennis

Câu trả lời:


12

Vỏ Z (zsh), 13 byte

<<<${(F)path}

Sử dụng $paththam số , là tham số mảng đặc biệt được sử dụng bởi shell được gắn với $PATHtham số và cờ mở rộng tham số để nối một mảng với dòng mới.


3
Rõ ràng người ta chỉ đơn giản là chơi golf @Dennis ... Huh.
wizzwizz4

Làm thế nào để bí danh một số từ này? Tôi đã cố gắng alias path="<<<${(F)path}"nhưng khi thực hiện nó in /usr/local/bin zsh: no such file or directory: /Library/Apple/usr/bin zsh: no such file or directory: /Library/Apple/binsau đó đi vàosbin
Daniel Springer

Đường dẫn @DanielSpringer $ đang được mở rộng trong định nghĩa bí danh mà bạn không muốn. Sử dụng dấu ngoặc đơn thay thế:alias path='<<<${(F)path}'
GammaFunction

@GammaF rối mà làm việc! Tại sao báo giá kép không hoạt động?
Daniel Springer

@DanielSpringe Không có nhiều không gian ở đây để giải thích, đây là một pastebin: ix.io/1RyW
GammaFactor

13

Bash / Coreutils, 17 16 byte

tr : '
'<<<$PATH

tr : '\n'<<<$PATHcũng nên hoạt động tốt
Arnauld

Nó làm. . . chỉnh sửa ngay bây giờ
Sergiy Kolodyazhnyy

Tôi nghĩ bạn cũng có thể xóa các khoảng trống xung quanh <<<(chỉ được thử nghiệm trên Ubuntu)
Arnauld

@Arnauld Tôi không nghĩ đó là thứ duy nhất của Ubuntu, đó là thứ bash, vì vậy nên hoạt động trên các bản phân phối
Sergiy Kolodyazhnyy

6
Nó không lưu bất kỳ byte nào, nhưng sử dụng \\nthay vì biến được trích dẫn thì imho dễ đọc hơn.
Dennis

10

Mẻ, 41 byte

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

PATHTất nhiên là dấu chấm phẩy trên Windows. Thuận tiện, forchia theo dấu chấm phẩy theo mặc định, nhưng bất tiện, cũng trên không gian, vì vậy tôi phải sử dụng chuỗi thay thế thủ thuật để trích dẫn từng phần tử đường dẫn trước khi chia. Nó vẫn còn để loại bỏ các trích dẫn sau đó.


1
Chạy từ dòng lệnh bạn có thể thay thế %%bằng cách %lưu 2 byte.
DavidPostill

@DavidPostill Sẽ không biến nó thành một đoạn mã chứ không phải là một chương trình?
Neil

Tôi không chắc chắn các quy tắc golf chính xác là gì, nhưng không phải hầu hết các câu trả lời khác chỉ là đoạn trích? Hầu hết trong số họ yêu cầu "vỏ" của một số mô tả để chạy ...
DavidPostill

9

Vỏ Z (zsh), 15 byte

<<<${PATH//:/
}

Bạn có thể kiểm tra mã trên Anarchy Golf : nhấp vào sử dụng mẫu , chọn zsh , dán mã và gửi.

Bash (thuần túy), 19 byte

echo "${PATH//:/
}"

Cùng một ý tưởng, nhưng với cú pháp ít golf hơn của Bash. Kiểm tra nó trên Ideone .


6

Powershell, 20 byte

$env:PATH-split':'

Chỉnh sửa:

  • Tắt 2 byte. Cảm ơn @TimmyD

Cũ:

$env:PATH.split(":")

5

Ruby, 25 byte

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

Đẹp, ngắn hơn một chút so với câu trả lời của tôi về câu hỏi ban đầu trên AskUbfox
Sergiy Kolodyazhnyy

Bạn không cần phải đếm lời gọi Ruby, chỉ bản thân chương trình, vì vậy đây chỉ là 26 byte.
Jordan

@Jordan không biết điều đó. Có trong FAQ không?
Anwar

@Jordan Nó được hiển thị trong chính tour du lịch. Vì vậy, chỉnh sửa. Cảm ơn bạn đã nói điều đó
Anwar

1
Ồ, bạn cũng có thể thay đổi split ":"thành split":"hoặc split ?:cho 1 byte.
Jordan

4

Perl, 22 byte

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

Cần -Ehoặc -M5.010để chạy:

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

3

Bash + Python, 43 byte

Hãy sử dụng mở rộng biến của shell. Nó loại bỏ cuộc gọi os.environ, do đó ít mã hơn và nhập khẩu ít hơn. Điều đó mang lại cho chúng tôi 46 byte và với xnorthủ thuật và loại bỏ không gian trước khi -cchúng tôi có 43 byte.

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

Lưu ý rằng điều này không thành công nếu một thư mục có một trích dẫn hoặc dấu gạch chéo ngược xuất hiện trong PATH của bạn.
Joey Marianer

@JoeyMarianer Vì có thể có gần như bất kỳ ký tự nào trong tên tệp / chuỗi đường dẫn, nên có - điều này có thể thất bại và vì Pase sẽ mở rộng thành '/ dir'1: / dir2', cung cấp lệnh được định dạng không chính xác cho python. Dấu gạch chéo ngược không nhất thiết phải thất bại - nó chỉ diễn giải những gì trong chính chuỗi. IMHO, dấu gạch chéo ngược không nên xuất hiện trong tên đường dẫn của người dùng thông thường, vì vậy đối với 99% trường hợp, điều này là ổn. Tuy nhiên tôi đồng ý - điều này cần được ghi nhớ bất cứ khi nào bạn xử lý vỏ trực tiếp hoặc gián tiếp như trong trường hợp này
Sergiy Kolodyazhnyy

3

Java, 58 byte

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

Chương trình đầy đủ: 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"

Nếu PATHkhông chứa tên thư mục có khoảng trắng, không cần trích dẫn, 23 byte:

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

Thậm chí ngắn hơn, chuyển ngữ :sang dòng mới, nhờ @Dennis :

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

3

Vim, 19 byte

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

Lấy $PATHtừ thanh ghi biểu thức và dán nó. Biến :s thành dòng mới. Không có gì khó khăn.


Họ nên đặt điều này trong hướng dẫn Vim. Khi ai đó đọc về cách vào Vim, tôi đánh giá cao ví dụ này.
loa_in_

2

PHP, 36 35 33 32 byte

Đã lưu 1 byte, nhờ Blackhole
Lưu 2 byte, nhờ người dùng59178
đã lưu 1 byte, nhờ Martijn

* phiên bản nix

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

Phiên bản Windows

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

1
@ RomanGräf *nixchỉ là một cách để đề cập đến một hệ thống giống như Unix .
Arnauld

1
Nếu bạn muốn có một phiên bản "đa dạng", bạn có thể sử dụng hằng sốPATH_SEPARATOR
Ismael Miguel

1
Không sử dụng \n, nhưng một dòng mới thực sự thay vào đó, nó sẽ giúp bạn tiết kiệm một byte.
Hố đen

1
bạn cũng có thể thả "s xung quanh PATH. Bạn nhận được thông báo "sử dụng hằng số không xác định" nhưng nó vẫn hoạt động, tiết kiệm cho bạn 2 byte.
dùng59178

1
Sử dụng <?=strtr(getenv(PATH),":","")?>két echo ngắn một byte (* không thể tạo dòng mới trong nhận xét)
Martijn

2

Python 2, 49 byte

Tiết kiệm 2 byte nhờ @xnor và 1 byte bằng cách thay thế environbằng getenvcảm ơn @Serg và @Oliver

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

Đối với Python 3, chỉ cần thêm ()xung quanh printđối số và thêm 1 vào số byte.


Làm thế nào điều này sẽ nhận được đầu vào?
Anwar

2
@Anwar từ os.envir ['PATH'], sẽ trả về chuỗi
Sergiy Kolodyazhnyy

1
@Serg ah. hiểu rồi.
Anwar

2
replacecó thể lấy lý lẽ đóng gói replace(*':\n').
xnor

3
@KarlNapf Yea, đó là điểm chính. Chương trình này không chạy trong Python 3, vì vậy bạn nên chỉ định phiên bản mà nó hoạt động.
Denker

2

C, 85 84 byte

-1 byte để sử dụng #import

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

1

Vợt 39 byte

Sử dụng lệnh sed của @heemayl:

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

Ung dung:

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

Kiểm tra:
(f)

Đầu ra:

/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')

Trong scala, a b clà cú pháp đường cho a.b(c), vì vậy điều này biên dịch thànhsys.env("PATH").replace(':','\n')



1

C #, 64 byte

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

Hàm ẩn danh trả về biến đường dẫn, mỗi thư mục trên một dòng riêng biệt. Lưu ý rằng đó xchỉ là một đối tượng giả để lưu 1 byte thay vì sử dụng() .

Chương trình đầy đủ:

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

Cũng hoạt động trên các hệ thống UNIX nếu bạn thay thế ;bằng :, giả sử các thư viện Mono có sẵn. Dùng thử trực tuyến trên ideone , .NET Fiddle trả về một ngoại lệ bảo mật.

Ngoài ra, một chương trình C # đầy đủ, khá dài dòng:


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

Một nhập khẩu đắt tiền và không có replacetrong thư viện tiêu chuẩn làm cho nó khá dài.


chắc chắn m ':'...không cần không gian đó?
mèo

1
@cat: không gian là bắt buộc, vì 'là một ký tự hợp lệ trong các định danh. Không có không gian, chúng tôi sẽ xác định một chức năng được đặt tên m'.
nimi

1

C (x86), 60 byte

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

Điều này sẽ không hoạt động trên nền tảng 64 bit mà không bao gồm stdlib.h , vì getenv trả về một int (32 bit) trong khi con trỏ char rộng 64 bit.

Tôi vẫn chưa tìm thấy trình biên dịch C 32 bit trực tuyến.

C (x86-64), 70 byte

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

Thay vì bao gồm stdlib.h , chúng tôi tự khai báo getenv là một hàm trả về một con trỏ char .

Tôi đã thử nghiệm điều này với gcc và clang trên Linux; thiết lập khác có thể khóc máu. Hãy thử nó trên Ideone .


1

Yếu tố , 28 byte

cho unix-thích. Tôi không biết làm thế nào để làm điều đó trên Windows vì tôi không ở trong hộp Windows.

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

1

jq, 18 ký tự

(Tùy chọn dòng lệnh 16 ký tự + 2 ký tự)

env.PATH/":"|.[]

Chạy mẫu:

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 ký tự

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

Nhờ vào:

  • ninjalj để đề xuất sử dụng gsub()thay vì thao tác các biến tích hợp (-7 ký tự)

Cách điển hình awklà thiết lập các biến tích hợp có ảnh hưởng đến cách awkthao tác dữ liệu tự động:

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

Chạy mẫu:

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. Bạn nói đúng, @ninjalj. Tôi đã tập trung vào việc thực hiện nó awktheo cách cụ thể. Cảm ơn bạn.
manatwork

0

Node.js, 36 byte

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

Khá thẳng về phía trước.


0

MATLAB, 34 byte

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

Đây là một bản demo trực tuyến trong Octave với một sửa đổi nhỏ vì strreptrong quãng tám yêu cầu đầu vào thứ hai và thứ ba phải là charbiến chứ không phải là giá trị số.




0

Gema, 36 ký tự

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

Chạy mẫu:

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

Dấu vân tay Befunge-98 + EVAR, 34 byte

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

Tải dấu vân tay EVAR ( "RAVE"4() để dễ dàng truy cập các biến môi trường, lấy PATH envvar ( "HTAP"G) và với mỗi ký tự, thoát khỏi chương trình nếu ký tự là "\ 0" ( :!k@), tạo thành ASCII 48 "0" nếu char là ASCII 58 ":" ( :':-!'0*-) và xuất ký tự ( ,).


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

Nguồn 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="
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.