Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
2 / 2 / 0
Регистрация: 30.05.2022
Сообщений: 35

Из слова получить все подслова, которые можно составить из букв данного слова

04.04.2023, 08:39. Показов 1105. Ответов 8

Студворк — интернет-сервис помощи студентам
Дано слово. Получить из него все подслова, которые можно составить из букв данного слова.

Например, исходное слово «свидетельство». Тогда возможны следующие подслова: водитель, дети, свидетель, диво и т.д.

Для отсеивания бессмысленных комбинаций возможно использование файла «нормальных» слов.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.04.2023, 08:39
Ответы с готовыми решениями:

Задача на Паскаль
Удалено модератором. Помогите решить задачу на Паскале

Задача про файлы Паскаль
Дан файл f, компоненты которого являются целыми числами. Получить в файле g положительные четные компоненты файла f. Помогите сделать...

Сложная задача по программированию паскаль
Йи Гроег — обыкновенный, ничем не примечательный мальчик с планеты Рутнок, который, как и все юноши, мечтал о великих делах. По достижению...

8
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
04.04.2023, 09:09
Pascal
1
2
3
4
5
6
##
var words := ReadLines('нормальные.txt').ToHashSet;
var s := ReadString;
(1..s.Length).SelectMany(len->s.Permutations(len))
.Where(w->w in words)
.PrintLines;
По сути то же что тут:
Дано слово. Получить из него все подслова, путем вычеркивания части букв. Например, исходное слово «свидетельство»
Но вместо .Combinations (часть букв в том же порядке) - тут надо .Permutations (часть букв перемешаны всеми способами), иначе из "свидетельство" нельзя получить "водитель".
2
2 / 2 / 0
Регистрация: 30.05.2022
Сообщений: 35
04.04.2023, 09:33  [ТС]
Вы не поняли, суть задачи перебор все возможных комбинаций букв слова и проверка равно ли это слова "нормальному"
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
04.04.2023, 09:52
И как это отличается от того что я сделал?
1
2 / 2 / 0
Регистрация: 30.05.2022
Сообщений: 35
27.04.2023, 16:19  [ТС]
Вот есть такие вот наброски надо сделать что-то с этим перебором,например, брать множество и по индексу букв состовлять слова и сравнивать с "нормальными словами"

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
const 
  n = 9; //количество букв в слове "свидетель"
  slovo = 'свидетель'; //исходное слово
 
Type SetInt = Set of byte; //тип данных для множества байтов
Var 
    p:array[1..n] of integer; //массив для хранения индексов букв в слове
    i,q,count:integer; //переменные для циклов и подсчета количества нормальных слов
    f:text; //переменная для работы с файлом
    normWords:array[1..20] of string; //массив для хранения нормальных слов
    buf:string; //строка для считывания слов из файла
 
procedure Perebor(k,q:integer;m:SetInt); //процедура перебора всех возможных комбинаций 
Var 
  i,j,w,el:integer; //переменные для циклов и работы с буквами
  nw:string; //строка для формирования слова из текущей комбинации 
begin
  if k > q then begin //если достигнута нужная длина комбинации 
    for i:=1 to q do 
      write(p[i]);writeln; //выводим индексы букв на экран
      Exit //и выходим из процедуры
  end;
 
  nw:='';
  for j:= 1 to Length(p) do //формируем слово из текущей комбинации индексов
  begin
    el:= p[j];
    nw[j]:= slovo[el];
  end;
 
  for w:= 1 to count do //проверяем, является ли полученное слово нормальным
  begin
    if nw = normWords[w] then //если да
    begin
      writeln(nw); //выводим его на экран
      Exit; //и выходим из процедуры
    end;
  end;
 
  for i:= 1 to n do //перебираем все еще не использованные буквы
    if i in m then begin
      p[k]:= i; //записываем индекс буквы в массив
      Perebor(k+1,q,m-[i]); //вызываем рекурсивно процедуру для следующего индекса в массиве
    end;
end;
 
 
begin
  //Считываем слова из файла в массив нормальных слов
  assign(f, 'Words.txt'); //открываем файл для чтения
  reset(f); //открываем файл
  while not eof(f) do //пока не достигнут конец файла
  begin
    readln(f, buf); //считываем строку из файла в переменную buf
 
    if buf <> '' then //если строка не пустая
    begin
      count := count + 1; //увеличиваем счетчик нормальных слов на 1
      normWords[count]:= buf; //сохраняем считанное нормальное слово в массив
    end;  
  end;
  close(f); //закрываем файл
 
  //Вывод нормальных слов
  //for i:=1 to count do
  //  writeln(normWords[i]);
 
  //Перебор букв
  for q:=1 to n do //перебираем все возможные длины комбинаций букв от 1 до 9
    Perebor(1,q,[1..n]); //вызываем процедуру Perebor для текущей длины комбинации 
end.
Тут еще реализована запись слов в массив, проблема именно с переводом индексов в комбинации букв и сравниванием с нормальными словами
0
Модератор
10442 / 5734 / 3406
Регистрация: 17.08.2012
Сообщений: 17,442
27.04.2023, 22:04
Danilkaa13, ???

Вам Sun Serega написал программу строго по Вашему заданию на Pascal ABC.NET, то есть, как Вы и просили, "перебор все возможных комбинаций букв слова и проверка равно ли это слова "нормальному"". Вы же пытаетесь сделать то же самое, но на "древнепаскальском".

