Как отобразить ввод пользователя в одной строке в назначении паландрома? - PullRequest
0 голосов
/ 14 марта 2012

В Perl я должен определить, является ли пользовательский ввод палиндромом или нет, и он должен отображаться так:

Enter in 7 characters: ghghghg #one line here #
Palindrome! #second line answer#

Но вместо этого это то, что он делает:

Enter in 7 characters: g #one line#
h #second line#
g #third line#
h #fourth line#
g #fifth line#
h #sixth line#
g  Palindrom

e! #seventh line#

Моя проблема, кажется, в строках chomp со всеми переменными, но я просто не могу понять, что делать, и я был в течение нескольких часов. Мне нужно простое решение, но я еще не перешел к массивам, поэтому нужно несколько простых, чтобы это исправить. Спасибо

И вот что у меня есть, формула работает, но она продолжает печатать новую строку для каждого символа:

use strict; 
use warnings;

my ($a, $b, $c, $d, $e, $f, $g);
print "Enter in 7 characters:";

chomp ($a = <>); chomp ($b = <>); chomp ($c = <>); chomp ($d = <>); chomp ($e = <>); chomp ($f = <>); chomp ($g = <>);

if (($a eq $g) && ($b eq $f) && ($c eq $e) && ($d eq $d) && ($e eq $c) && ($f eq $b) && ($g eq $a))

{print "Palindrome! \n";}
else
{print "Not Palindrome! \n";}

Ответы [ 3 ]

3 голосов
/ 14 марта 2012

Если вы собираетесь определить, совпадает ли слово в обратном направлении, могу ли я предложить использовать reverse и lc?

chomp(my $word = <>);
my $reverse = reverse $word;

if (lc($word) eq lc($reverse)) {
    print "Palindrome!";
} else {
    print "Not palindrome!";
}
1 голос
/ 14 марта 2012

Perl известен своими TIMTOWTDI . Вот еще два способа сделать это:

print "Enter 7 characters: ";
chomp(my $i= <STDIN>);

say "reverse: ",  pal_reverse($i) ? "yes" : "no";
say "regex: ", pal_regex($i) ? "yes" : "no";

sub pal_reverse {
    my $i = (@_ ? shift : $_);
    return $i eq reverse $i;
}

sub pal_regex {
    return (@_ ? shift() : $_) =~ /^(.?|(.)(?1)\2)$/ + 0;
}
1 голос
/ 14 марта 2012
use strict;
use warnings;
use feature 'say';

print "Please enter 7 characters : ";

my $input = <>;    # Read in input
chomp $input;      # To remove trailing "\n"

# Season with input validation
warn 'Expected 7 characters, got ', length $input, ' instead'
  unless length $input == 7;

# Determine if it's palindromic or not

say   $input eq reverse $input
    ? 'Palindrome'
    : 'Not palindrome' ;

TIMTOWTDI для склонных к рекурсии:

sub is_palindrome {

    return 1 if length $_[0] < 2;   # Whole string is palindromic

    goto \&is_palindrome
      if substr $_[0], 0, 1, '' eq substr $_[0], -1, 1, ''; # Check next chars

    return;                          # Not palindromic if we reach here
}

say is_palindrome( 'ghghghg' ) ? 'Palindromic' : 'Not palindromic' ;

И perldoc perlretut для тех, кто не:)

Рекурсивные шаблоны

Эта функция (представленная в Perl 5.10) значительно расширяет возможности сопоставления с образцами Perl.Обращаясь к какой-либо другой группе захвата в любом месте шаблона с помощью конструкции (?group-ref), шаблон внутри указанной группы используется в качестве независимого подшаблона вместо самой ссылки на группу.Поскольку ссылка на группу может содержаться внутри группы, на которую она ссылается, теперь можно применять сопоставление с шаблоном для задач, которые до сих пор требовали рекурсивного синтаксического анализатора.

Чтобы проиллюстрировать эту функцию, мы разработаем шаблон, который соответствуетесли строка содержит палиндром.(Это слово или предложение, которое, игнорируя пробелы, знаки препинания и регистр, читает то же самое, что и вперед. Мы начинаем с наблюдения, что пустая строка или строка, содержащая только один символ слова, является палиндромом. В противном случае она должна иметьслово «впереди» и то же в конце, с другим палиндромом между ними.

/(?: (\w) (?...Here be a palindrome...) \g{-1} | \w? )/x

Добавление \W* на обоих концах для устранения того, что следует игнорировать, у нас уже есть полный шаблон:

my $pp = qr/^(\W* (?: (\w) (?1) \g{-1} | \w? ) \W*)$/ix;
for $s ( "saippuakauppias", "A man, a plan, a canal: Panama!" ){
    print "'$s' is a palindrome\n" if $s =~ /$pp/;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...