Пакетный сценарий: как преобразовать буквы в заранее заданный набор числовых аналогов, а затем суммировать их - PullRequest
0 голосов
/ 28 января 2019

Я нашел похожую тему и решения от Endoro о преобразовании букв в их числовые аналоги, но в моем случае я хочу использовать предопределенный набор чисел, а затем суммировать их сдруг с другом.Возможно ли это?


Что я имел в виду:

"A=1" "B=2" "C=3" "D=9" "E=4" "F=8" "G=2" "H=5" "I=2" "J=5" "K=2" "L=5" "M=4" "N=5" "O=2" "P=8" "Q=1" "R=9" "S=8" "T=7" "U=6" "V=6" "W=1" "X=5" "Y=1" "Z=1"


Вывод должен выглядеть примерно так:

Atom
1 7 2 4
14


Упомянутая выше ссылка:

@ECHO OFF &SETLOCAL ENABLEDELAYEDEXPANSION
SET /p "text=input : "
cls
SET "alfa=0abcdefghijklmnopqrstuvwxyz"
FOR /l %%x IN (1,1,26) DO SET "$!alfa:~%%x,1!=%%x"
SET /a count=0
:loop
SET "char=!text:~%count%,1!"
SET "code=!$%char%!
SET /a count+=1
IF DEFINED char SET "line=!line!%code% "&GOTO :loop
ECHO %text%
ECHO %line%

Я не совсем знаком с полным объемом команды for, поэтому было бы полезно получить пояснения по поводу решения.Я хочу понять, как это работает.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Есть несколько разных способов решить одну и ту же проблему.Это решение очень простое и не требует единой команды for!Каждый простой шаг объясняется в коде.Возможно, самой «сложной» частью :/ является инициализация переменных, имеющих значения букв.

Эта строка:

set init="A=1" "B=2" "C=3" ... "X=5" "Y=1" "Z=1"

is точно такая же строка «начальных значений», которую вы разместили в вопросе.

Эта строка:

set %init: =&set %

- это простая замена, которая изменяет каждый пробел по &set.Это означает, что предыдущая строка изменяется на:

set "A=1"&set "B=2"&set "C=3" ...&set "X=5"&set "Y=1"&set "Z=1"

и, после этого , строка выполняется ... Просто, не так ли?;)

@echo off
setlocal

rem Define initialization string
set init="A=1" "B=2" "C=3" "D=9" "E=4" "F=8" "G=2" "H=5" "I=2" "J=5" "K=2" "L=5" "M=4" "N=5" "O=2" "P=8" "Q=1" "R=9" "S=8" "T=7" "U=6" "V=6" "W=1" "X=5" "Y=1" "Z=1"

rem Initialize variables
set %init: =&set %
set "nums="
set "sum=0"

set /P "text=input: "
echo %text%

:loop

   rem Get first char in text
   set "char=%text:~0,1%"

   rem Get code and add it to sum
   set /A "code=%char%, sum+=code"

   rem Join code to nums
   set "nums=%nums%%code% "

rem Remove first char from text and repeat
set "text=%text:~1%"
IF DEFINED text GOTO :loop

ECHO %nums%
ECHO %sum%

Пример:

input: Atom
Atom
1 7 2 4
14

Пример вывода для вашего примера ввода: точно такой же , который вы перечислили выше...

РЕДАКТИРОВАТЬ : Добавлена ​​новая версия

@echo off
setlocal

rem Define initialization string
set init="A=1" "B=2" "C=3" "D=9" "E=4" "F=8" "G=2" "H=5" "I=2" "J=5" "K=2" "L=5" "M=4" "N=5" "O=2" "P=8" "Q=1" "R=9" "S=8" "T=7" "U=6" "V=6" "W=1" "X=5" "Y=1" "Z=1"

rem Initialize variables
set %init: =&set %

:repeat

set "text= "
set /P "text=input: "
set "text=%text: =%"
if not defined text goto :EOF

set "out="
set "nums="
set "sum=0"

:loop

   rem Get first char in text and join it to out
   set "char=%text:~0,1%"
   set "out=%out%%char% "

   rem Get code and add it to sum
   set /A "code=%char%, sum+=code"

   rem Join code to nums
   set "nums=%nums%%code% "

rem Remove first char from text and repeat
set "text=%text:~1%"
IF DEFINED text GOTO :loop

ECHO %out%
ECHO %nums%
ECHO %sum%
echo/

goto repeat

Пример:

