Нажмите значок «Отладка приложения» рядом со значком «Запуск приложения» или нажмите SHIFT + F9. Это, кажется, помогает мне.
Не уверен, что у меня будет время / силы, чтобы дополнить это фактическим кодом, но вот моя идея:
Что-нибудь длиннее, и мы начинаем терять информацию в тексте. Поэтому выполните минимальное количество следующих шагов, чтобы уменьшить строку до длины, которую затем можно сжать / закодировать с помощью вышеуказанных методов. Кроме того, не выполняйте эти замены для всей строки , если простое выполнение их для подстроки сделает ее достаточно короткой (я бы, вероятно, прошел по строке назад).
Хорошо, теперь мы ' мы удалили столько лишних символов, сколько мы можем разумно избавиться. Теперь мы собираемся сделать еще несколько резких сокращений:
Хорошо, это все, что мы можем, и получить текст должен быть читаемым . Помимо этого, давайте посмотрим, сможем ли мы придумать способ, чтобы текст напоминал оригинал, даже если он в конечном итоге не дешифрируемый (опять же, выполните этот единственный символ на время от конца строки и остановитесь, когда она станет достаточно короткой):
Это должно оставить строку, состоящую ровно из 5 возможных значений (a, l, n, p и пробел), что должно позволить нам кодировать довольно длинные строки.
Помимо этого, нам просто нужно было бы усечь.
Единственный другой метод, о котором я могу думать, - это кодирование на основе словаря для общих слов или групп букв. Это может дать нам некоторую выгоду для правильных предложений, но, вероятно, не для произвольных строк.
Помимо этого, нам просто нужно было бы усечь.
Единственный другой метод, о котором я могу думать, - это кодирование на основе словаря для общих слов или групп букв. Это может дать нам некоторую выгоду для правильных предложений, но, вероятно, не для произвольных строк.
Помимо этого, нам просто нужно было бы усечь.
Единственный другой метод, о котором я могу думать, - это кодирование на основе словаря для общих слов или групп букв. Это может дать нам некоторую выгоду для правильных предложений, но, вероятно, не для произвольных строк.
#! perl
use strict;
use warnings;
use 5.010;
use Getopt::Long;
use Pod::Usage;
use autodie;
my %opts = (
infile => '-',
outfile => '-',
);
GetOptions (
'encode|e' => \$opts{encode},
'decode|d' => \$opts{decode},
'infile|i=s' => \$opts{infile},
'outfile|o=s' => \$opts{outfile},
'help|h' => \&help,
'man|m' => \&man,
);
unless(
# exactly one of these should be set
$opts{encode} xor $opts{decode}
){
help();
}
{
my $infile;
if( $opts{infile} ~~ ['-', '&0'] ){
$infile = *STDIN{IO};
}else{
open $infile, '<', $opts{infile};
}
my $outfile;
if( $opts{outfile} ~~ ['-', '&1'] ){
$outfile = *STDOUT{IO};
}elsif( $opts{outfile} ~~ '&2' ){
$outfile = *STDERR{IO};
}else{
open $outfile, '>', $opts{outfile};
}
if( $opts{decode} ){
while( my $line = <$infile> ){
chomp $line;
say {$outfile} $line;
}
}elsif( $opts{encode} ){
while( my $line = <$infile> ){
chomp $line;
$line =~ s/[\W_]+/ /g;
say {$outfile} $line;
}
}else{
die 'How did I get here?';
}
}
sub help{
pod2usage();
}
sub man{
pod2usage(1);
}
__END__
=head1 NAME
sample.pl - Using GetOpt::Long and Pod::Usage
=head1 SYNOPSIS
sample.pl [options] [file ...]
Options:
--help -h brief help message
--man -m full documentation
--encode -e encode text
--decode -d decode text
--infile -i input filename
--outfile -o output filename
=head1 OPTIONS
=over 8
=item B<--help>
Print a brief help message and exits.
=item B<--man>
Prints the manual page and exits.
=item B<--encode>
Removes any character other than /\w/.
=item B<--decode>
Just reads from one file, and writes to the other.
=item B<--infile>
Input filename. If this is '-' or '&0', then read from STDIN instead.
If you use '&0', you must pass it in with quotes.
=item B<--outfile>
Output filename. If this is '-' or '&1', then write to STDOUT instead.
If this is '&2', then write to STDERR instead.
If you use '&1' or '&2', you must pass it in with quotes.
=back
=head1 DESCRIPTION
B<This program> will read the given input file(s) and do something
useful with the contents thereof.
=cut
echo Hello, this is, some text | perl sample.pl -e Hello this is some text
Вот мой вариант для реального английского.
Каждая кодовая точка имеет примерно 1100000 возможных состояний. Что ж, это много места.
Итак, мы объединяем весь исходный текст и получаем из него синсеты Wordnet. Числа превращаются в английские имена («сорок два»). 1,1M состояний позволят нам хранить идентификатор synset (который может быть от 0 до 82114), позицию внутри synset (я полагаю, ~ 10 вариантов) и тип synset (который является одним из четырех - существительное, глагол, прилагательное, наречие) . У нас даже может быть достаточно места для хранения исходной формы слова (например, идентификатора времени глагола).
Декодер просто передает синсеты в Wordnet и извлекает соответствующие слова.
Исходный текст:
A white dwarf is a small star composed mostly of electron-degenerate matter. Because a
white dwarf's mass is comparable to that of the Sun and its volume is comparable to that
of the Earth, it is very dense.
Становится:
A white dwarf be small star composed mostly electron degenerate matter because white
dwarf mass be comparable sun IT volume be comparable earth IT be very dense
(проверено с Интернет Wordnet ). Этот «код» должен занимать 27 кодовых точек. Конечно, вся тарабарщина вроде «lol» и «L33T» будет потеряна навсегда.