Às vezes, um longo caminho absoluto, por exemplo, um parâmetro de linha de comando para uma ferramenta Linux, pode ser reduzido, usando o diretório de trabalho atual como referência:
$ pwd
/home/heh
$ cat /home/heh/mydir/myfile
my stuff
$ cat mydir/myfile
my stuff
Neste desafio, você deve criar uma função ou um programa que receba dois parâmetros:
- Caminho absoluto, usando o formato linux (começa com
/
) - Diretório atual, usando o mesmo formato
A saída é a mais curta do seguinte:
- Entrada 1 inalterada
- Caminho relativo que se refere ao mesmo arquivo / diretório que o caminho absoluto
Pontos finos:
- Se o seu sistema operacional for compatível com linux, você poderá usar o diretório atual do sistema em vez de recebê-lo como entrada
- Você pode assumir que as entradas contêm apenas caracteres alfanuméricos (e separadores de caminho)
- Você pode assumir que o caminho absoluto de entrada não possui um separador de caminho
/
no final - Você pode assumir que o diretório atual de entrada possui um separador de caminho
/
no final - Você não pode assumir que o caminho absoluto se refere a um arquivo existente ou que qualquer parte dele seja um diretório acessível; no entanto, o diretório atual pode ser considerado válido
- Você pode assumir que não há links simbólicos em nenhum lugar próximo a nenhum dos caminhos - porque eu não quero exigir nenhuma maneira especial de lidar com links simbólicos
- Não há necessidade de suportar o caso em que uma das entradas é o diretório raiz
- "O diretório atual" deve ser exibido como
.
(uma sequência vazia não é válida)
Casos de teste (entrada1, entrada2, saída):
/home/user/mydir/myfile
/home/user
mydir/myfile
/var/users/admin/secret/passwd
/var/users/joe/hack
../../admin/secret/passwd
/home/user/myfile
/tmp/someplace
/home/user/myfile
/dir1/dir2
/dir1/dir2/dir3/dir4
../..
/dir1/dir2
/dir1/dir2
.
code-golf
string
file-system
anatolyg
fonte
fonte
/
no final". No entanto, em seus exemplos, esse não é o caso./home/test /home/user/mydir/myfile /home/test
e/a/b /a/b/d/e /a/b
Respostas:
Julia 0,5 , 32 bytes
Isso usa o diretório de trabalho atual como base e não pode ser testado no TIO no momento.
Exemplo de execução
Aviso: Isso irá alterar seu sistema de arquivos.
Versão alternativa, 35 bytes (diádica)
Isso leva o diretório base como entrada, para que possa ser testado sem modificar o sistema de arquivos.
Experimente online!
fonte
Base.-
erros, a menos que seja explicitamente importado, não?-
antes de redefini-lo. No 0.4, ele imprime um aviso se você o usa antes da redefinição ou não.JavaScript (ES6),
107106 bytesPega o caminho absoluto
a
e o caminho atualc
na sintaxe de curry(a)(c)
.Casos de teste
Mostrar snippet de código
fonte
[a.length]
! Posso emprestá-lo para melhorar minha resposta do Node.js.?Retina ,
858382 bytes1 byte salvo graças a @MartinEnder
Experimente online!
fonte
ES6 (Node.js REPL),
56.,54,46., 45 bytes[f.length]
truque da resposta de @ Arnauld , -6 bytesGolfe
Teste
fonte
Python 2,
135144 bytesExperimente Online!
Meio que demorou, mas eu queria fazer uma solução sem as funções de caminho internas.
Edit: 9 bytes adicionados à conta do caso de teste fornecido por Nathan Merrill
fonte
Zsh + caminho real, 58 bytes
Experimente online!
Versão Bash, 62 bytes
Experimente online!
fonte
Python 3 - 53 bytes
Usando
os.path
:Programa completo (61 bytes):
fonte
PHP, 204 bytes
Casos de teste
Expandido
Se uma saída
../../
em vezof ../..
é permitido pode ser encurtar a 175 Bytesfonte
C # - 66 bytes
Usando um .NET embutido e forçando um caminho válido:
Onde
f
,t
e de saída sãostring
.Experimente online!
fonte