input: Atom
A t o m
1 7 2 4
14

input: My name is Antonio
M y n a m e i s A n t o n i o
4 1 5 1 4 4 2 8 1 5 7 2 5 2 2
53

input:

РЕДАКТИРОВАТЬ : Еще одна более короткая версия, просто для удовольствия ...

@echo off
setlocal EnableDelayedExpansion

rem Define initialization string
set init="A=1" "B=2" "C=3" "D=9" "E=4" "F=8" "G=2" "H=5" "I=2" "J=5" "K=2" "L=5" "M=4" "N=5" "O=2" "P=8" "Q=1" "R=9" "S=8" "T=7" "U=6" "V=6" "W=1" "X=5" "Y=1" "Z=1"

rem Initialize one-letter variables
set %init: =&set %

:repeat

rem Read a line from user
set "text= "
set /P "text=input: "
set "text=%text: =%"
if not defined text goto :EOF

rem Insert a space between letters
set "out="
:loop
   set "out=%out% %text:~0,1%"
   set "text=%text:~1%"
IF DEFINED text GOTO :loop
set "out=%out:~1%"

rem Get the sum: replace the space between letters by a plus sign
set /A "sum=%out: =+%"

rem Show letters separated by space
echo %out%
rem Change spaces by "! !" to show *the values* of the letters via Delayed Expansion
echo !%out: =! !%!
echo %sum%
echo/

goto repeat
0 голосов
/ 29 января 2019

Поскольку вы хотите установить для каждой буквы свое собственное значение, извлечь значение суммы из нового слова и отобразить его, необходимо выполнить несколько шагов.

Первым шагом будетустановить пользовательские строки.Для этого можно использовать базовую петлю for.То, что вы цитировали все ваши письма, служило двойным благом, так как с помощью команды set каждый результат будет отображаться как Set "A=1", Set "B=2", Exc.

For %%A in ("A=1" "B=2" "C=3" "D=9" "E=4" "F=8" "G=2" "H=5" "I=2" "J=5" "K=2" "L=5" "M=4" "N=5" "O=2" "P=8" "Q=1" "R=9" "S=8" "T=7" "U=6" "V=6" "W=1" "X=5" "Y=1" "Z=1") do (
    Set %%A
)

Имейте в виду, что мы удаляемпробелы в предложении (если есть) с set "text=!text: =!" или с синтаксис-замена .

Последний шаг - преобразование каждой буквы в соответствующее значение и сложение их всех.Для этого нам нужно будет вытянуть каждую букву из строки.Используя цикл, мы можем извлечь эти значения и добавить их, используя Set /a "String=!String!+!New Number!".

GetSumUsingCustumNumerics.bat:

@Echo off
@setlocal ENABLEDELAYEDEXPANSION

Rem | Ask User For Word
Set /p "text=input: "
Set "orginaltext=!text!"
set "text=!text: =!"
Cls

Rem | Set Strings
For %%A in ("A=1" "B=2" "C=3" "D=9" "E=4" "F=8" "G=2" "H=5" "I=2" "J=5" "K=2" "L=5" "M=4" "N=5" "O=2" "P=8" "Q=1" "R=9" "S=8" "T=7" "U=6" "V=6" "W=1" "X=5" "Y=1" "Z=1") do (
    Set %%A
)

Rem | Convert Text
set pos=0
:NextChar
Set "Letter=!text:~%pos%,1%!"
Set "Converted=!%Letter%!"
Set "Numbers=!Numbers! !Converted!"
Set /a "Sum=!Sum!+!Converted!"
set /a pos=pos+1

if "!text:~%pos%,1!" NEQ "" goto NextChar
goto Finished

:Finished
Rem | Display Results
Echo Text: !orginaltext!
Echo Letter Values: !Numbers:~1!
Echo Sum: !Sum!

pause>nul
goto :EOF

Ввод:

Hello my name is John

Алгоритм:

A=1 B=2 C=3 D=9 E=4 F=8 G=2 H=5 I=2 J=5 K=2 L=5 M=4 N=5 O=2 P=8 Q=1 R=9 S=8 T=7 U=6 V=6 W=1 X=5 Y=1 Z=1

Выход:

Text: Hello my name is John
Letter Values: 5 4 5 5 2 4 1 5 1 4 4 2 8 5 2 5 5
Sum: 67

Для справки по любому изКоманды выполняют следующее:

  • goto /?
  • set /?
  • for /?
  • if /?
  • Так далее.
...