Вот простой скрипт, который работает для вашего примера. Очевидно, вы хотели бы больший корпус правильных слов. Кроме того, вы, вероятно, захотите иметь ветку elif
, которая оглянулась бы на предыдущее слово, если присоединение к следующему слову не смогло исправить не-слово.
from string import punctuation
word_list = "big list of words including a programming language is general purpose"
valid_words = set(word_list.split())
bad = "Java is a prog ramming lan guage. C is a gen eral purpose la nguage."
words = bad.split()
out_words = []
i = 0
while i < len(words):
word = words[i]
if word not in valid_words and i+1 < len(words):
next_word = words[i+1]
joined = word + next_word
if joined.strip(punctuation) in valid_words:
word = joined
i += 1
out_words.append(word)
i += 1
good = " ".join(out_words)
print(good)
Я озадачен.
Я посмотрел ссылку, прочитал описание, и это хорошая утилита.
Но вы говорите просто могу переписать эту функцию в спецификации? Спецификация кажется довольно ясной,
Здесь:
/* This code is public domain -- Will Hartung 4/9/09 */
#include <stdio.h>
#include <stdlib.h>
size_t getline(char **lineptr, size_t *n, FILE *stream) {
char *bufptr = NULL;
char *p = bufptr;
size_t size;
int c;
if (lineptr == NULL) {
return -1;
}
if (stream == NULL) {
return -1;
}
if (n == NULL) {
return -1;
}
bufptr = *lineptr;
size = *n;
c = fgetc(stream);
if (c == EOF) {
return -1;
}
if (bufptr == NULL) {
bufptr = malloc(128);
if (bufptr == NULL) {
return -1;
}
size = 128;
}
p = bufptr;
while(c != EOF) {
if ((p - bufptr) > (size - 1)) {
size = size + 128;
bufptr = realloc(bufptr, size);
if (bufptr == NULL) {
return -1;
}
}
*p++ = c;
if (c == '\n') {
break;
}
c = fgetc(stream);
}
*p++ = '\0';
*lineptr = bufptr;
*n = size;
return p - bufptr - 1;
}
int main(int argc, char** args) {
char *buf = NULL; /*malloc(10);*/
int bufSize = 0; /*10;*/
printf("%d\n", bufSize);
int charsRead = getline(&buf, &bufSize, stdin);
printf("'%s'", buf);
printf("%d\n", bufSize);
return 0;
}
15 минут, и я не писал C за 10 лет. Он незначительно нарушает контракт getline в том смысле, что он только проверяет, равен ли lineptr NULL, а не NULL и n == 0. Вы можете исправить это, если хотите. (Другой случай не имел большого смысла для меня, я думаю, вы могли бы вернуть -1 в этом случае.)
Заменить '\ n' на переменную для реализации "getdelim".
Do люди все еще пишут код?