오름차순으로 된 숫자 벡터가 있습니다(t8_이라고 부르세요).
2 7 8 9 11 15 34 91 91 92 94
문제는 일부 숫자가 두 번 나타난다는 것입니다. 삭제하고 싶지 않지만 두 개의 다른 번호여야 합니다.아니요부동 소수점. 내 첫 번째 생각은 벡터를 반복하는 것이었습니다.
which(duplicated(t8)) - that would be 9 and then go on
t8[which(duplicated(t8))]<-t8[which(duplicated(t8))]+1
다음 벡터는
2 7 8 9 11 15 34 91 92 92 94
동일한 과정을 반복합니다.
which(duplicated(t8)) - that would be 10 and the go on
t8[which(duplicated(t8))]<-t8[which(duplicated(t8))]+1
벡터가 다음과 같을 때
2 7 8 9 11 15 34 91 92 993 94
나는 시도했다 sort -u
( sort -nu
작동하지 않는다).
더 이상 중복된 숫자가 없을 때까지 대화식으로 이 작업을 수행할 수 있는 Perl 또는 Python 방법이 있습니까?
함수에 넣을 파일로 이 작업을 수행하고 싶습니다... 편집...
내 벡터 파일에서는 답변이 작동하지 않습니다. https://www.dropbox.com/s/vp67eiw4ns9rr07/num?dl=0
답변1
다음 스크립트는 표준 입력의 각 줄에서 정수 벡터를 읽습니다.
#!/bin/bash
while read -a vec; do
# INT_MIN for bash: 32-bit bash also supports 64-bit integers.
min=$((-1<<63))
for ((i = 0; i < ${#vec[@]}; i++)); do
(( min = vec[i] = vec[i] > min ? vec[i] : min + 1 ))
done
echo "${vec[@]}"
done
입력 예:
2 7 8 9 11 15 34 91 91 92 94
1 1 1 1 1 1 1 1 1 1
91 91 91
-1000 -900 -100 -100 -100 0 0 0
5 4 3 2 1 0
1 1 1 1 1
예제 출력:
$ ./script.sh < input.txt
2 7 8 9 11 15 34 91 92 93 94
1 2 3 4 5 6 7 8 9 10
91 92 93
-1000 -900 -100 -99 -98 0 1 2
5 6 7 8 9 10
1 2 3 4 5
출력이 예상했거나 원했던 것과 다른 경우 알려 주시기 바랍니다.
고쳐 쓰다: 이 버전은 한 줄씩 처리하는 대신 stdin의 모든 줄에 있는 모든 정수를 하나의 입력으로 처리합니다. 어떤 길이의 줄도 수용할 수 있습니다.
#!/bin/sh
min=$((-1<<63))
tr -s '[:space:]' '\n' |
while read val; do
case ${val#[-+]} in
''|*[!0-9]*) continue ;;
esac
min=$((val > min ? val : min + 1))
echo $min
done |
paste -s -d' ' -
세션 예:
$ echo -e '2 7 8 9 11 15 34 91 91 92 94' | ./script.sh
2 7 8 9 11 15 34 91 92 93 94
$ echo -e '91 91 91' | ./script.sh
91 92 93
$ echo -e '5 4 3 2 1 0' | ./script.sh
5 6 7 8 9 10
$ echo -e '-1000 -900 -100 -100 -100 0 0 0 +100 +100 +100' | ./script.sh
-1000 -900 -100 -99 -98 0 1 2 100 101 102
$ echo -e ' 1 1\n 1\n 1 \n1 \n1 ' | ./script.sh
1 2 3 4 5 6
$ echo -e 'a 1 b 2 3 c' | ./script.sh
1 2 3
답변2
어쩌면 이것이 당신에게 필요한 것일 수도 있습니다:
#!usr/bin/perl
use strict;
use warnings;
my@list=qw(2 7 8 9 11 15 34 91 91 92 94);
my%hash;
print "Input:\n@list\n";
foreach(@list)
{
#count occurences for each element
$hash{$_}++;
}
foreach my$key (keys %hash)
{
TURN: while($hash{$key}>1)
{
#add a number between 1 and 10 to the duplicated value if
#this value does not already exist
for(my$i=1;$i<=10;$i++)
{
if(exists $hash{$key+$i})
{
next;
}
else
{
$hash{$key}--;
$hash{$key+$i}=1;
next TURN;
}
}
}
}
my@result=sort{$a<=>$b}(keys %hash);
print "Result:\n@result\n";
이 코드는 각 요소의 발생 횟수를 계산하고 값에 1에서 10 사이의 숫자를 추가하여 아직 존재하지 않는 요소를 가져옵니다.