Desafio de lógica - qualquer linguagem
Enviado: 29 Ago 2010 19:45
Olá pessoal!
Eis aqui um teste que coloca a prova todo seu raciocínio lógico.
Estava eu fazendo meu projetinho citado lá no outro post, e eu precisava fazer uma simples listagem de arquivos dentro de um programa. Até aí tudo bem, moleza com o xharbour. No entanto me surpreendeu como funciona um programinha básico que uso no meu dia a dia, e o qual eu queria copiar o comportamento. Este programa é o ls. Para quem não sabe o ls é o dir no linux.
Então se alguém tiver tempo de tentar fazer o seu prório ls, seja para Windows, para Linux, Mac ou qualquer SO, é muito mais difícil do que parece. Vou explicar como ele funciona, mas antes já vou mostrar uma saída básica do programa:
Basicamente é isso. Então vamos ao problema. As regras são:
Obrigatório:
1 - A exibição é feita em colunas separadas por dois espaços, quantas couberem na tela. Aqui existe uma diferença porque no Linux o terminal em janela é redimensionável como qualquer janela., e em tela cheia utiliza o modo VGA. No exemplo foi usado 1024x768, que fica com 128 colunas. Não me lembro se em alguma ocasião o WIndows pode ter mais ou menos de 80 colunas em tela cheia, mas janelado acho que da pra configurar no atalho. De qualquer forma o programa tem de seguir este padrão e saber qtas colunas tem o terminal. ( maxCol() )
2 - Como podem observar, as colunas da lista de exibição não tem largura fixa, ou seja, cada coluna tem o tamanho do maior item que nela se encontra.
3 - A ordenação é alfabética, porém corre no sentido da linha (para baixo), e não da coluna.
Opcional (apenas para incrementar):
Se vocÊ passou com sucesso na primeira etapa, que é onde reside o desafio em sí, pode então implementar mais estas funcionalidades:
4 - Arquivos começados com ponto, como o ".pwd.lock" do exemplo acima, devem ter seu ponto desconsiderado para a ordenação, ou seja, o P é o que vale, mas deve ser exibido corretamente com o ponto.
5 - Diretórios devem ser sufixados com a "/".
6 - (Apenas Linux) Arquivos executáveis devem ser sufixados com * e links com @. Exemplo:
Acho que é só isso. Se alguém tiver tempo pode tentar, eu garanto para vocês que é muito dificil. Eu queimei as pestanas e até já dou mais valor pra este programinha tão simples que uso todo dia,
Dica: Funções Directory() ou ADir() podem ser úteis.
Abraços!
Ps: O primeiro a postar o código funcionando sobe um nível na estatística do fórum...
Hahaha! Bricadeira.
Eis aqui um teste que coloca a prova todo seu raciocínio lógico.
Estava eu fazendo meu projetinho citado lá no outro post, e eu precisava fazer uma simples listagem de arquivos dentro de um programa. Até aí tudo bem, moleza com o xharbour. No entanto me surpreendeu como funciona um programinha básico que uso no meu dia a dia, e o qual eu queria copiar o comportamento. Este programa é o ls. Para quem não sabe o ls é o dir no linux.
Então se alguém tiver tempo de tentar fazer o seu prório ls, seja para Windows, para Linux, Mac ou qualquer SO, é muito mais difícil do que parece. Vou explicar como ele funciona, mas antes já vou mostrar uma saída básica do programa:
Código: Selecionar todos
/etc $ ls -aF
./ group hosts ld.so.conf lsb-release nsswitch.conf protocols services udev/
../ group- inittab limits man_db.conf opt/ .pwd.lock shadow vimrc
blkid.tab grub.d/ inputrc localtime mke2fs.conf passwd rc.d/ shadow-
default/ gshadow iproute2/ login.access mtab passwd- resolv.conf sysconfig/
fstab gshadow- ld.so.cache login.defs nomedearquivogrande.txx profile rpc syslog.conf
Obrigatório:
1 - A exibição é feita em colunas separadas por dois espaços, quantas couberem na tela. Aqui existe uma diferença porque no Linux o terminal em janela é redimensionável como qualquer janela., e em tela cheia utiliza o modo VGA. No exemplo foi usado 1024x768, que fica com 128 colunas. Não me lembro se em alguma ocasião o WIndows pode ter mais ou menos de 80 colunas em tela cheia, mas janelado acho que da pra configurar no atalho. De qualquer forma o programa tem de seguir este padrão e saber qtas colunas tem o terminal. ( maxCol() )
2 - Como podem observar, as colunas da lista de exibição não tem largura fixa, ou seja, cada coluna tem o tamanho do maior item que nela se encontra.
3 - A ordenação é alfabética, porém corre no sentido da linha (para baixo), e não da coluna.
Opcional (apenas para incrementar):
Se vocÊ passou com sucesso na primeira etapa, que é onde reside o desafio em sí, pode então implementar mais estas funcionalidades:
4 - Arquivos começados com ponto, como o ".pwd.lock" do exemplo acima, devem ter seu ponto desconsiderado para a ordenação, ou seja, o P é o que vale, mas deve ser exibido corretamente com o ponto.
5 - Diretórios devem ser sufixados com a "/".
6 - (Apenas Linux) Arquivos executáveis devem ser sufixados com * e links com @. Exemplo:
Código: Selecionar todos
./ bunzip2@ chmod* df* fgrep* head@ loadkeys* mknod* nice* ping6* sed* su* uname*
../ bzcat@ chown* dmesg* find* hostname* login* more* openvt* ps* setfont* sync*
Acho que é só isso. Se alguém tiver tempo pode tentar, eu garanto para vocês que é muito dificil. Eu queimei as pestanas e até já dou mais valor pra este programinha tão simples que uso todo dia,
Dica: Funções Directory() ou ADir() podem ser úteis.
Abraços!
Ps: O primeiro a postar o código funcionando sobe um nível na estatística do fórum...
Hahaha! Bricadeira.