1 (изменено: Arigato, 2014-02-23 23:21:32)

Тема: CMD/BAT: Код минимальной длинны

Задача: в файле input.txt записаны 3 целых числа через пробелы (a b c).
Необходимо вывести в файл output.txt значение 2*a*b*c.
Например:
input.txt: 5 2 3 => output.txt: 60
input.txt: 14 23 5 => output.txt: 3220

Задачу необходимо решить в виде одной команды, вводимой непосредственно в командной строке. При этом необходимо уменьшить количество непробельных символов до минимума (пробелы, табуляции не считаем).

Вот что получилось у меня:

for /f "tokens=1,2*" %a in ('type i*') do set /a x=2*%a*%b*%c>output.txt

Без пробелов 62 символа. Есть ли идеи по уменьшению кода?

2

Re: CMD/BAT: Код минимальной длинны

Arigato, а ежели там ещё на «i» окажутся файлы? Некорректно.

Можно сократить на пару символов, убрав «x=». Ещё один — использовав «tokens=1-3» вместо «tokens=1,2*».

3

Re: CMD/BAT: Код минимальной длинны

Без пробелов 42 символа:

set /p x=<input.txt& set /a 2*%x: =*%>output.txt

.

A такой код можно вставить и в пакетный файл:

cmd /v:on /c "set /p x=<input.txt& set /a x=2*!x: =*!>output.txt

P. S. Я не случайно упустил закрывающую кавычку. Если уж речь идёт о минимализации кода, то хватит и одной.

4

Re: CMD/BAT: Код минимальной длинны

Нашёл:

set /p s=<input.txt&call set /a 2*%s: =*%>output.txt

Update: Опоздал .

5

Re: CMD/BAT: Код минимальной длинны

Yury, у меня без «call» не работает:

Отсутствующий операнд.

6

Re: CMD/BAT: Код минимальной длинны

alexii пишет:

у меня без «call» не работает

alexii, у Вас интерпретатор запускаеся с параметром "/v:on".

7

Re: CMD/BAT: Код минимальной длинны

Yury, угу. Только через реестр задано.

8

Re: CMD/BAT: Код минимальной длинны

alexii пишет:

Arigato, а ежели там ещё на «i» окажутся файлы? Некорректно.

Гарантированно там нет других файлов, начинающихся на i.

alexii пишет:

Можно сократить на пару символов, убрав «x=». Ещё один — использовав «tokens=1-3» вместо «tokens=1,2*».

Да, спасибо, 3 символа убрали.

у меня без «call» не работает

Я тоже такой вариант пытался реализовать, то же ругался на отсутствующий операнд. С call работает, спасибо за подсказку. Вот только проблема в том, что в файле input.txt может оказаться пробел в конце строки, тогда получается "14*23*5*" и не работает. Как бы его отрезать.

9

Re: CMD/BAT: Код минимальной длинны

Arigato пишет:

Вот только проблема в том, что в файле input.txt может оказаться пробел в конце строки, тогда получается "14*23*5*" и не работает. Как бы его отрезать.

set /p x=<input.txt& (>nul findstr /rc:" \>" input.txt&& call set /a 2*%x: =*%1|| call set /a 2*%x: =*%)>output.txt

10

Re: CMD/BAT: Код минимальной длинны

Arigato пишет:

Гарантированно там нет других файлов, начинающихся на i.

Ну, в условии задачи об этом ничего не было сказано. Потому вызвало удивление.

Arigato пишет:

Вот только проблема в том, что в файле input.txt может оказаться пробел в конце строки

Данное условие также отсутствует в техзадании .

11 (изменено: Arigato, 2014-02-24 11:54:51)

Re: CMD/BAT: Код минимальной длинны

Yury, только это решение проигрывает по длине такому:

for /f "tokens=1-3" %a in ('type i*') do set /a %a*%b*%c*2>output.txt

Думал как бы этот проблем легко свести на нет, к примеру, если приписать в конце 1, то получится *1. Но если пробела в конце нет, то 1 допишется к самому числу.