2023.06.07 R풀이 추가
| Problem
두 개의 서열을 준다
나머지 서열 하나가 그보다 더 긴 서열에 매치가 되면, 그 매치된 자리의 위치를 출력하다(순서는 왼 -> 오)
| 예제데이터와 결과
Sample Dataset
GATATATGCATATACTT
ATAT
Sample Output
2 4 10
| Python
with open('rosalind_subs.txt', 'r') as f :
s = f.readline()
t = f.readline()
t_num = len(t)
tt = t[0:t_num-1] # '\n' 제거
for i in range(len(s)) :
if s[i:i+t_num-1] == tt : print(i+1,end=" ")
추천수 많이 받은 답 by Leandro Lima
s1,s2 = open('rosalind_subs.txt').read().split('\r\n')
for i in range(len(s1)):
if s1[i:].startswith(s2):
print i+1,
by ikorotkov
input_file = 'rosalind_SUBS.txt'
with open(input_file) as file:
dna1 = file.readline().strip()
dna2 = file.readline().strip()
i = dna1.find(dna2)
while i != -1:
print i + 1,
i = dna1.find(dna2, i + 1)
앗 strip()하면 \n이 제거되는구나!
까먹었다...
| R
a <- readLines("./Filename.txt")
l1 <- a[[1]] %>% strsplit("") %>% unlist()
primer <- a[[2]]
a <- c()
c <- c()
max <- length(l1)-(nchar(primer)-1)
primer_len <- nchar(primer)-1
for (i in 1:max){
a <- paste(l1[i:(i+primer_len)],collapse = "")
if (a == primer) {
c <- c(c, i)
}
}
c
R은 Python과 다르게 출력 앞에 [1] 표시가 붙는다. 그래서 print형태로 i값을 출력하기보다는 벡터에 담은 후 그 벡터를 출력하는 형식으로 가야 한다.
+) ChatGPT에게 멋있게 요약해달라고 했다.
text <- unlist(strsplit(a[[1]], ""))
primer <- a[[2]]
find_indices <- function(text, primer) {
primer_len <- nchar(primer) - 1
max <- length(text) - primer_len
c <- which(sapply(1:max, function(i) paste(text[i:(i+primer_len)], collapse = "") == primer))
return(c)
}
c <- find_indices(text, primer)
for의 반복은 sapply로 바꾸고, 그 안에 function을 만들어서 그 조건에 해당하는 1:max 사이의 값들을 c에 담았다.
+) 두 함수의 시간 비교하기
text <- unlist(strsplit(a[[1]], ""))
primer <- a[[2]]
find_indices <- function(text, primer) {
primer_len <- nchar(primer) - 1
max <- length(text) - primer_len
c <- which(sapply(1:max, function(i) paste(text[i:(i+primer_len)], collapse = "") == primer))
return(c)
}
c <- find_indices(text, primer)
find_indices_origin <- function(text, primer) {
primer_len <- nchar(primer) - 1
max <- length(text) - primer_len
a <- c()
c <- c()
for (i in 1:max){
a <- paste(l1[i:(i+primer_len)],collapse = "")
if (a == primer) {
c <- c(c, i)
}
}
return(c)
}
c <- find_indices(text, primer)
c <- find_indices_origin(text, primer)
result <- system.time(find_indices(text, primer))
result
# 사용자 시스템 elapsed
# 0.03 0.00 0.03
result2 <- system.time(find_indices_origin(text, primer))
# 사용자 시스템 elapsed
# 0.03 0.00 0.03
시간은 큰 차이가 없다.
반응형