【问题标题】:batch file to scramble a sentence批处理文件打乱句子
【发布时间】:2014-03-31 08:52:15
【问题描述】:

我正在尝试创建一个批处理文件,该文件将采用预定义的句子并将其打乱,然后将其回显给用户。

例如,预定义的句子: 我真的很喜欢写批处理文件

回显给用户: 享受我编写的批处理文件

我了解 %RANDOM% 变量的工作原理以及循环,但是因为我不知道句子将有多长,也不了解如何在批处理文件中定义/填充数组,所以我不知道在哪里开始。

请帮我补上我所知道的缺失部分。谢谢!

【问题讨论】:

    标签: arrays loops batch-file scramble


    【解决方案1】:
    @echo off
        setlocal enableextensions enabledelayedexpansion
    
        call :scramble "I really enjoy writing batch files" scrambled
    
        echo %scrambled%
    
        endlocal
        exit /b 
    
    :scramble sentence returnVar
        setlocal enabledelayedexpansion
        set "output=" & for /f "tokens=2" %%y in ('cmd /q /v:on /c "for %%w in (%~1) do echo(^!random^! %%w"^|sort') do set "output=!output! %%y"
        endlocal & set "%~2=%output:~1%"
        exit /b 
    

    If 实例化一个 cmd,该 cmd 输出每个单词前面都有一个随机数。此列表已排序,删除数字并连接单词。所有这些都包含在一个带有输入和输出参数的子程序中。

    对于其他语言中使用的常用方法,将字符串分成几部分,存储到数组中(有点,在批处理脚本中没有数组),洗牌和连接,子程序可以是这样的

    :scramble sentence returnVar
        setlocal enabledelayedexpansion
        set "counter=0" & for %%w in (%~1) do ( set "_word[!random!_!counter!]=%%w" & set /a "counter+=1" )
        set "output="   & for /f "tokens=2 delims==" %%w in ('set _word[') do set "output=!output! %%w"
        endlocal & set "%~2=%output:~1%"
        exit /b 
    

    【讨论】:

    • 这非常好用!我理解循环,你能向我解释一下随机化是如何工作的吗?它是如何在循环中不重复任何单词的?
    • @user3361720,在这两种情况下都使用了一个小技巧。每个单词前面都有一个随机数,在第一种情况下直接在字符串输出中,在第二种情况下在“数组”的索引中。然后在这两种情况下,列表是有序的(并且由于随机数在单词之前,最终顺序是随机的),然后迭代并连接单词。由于每个单词都在自己的行中,因此不会发生重复(当然,除非在输入句子中重复)。
    【解决方案2】:

    这是一个简单的方法 - 它不处理有毒字符,但对于您的字符串来说没问题。

    @echo off
    call :scramble I really enjoy writing batch files
    goto :EOF 
    :scramble
    set "scrambled%random%=%1"
    shift
    if not "%~1"=="" goto :scramble
    for /f "tokens=1,* delims==" %%a in ('set scrambled') do set /p "=%%b "<nul
    echo(
    pause
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2017-08-01
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多