Рубинский вопрос интервью

Я получил этот вопрос в предыдущем интервью и не смог его сделать, любая идея?

  1. Что это делает:

    `$=`;$_=\%!;($_)=/(.)/;$==++$|;($.,$/,$,,$\,$",$;,$^,$#,$~,$*,$:,@%)=( 
    $!=~/(.)(.).(.)(.)(.)(.)..(.)(.)(.)..(.)......(.)/,$"),$=++;$.++;$.++; 
    $_++;$_++;($_,$\,$,)=($~.$"."$;$/$%[$?]$_$\$,$:$%[$?]",$"&$~,$#,);$,++ 
    ;$,++;$^|=$";`$_$\$,$/$:$;$~$*$%[$?]$.$~$*${#}$%[$?]$;$\$"$^$~$*.>&$=` 
    

Ответы

Ответ 1

Это код Perl, который выводит "Просто другой хакер".

В то время как большинство переменных $_, $= и т.д. доступны также в Ruby, наличие таких операторов, как $,++, указывает Perl, у которого фактически есть операторы pre и post-increment, в отличие от Ruby.


Я вошел с Vim и заменил все символы на английский эквивалент. Я что-то перепутал, так как результат теперь "просто другой Per hacker" (отсутствует L на Perl), но вот что я придумал:

use English;
`$FORMAT_LINES_PER_PAGE`;
$ARG=\%!;($ARG)=/(.)/;$FORMAT_LINES_PER_PAGE=++$OUTPUT_AUTOFLUSH;
($INPUT_LINE_NUMBER,$/,$OUTPUT_FIELD_SEPARATOR,$OUTPUT_RECORD_SEPARATOR,$LIST_SEPARATOR,$SUBSCRIPT_SEPARATOR,$FORMAT_TOP_NAME,$OFMT,$FORMAT_NAME,$MULTILINE_MATCHING,$FORMAT_LINE_BREAK_CHARACTERS,@%)=(
$!=~/(.)(.).(.)(.)(.)(.)..(.)(.)(.)..(.)......(.)/,$LIST_SEPARATOR),$FORMAT_LINES_PER_PAGE++;
$INPUT_LINE_NUMBER++;
$INPUT_LINE_NUMBER++; $ARG++;$ARG++;
($ARG,$OUTPUT_RECORD_SEPARATOR,$OUTPUT_FIELD_SEPARATOR)=($FORMAT_NAME.$LIST_SEPARATOR."$SUBSCRIPT_SEPARATOR$/$FORMAT_PAGE_NUMBER[$CHILD_ERROR]$ARG$OUTPUT_RECORD_SEPARATOR$OUTPUT_FIELD_SEPARATOR$FORMAT_LINE_BREAK_CHARACTERS$FORMAT_PAGE_NUMBER[$CHILD_ERROR]",$LIST_SEPARATOR&$FORMAT_NAME,$OFMT,);
$OUTPUT_FIELD_SEPARATOR++ ;
$OUTPUT_FIELD_SEPARATOR++;
$FORMAT_TOP_NAME|=$LIST_SEPARATOR;
`$ARG$OUTPUT_RECORD_SEPARATOR$OUTPUT_FIELD_SEPARATOR$/$FORMAT_LINE_BREAK_CHARACTERS$SUBSCRIPT_SEPARATOR$FORMAT_NAME$MULTILINE_MATCHING$FORMAT_PAGE_NUMBER[$CHILD_ERROR]$INPUT_LINE_NUMBER$FORMAT_NAME$MULTILINE_MATCHING${#}$FORMAT_PAGE_NUMBER[$CHILD_ERROR]$SUBSCRIPT_SEPARATOR$OUTPUT_RECORD_SEPARATOR$LIST_SEPARATOR$FORMAT_TOP_NAME$FORMAT_NAME$MULTILINE_MATCHING.>&$FORMAT_LINES_PER_PAGE`

Ответ 2

Здесь я изменил все специальные глобулы Ruby на однобуквенные переменные и вставил некоторые пробелы:

`a`
n = \%!
(n) = /(.)/
a = ++o
(b, c, d, f, e, g, h, i, j, k, l, @%) = (m =~ /(.)(.).(.)(.)(.)(.)..(.)(.)(.)..(.)......(.)/, e), a++
b++
b++
n++
n++
(n, f, d) = (j . e . "gcp[q]nfdlp[q]", e & j, i,)
d++
d++
h |= e
`nfdclgjkp[q]bjk${#}p[q]gfehjk.>&a`

Тот, кто написал это, не понимает Ruby. В Ruby нет оператора инкремента. Токены типа \%! и @% ничего не значат в Ruby. Вы не можете интерполировать переменные, даже глобальные переменные, в строках или запрограммированных командах, как в "$=". Точка . не является оператором конкатенации в Ruby. Я не думаю, что это Рубин. Это похоже на гибрид языков.

Ответ 3

Я не являюсь экспертом Ruby любыми средствами на первом шаге, должен превращать его в формат, который вы можете прочитать. Я сломал его по очереди.

`$=`;

$_=\%!;

($_)=/(.)/;

$==++$|;

($.,$/,$,,$\,$",$;,$^,$#,$~,$*,$:,@%)=($!=~/(.)(.).(.)(.)(.)(.)..(.)(.)(.)..(.)......(.)/,$"),$=++;$.++;$.++; 

$_++;

$_++;

($_,$\,$,)=($~.$"."$;$/$%[$?]$_$\$,$:$%[$?]",$"&$~,$#,);

$,++;

$,++;

$^|=$";

`$_$\$,$/$:$;$~$*$%[$?]$.$~$*${#}$%[$?]$;$\$"$^$~$*.>&$=`

Я обманул и попытался запустить его, и он не работает. Я получаю неожиданную ошибку null.

Не чувствуйте себя плохо, если вы не можете этого сделать. Это кажется бессмысленным. Вопросы программирования должны пытаться проверить ваши навыки, а не тестировать вас на что-то, что если кто-то действительно использует это, это будет означать, что приложение будет действительно плохо.

Ответ 4

Это выглядит ближе к Perl, если честно, но в любом случае довольно бессмысленно.