Что не так? Похоже, Вы не понимаете, что Вам написал Sun Serega?

Скорее всего, Вас обучали Turbo Pascal, а в качестве бесплатного компилятора порекомендовали Pascal ABC.NET.

Рекомендую Вам выяснить, какому диалекту паскаля Вас учили, и писать в соответствующий раздел. Тогда Вам будут писать на том диалекте, который Вы знаете, а не на неизвестном Вам Pascal ABC.NET.

И ещё. Темы называйте осмысленно.
1
2 / 2 / 0
Регистрация: 30.05.2022
Сообщений: 35
27.04.2023, 22:55  [ТС]
Да, возможно вы правы, среда Pascal ABC.NET, а язык "древнепаскальский" как вы сказали.
Но ответ все равно остается открытым, скорее всего не правильно указал тему вопроса.
0
Модератор
10442 / 5734 / 3406
Регистрация: 17.08.2012
Сообщений: 17,442
04.05.2023, 19:47
Лучший ответ Сообщение было отмечено Danilkaa13 как решение

Решение

Желаете терять время - пишите сюда, желаете получить нужный Вам ответ - пишите в тот раздел, который изучали, либо, если Вам не удастся узнать, что же Вы всё-таки учили, то пишите в общий раздел паскаля.

Для любого диалекта паскаля:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
var
  w, n, m: string;
  i, p: integer;
  found: boolean;
  t: Text;
begin
  write('Введите слово: ');
  readln(w);
  found := false;
  assign(t, 'normal.txt');
  reset(t);
  writeln('Слова, которые можно составить из слова "', w, '":');
  while not EoF(t) do
    begin
      readln(t, n);
      m := n;
      for i := 1 to length(w) do
        begin
          p := pos(w[i], m);
          if p > 0 then delete(m, p, 1)
        end;
      if length(m) = 0 then
        begin
          writeln(n);
          found := true
        end
    end;
  close(t);
  if not found then writeln('<не найдены>');
  readln
end.
Текстовый файл normal.txt создайте в блокноте, и сохраните его в кодировке ANSI в папку с программой. Каждое слово располагайте с новой строки, в файле не должно быть пробелов и пустых строк. Программа находит слова только из этого файла, регистр символов учитывается. Проще всего как в файле, так и в программе при вводе слова, использовать только маленькие буквы.
1
2 / 2 / 0
Регистрация: 30.05.2022
Сообщений: 35
05.05.2023, 12:04  [ТС]
Спасибо, за помощь. Написал сам, код приняли)
Выложу свой код ниже, может пригодится кому-нибудь, возможно не лучший, зато сам.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
const
  n = 13;
  slovo = 'свидетельство';
 
type
  SetChar = Set of char;
  SetString = Set of string;
 
var
  p: array[1..n] of char;
  i, q, countNormWord: integer;
  f: text;
  normWords: array[1..93400] of string;
  buf: string;
  usedWords: SetString;
 
procedure Perebor(k, q: integer; m: SetChar);
var
  i, j, w: integer;
  nw: string;
begin
  if k > q then 
  begin
    nw := '';
    for i := 1 to q do 
      nw := nw + p[i];
    if nw in usedWords then
      Exit;
    for w := 1 to countNormWord do
    begin
      if nw = normWords[w] then
      begin
        writeln(nw);
        usedWords := usedWords + [nw];
        Exit;
      end;
    end;
    Exit
  end;
  
  for i := 1 to Length(slovo) do 
    if slovo[i] in m then 
    begin
      p[k] := slovo[i];
      Perebor(k + 1, q, m - [slovo[i]]);
    end;
end;
 
begin
  // Считываем слова из файла в массив нормальных слов
  assign(f, 'Slova.txt');
  reset(f);
  while not eof(f) do
  begin
    readln(f, buf);
    if buf <> '' then 
    begin
      countNormWord := countNormWord + 1;
      normWords[countNormWord] := buf;
    end;  
  end;
  close(f);
  
  // Перебор букв
  for q := 1 to n do
  begin
    // Создаем множество символов из строки slovo
    var m: SetChar;
    m := [];
    for i := 1 to Length(slovo) do
      m := m + [slovo[i]];
    usedWords := [];
    Perebor(1, q, m);
  end;
end.
Файл со словами для проверки можете создать сами.
С большими словами работает долго, что очевидно.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.05.2023, 12:04
Помогаю со студенческими работами здесь

Задача ПАСКАЛЬ ABC Вычислить сумму ряда первых n членов

С клавиатуры вводят пять чисел. Вывести на экран модули отрицательных. Задача на языке Паскаль и составить блок-схему
С клавиатуры вводят пять чисел. Вывести на экран модули отрицательных. Решить задачу на языке Паскаль и составить блок-схему. ...

задача на паскаль
Помогите пожалуйста решить задачу на паскаль вариант 5. Буду очень благодарна

Задача Паскаль
Задано время в часах, минутах и секундах (h, m, s) (0 ≤ h ≤ 23, 0 ≤ m, s ≤ 59). Определить время, на одну секунду больше заданного!

задача паскаль
написать программу в которой компьютер должен вывести &quot;введите длину треугольника&quot; и зажечь курсор после ввода в новой строке...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru