1

選択した文字を、決められたスペース(正確に12文字)を埋めるために必要な数の別の文字のコピーに置き換える必要があります。

たとえば、char'1'を0個以上のchar'0'に置き換えます。

ABC1           =>  ABC000000000
ABC1JKL        =>  ABC000000JKL
1JKL           =>  000000000JKL
1000           =>  000000000000
ABCDEFGHIJKL1  =>  ABCDEFGHIJKL
1ABCDEFGHIJKL  =>  ABCDEFGHIJKL
ABCDEFGHIJKL   =>  ABCDEFGHIJKL
1EFG1          =>  undefined (do not bother with this case)
EFG            =>  undefined (do not bother with this case)
4

3 に答える 3

1

bashのパラメーター展開の使用:

#! /bin/bash
inputs=(ABC1             
    ABC1JKL          
    1JKL             
    1000             
    ABCDEFGHIJKL1    
    1ABCDEFGHIJKL    
    ABCDEFGHIJKL     
)

outputs=(ABC000000000
    ABC000000JKL
    000000000JKL
    000000000000
    ABCDEFGHIJKL
    ABCDEFGHIJKL
    ABCDEFGHIJKL
)

for ((i=0; i<${#inputs[@]}; i++)) ; do
    x=${inputs[i]}
    while [[ ${x:12} ]] ; do               # Shorten if too long
        x=${x/1}
    done
    while [[ ${x:11} == '' ]] ; do         # Insert 1's if too short
        x=${x/1/11}
    done
    x=${x//1/0}
    [[ $x == ${outputs[i]} ]] || echo Different $x
done
于 2012-12-26T20:24:53.877 に答える
1

awkの解決策:

{
  temp = $1
  gsub (/[^1]/, "", temp)
  if (length(temp) == 1) {
    l = 12 - (length ($1) - 1)
    if (l > 0) {
      t = "000000000000"
      sub (/1/, substr (t,0,l), $1)
    }
  }
  print $1
}

そしてbash/sedの解決策:

#!/bin/bash

while read n; do
  temp=$(echo $n | sed 's/[^1]//g')
  if [[ ${#temp} == 1 ]]; then
    l=$(( 12 - $(( ${#n} - 1)) ))
    if [[ $l > 0 ]]; then
      t=000000000000
      n=$(echo $n | sed "s/1/${t:0:$l}/")
    fi
  fi
  echo $n
done
于 2012-12-26T20:32:20.240 に答える
1

誰もが自分の個人的な答えを出しているので、これが私自身の醸造(100%純粋なbash)であり、おそらくコードゴルフの良い候補です(そしておそらく最も効率的なものの1つです-ループ、パイプ、サブシェルは1つだけです(を参照)それを取り除くための投稿の終わり)):

$ string="ABC1"
$ echo "${string/1/$(printf "%.$((13-${#string}))d" 0)}"
ABC000000000

私は勝ちますか?

このワンライナーが機能すると信じられない場合は、次のようにします。

$ while read string; do printf "%s%$((13-${#string}))s => %s\n" "$string" '' "${string/1/$(printf "%.$((13-${#string}))d" 0)}"; done < <(printf "%s\n" ABC1 ABC000000000 ABC1JKL 1JKL 1000 ABCDEFGHIJKL1 1ABCDEFGHIJKL ABCDEFGHIJKL 1EFG1 EFG)
ABC1          => ABC000000000
ABC000000000  => ABC000000000
ABC1JKL       => ABC000000JKL
1JKL          => 000000000JKL
1000          => 000000000000
ABCDEFGHIJKL1 => ABCDEFGHIJKL
1ABCDEFGHIJKL => ABCDEFGHIJKL
ABCDEFGHIJKL  => ABCDEFGHIJKL
1EFG1         => 00000000EFG1
EFG           => EFG

このメソッドでサブシェルを取り除きたいですか?簡単ですが、補助変数が必要になります。

$ string="ABC1"
$ printf -v aux "%.$((13-${#string}))d" 0
$ echo "${string/1/$aux}"
ABC000000000
于 2012-12-26T20:56:34.660 に答える