Página 1 de 1

Desafio de lógica - qualquer linguagem

Enviado: 29 Ago 2010 19:45
por Stanis Luksys
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:

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
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:

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.