Ви на 8-денній смузі!


82

Дуолінго, додаток для вивчення мов, має на меті багато чого, але є одна головна проблема, яка зводить мене з розуму. Він говорить мені, скільки днів поспіль я використовував додаток із повідомленням, як Ти на 7-денній смузі! Якщо відмінити дефіс та чи потрібно вказати число, це працює чудово для більшості номерів, але, безперечно, помиляється, коли говорить, що ви на 8-денній смузі! Я не використовую його для вивчення англійської мови, але це все ще прикрою поведінкою для мовної програми.

Ви збираєтеся допомогти команді Duolingo написавши повну програму або функцію , яка з'ясовує , чи слід дане число повинне передувати або . Ряд передує , якщо його вимова в розмовній англійській мові починається з згодним чи півголосних звуком і передує , якщо його вимова починається з голосним звуком. Таким чином, єдині числа, яким передує а, - це ті, вимова яких починається з восьми , одинадцяти , вісімнадцяти чи вісімдесяти .

Імовірно, команда розробників Duolingo залишила цю помилку, оскільки у них не вистачало місця для отримання додаткового вихідного коду в додатку, тому вам потрібно зробити цей код якомога коротшим, сподіваючись, що вони зможуть його видавити.

Ваш код повинен приймати ціле число від 0 до 2,147,483,647 і виводити aабо an. Новий рядок не є обов'язковим. Для цілей цього виклику 1863 рік читається як тисяча вісімсот шістдесят три , а не вісімнадцять сотень шістдесят три .

Тестові приклади:

0 → a
8 → an
11 → an
18 → an
84 → an
110 → a
843 → an
1111 → a
1863 → a
8192 → an
11000 → an
18000 → an
110000 → a
180000 → a
1141592 → a
1897932 → a
11234567 → an
18675309 → an

31
Це схвалює Дуолінго? Якщо ні, ви повинні змусити їх заплатити нам за вдосконалення мови на сайті вивчення мов.
Arc676

10
Це 1100 (ан) одинадцять сотень чи (а) тисяча сто ?
user3819867

11
Більбо не погодиться з деякими вашими тестовими випадками. :)
Мартін Ендер

9
@Zaibis: "один" тут вимовляється як "wun", який має приголосний звук. Таким чином, « тисяча один стоденний поспіль».
El'endia Starman

31
Вони, ймовірно, залишили цю помилку, бо думали, що ніхто не досягне 8-денного проміжку.
ПНДА

Відповіді:


14

Pyth, 23 байти

<>n\8hz}hjsz^T3,hT18"an

Це вибирає, скільки літер потрібно відрізати від кінця "an", перевіряючи, чи перша літера не є, 8і що перша цифра числа, що розглядається в базі 1000, не є ні 11, ні 18. Отримане булеве число - це кількість символів, які потрібно скинути кінець.


3
Дуже креативний. Також жахливо.
Hellreaver

29

Python 2, 60 байт

lambda n:'a'+'n'[:`n`[0]=='8'or`n`[:2]in len(`n`)%3/2*'118']

Анонімна функція. Додає, nякщо:

  • Перша цифра - 8
  • Перші дві цифри - 11 або 18, а довжина - 2 модуля 3.

Я знаю, що це надто давнє запитання, але я думаю, що `` n> = '8' `` зберігає три байти.
Лінн

@Lynn Хіба це не зіпсує дев'ять?
xnor

О, звичайно! Мене обдурив тестовий набір :)
Лінн

12

GNU Sed, 32

Оцінка включає +1 за -Eваріант сіт.

s/^8.*|^1[18](...)*$/an/
t
ca
:

Спробуйте в Інтернеті.

  • Видаліть групи з 3 цифр з кінця кожного числа, поки не залишиться лише 1 - 3 цифри
  • Зіставте будь-яке число, починаючи з 8 або точно 11 або 18 і змініть на an
  • Змініть всі інші числа на a

Завдяки @ MartinBüttner за його підхід до сітківки, який врятував 10 байт.


11

Shell + bsd-ігри, 30

number -l|sed '/^e/{can
q};ca'

Введення зчитується зі STDIN.

numberперетворює десятковий рядок у слова. Тоді вирішувати, починається чи ні результат починається з простого питання e.


2
+1 за використання bsd-ігор, я насправді не вважав, що вони колись будуть корисні :)
ASCIIThenANSI

@ASCIIThenANSI так, bsd-ігри корисні тут і там :)
Digital Trauma

9

Сітківка , 27 байт

Це не сильно відрізняється від відповіді Retina на DigitalTrauma, але вони наполягали на тому, щоб я це надсилав сам.

^8.*|^1[18](...)*$
an
\d+
a

Спробуйте в Інтернеті.

Перший регулярний вимір замінює всі відповідні числа на an, а другий замінює всі решта числа на a. Це працює для тих же байтів:

^8.*|^1[18](...)*$
n
^\d*
a

1
+1 це майже той самий рівень зловживання регексу, як і тестування на первинність :)
кіт

1
І гарно, що Дуолінго насправді написано ретиною, тому інтегрувати це слід легко. Або зачекайте, що це за мова?
перестали повертати проти годинника,

1
@ceasedtoturncounter clockwis мені кажуть, що це насправді написано в шестикутнику, але вони написали транспілятор сітківки до шестикутника, тому це не повинно бути проблемою.
Мартін Ендер

6

C ++, 101

Це моє завдання, тому це не має бути конкурентоспроможною відповіддю. Просто хотів побачити, як коротко я можу отримати це на C ++. Струнні операції є занадто багатослівними, тому це робиться з математикою. Я відчуваю, що повинен бути спосіб зменшити цей стан меншим, але я не можу його зрозуміти.

const char*f(int i){int n=0,d=0;for(;i;(!(d++%3)&(i==18|i==11))|i==8?n=1:0,i/=10);return n?"an":"a";}

4

Математика, 53 байти

If[#~IntegerName~"Words"~StringStartsQ~"e","an","a"]&

Рішення, що використовує обробку рядків, фактично закінчиться довше.


3

PostScript, 119 113 символів

10 string cvs dup 0 get 56 eq exch dup length 3 mod 2 eq{0 2 getinterval dup(11)eq exch(18)eq or or}{pop}ifelse

З кодом тесту:

/An
{
    10 string cvs dup 0 get 56 eq exch dup length 3 mod 2 eq{0 2 getinterval dup(11)eq exch(18)eq or or}{pop}ifelse
} def

/ShouldBeFalse [ 0 110 1111 1863 110000 180000 1141592 1897932 ] def
/ShouldBeTrue [ 8 11 18 84 843 8192 11000 18000 11234567 18675309 ] def

() = (ShouldBeFalse) = ShouldBeFalse {An =} forall
() = (ShouldBeTrue)  = ShouldBeTrue  {An =} forall

3

JavaScript (ES6) 70 61 46 38 байт

n=>/^8|^1[18](...)*$/.test(n)?'an':'a'

Вікі спільноти, оскільки поточне рішення настільки відрізняється від мого оригіналу. Дякую всім!

Демонстрація: http://www.es6fiddle.net/iio40yep/


1
що має сенс. Дякуємо за пояснення.
Даніель F

1
@Pavlo Дуже приємно, я забув про окремі вирази після виявлення evalхитрості! Я знав, що і там повинен бути кращий регулярний вираз, але я не міг зрозуміти нічого коротшого. Дякую!
Скотт

1
@Pavlo Солодке, оновлено знову! Навчаюсь багато, дуже дякую :)
Скотт

2
URGH! Забули поголити 2 байти! Ось останній: n=>/^8|^(?=1[18])..(\d{3})*$/.test(n)?'an':'a'( es6fiddle.net/iiehl1ex ). Це 46 байт.
Ісмаїл Мігель

2
@ScottKaye Код дуже простий: він перевіряє, якщо він починається з 8, якщо він починається з 1[18]і чи довжина чисел 2 * (3n). В основному, це весь ваш код, але в звичайному виразі.
Ісмаель Мігель

2

Серйозно, 43 40 байт

9⌐9τk,;;$l3@\3*╤@\(íub)$#p'8=)XkΣ'n*'a+

Стратегія тут полягає лише в тому, щоб розглянути лише 1, 2 або 3 найбільш значущі цифри шляхом цілого поділу введення на найбільше значення, 10^(3n)яке менше, ніж вхідне.

Спробуйте в Інтернеті

Пояснення:

9⌐9τk,;;$l3@\3*╤@\(íub)$#p'8=)XkΣ'n*'a+
9⌐9τk                                    push [11, 18]
     ,;;                                 push 3 copies of input (n)
        $l                               get length of n as string (effectively floor(log(n,10)))
          3@\3*╤                         get largest 10^(3n) less than the length
                @\                       get most significant digits of n (x)
                  (í                     bring list from back, push the index of x in the list or -1 if not in list
                    ub)                  increment by 1, convert to boolean, shove to bottom
                       $#p               push first digit from n (as string)
                          '8=            push 1 if "8" else 0
                             )X          shove to bottom of stack, discard remaining digits
                               kΣ'n*     push sum of stack, push a string containing that many "n"s
                                    'a+  push "a", concatenate


2

Perl 6 ,  31   30 байт

{'a'~'n'x?/^8|^1<[18]>[...]*$/} # 31 bytes
{<a an>[?/^8|^1<[18]>[...]*$/]} # 31 bytes
{<a an>[?/^8|^[11|18][...]*$/]} # 31 bytes

{'a'~'n'x?/^8|^1[1|8][...]*$/} # 30 bytes
{<a an>[?/^8|^1[1|8][...]*$/]} # 30 bytes

(Perl 6 використовує [ ]в регулярних виразах для незахоплення ( )та використання <[ ]>для наборів символів)

Використання:

# store it in a lexical code variable for ease of use
my &code = {...}

my @a  = <0 110 1111 1863 110000 180000 1141592 1897932>;
my @an = <8 11 18 843 8192 11000 18000 11234567 18675309>;

say @a.map: &code;
say @an.map: &code;
(a a a a a a a a)
(an an an an an an an an an)

2

PostScript, 109 байт

(a)exch 10 string cvs dup[exch length 3 mod 2 eq{(11)(18)}if(8)]{anchorsearch{pop pop(an)exch}if}forall pop =

Код перевіряє, чи число починається з певних префіксів. Префікс 8завжди перевіряється ( вісім , вісімдесят щось , вісім сотень-і ), але 11і 18( одинадцять і вісімнадцять ) перевіряються лише тоді, коли кількість цифр кратна 3 плюс 2.

Ми починаємо з попереднього результату, aі коли знайдеться префікс, результат заміняється на an. anchorsearchвикористовується для уникнення вилучення префікса з рядка. Навіть якщо відповідність знайдена, ми продовжуємо перевірку решти префіксів - навіщо витрачати 5 байт для  exit? - але, оскільки оригінальна рядок замінюється на aми, ми впевнені, що не отримаємо помилок.

Щоб повернути результат a-or- anна стек операндів замість того, щоб надрукувати його, видаліть трейлінг  =(отримана довжина: 107 байт).

Код тесту:

/DO {
    ... the code above ...
} def

(Should be "a"s:)  = {0 110 1111 1863 110000 180000 1141592 1897932}     { DO } forall
(Should be "an"s:) = {8 11 18 84 843 8192 11000 18000 11234567 18675309} { DO } forall
flush

2

PostScript (з двійковими маркерами), 63 байти

(a)’>10’¥’1’8[’>’b3’j2’={(11)(18)}if(8)]{’${’u’u(an)’>}if}’I’u=

Байти зі значенням 146 (десяткове), ¥є 165 і $є 3. Всі інші друковані 7-бітові символи ASCII.

Це те саме, що і моя версія PostScript [чистий ASCII], але використовує двійкові маркери, де це допомагає зменшити загальну довжину. Я публікую його окремо з 3 причин:

  • У загальному випадку реалізація, яка мінімізує код ASCII, не обов'язково є такою ж, як мінімізація бінарної версії. Деякий довший фрагмент коду PostScript ASCII може стискати краще іншого, а його відповідна двійкова версія буде коротшою.
  • Бінарний код не підходить скрізь, тому чистий відповідь ASCII може бути кращим, навіть якщо довший.
  • Не було б справедливо порівнювати довжину чистого відповіді ASCII PostScript з тією, що використовує двійкові кодування.

1

Python 3, 110 93 91 76 74 70 65 64 байт

Ось довгий, але простий.

Редагувати: виправлено завдяки isaacg . Збережено пробіл після порівнянь. Багато байти зберігаються завдяки Timwi , Mego , benpop і Алісса .

n=input();print("a"+"n"*(len(n)%3>1and n[:2]in"118"or"8"==n[0]))

або на однакову кількість байтів.

n=input();print("a"+"n"[:len(n)%3>1and n[:2]in"118"or"8"==n[0]])

Безумовно:

def a():
    n=input()
    if "8"==n[:1]:
        a = "n"
    elif len(n)%3 == 2 and (n[:2] in ["11", "18"]):
        a = "n"
    else:
        a = ""
    return "a"+a

Це неправильно на вході 843"вісімсот вісімдесят три", що має бути an.
isaacg

@isaacg Ви не тільки правильні, але це дуже спрощує мій код. Дякую! Виявляється, я дивився лише на вісім, вісім тисяч, вісім мільйонів, ігноруючи такі випадки, як вісімдесят і вісім сотень.
Шерлок9

Чому (-~len(n)%3)<1замість len(n)%3==2?
Тімві

Можна (n[:2]=="11"or n[:2]=="18")скоротити "118".contains(n[:2])?
Тімві

Або навіть n[:2]in"118"?
Тімві

1

Java 10, 102 байти

n->{var N=n+"";return(n>9&&"118".contains(N.substring(0,2))&N.length()%3>1)|N.charAt(0)==56?"an":"a";}

Спробуйте в Інтернеті.

Пояснення:

n->{                  // Method with integer parameter and String return-type
  var N=n+"";         //  Input integer as String
  return(n>9&&        //  If the input has at least two digits,
    "118".contains(N.substring(0,2))
                      //  and the first two digits are "11" or "18",
    &N.length()%3>1)  //  and the length modulo-3 is 2
   |N.charAt(0)==56?  //  Or if the first digit is an '8':
     "an"             //   Return "an"
   :                  //  Else:
     "a";}            //   Return "a"


1

GNU sed -r+ BSD number, 34 байти

s/(e?).*/number &/e
s//a\1/
y/e/n/

Спочатку переводимо на англійський номер. Потім видаліть усе, крім можливого початкового e, та префікса за допомогою a. Потім конвертуйте e(якщо є) в n. Єдиний трюк з гольфу - відповідати необов'язковому eв першій заміні, тому ми можемо повторно використовувати шаблон у наступному рядку.

Демо

for i in 0 8 11 18 84 110 843 1111 1863 8192 \
    11000 18000 110000 180000 1141592 1897932 11234567 18675309
do printf "%'10d → %s\n" $i $(./66841.sed <<<$i)
done
         0 → a
         8 → an
        11 → an
        18 → an
        84 → an
       110 → a
       843 → an
     1,111 → a
     1,863 → a
     8,192 → an
    11,000 → an
    18,000 → an
   110,000 → a
   180,000 → a
 1,141,592 → a
 1,897,932 → a
11,234,567 → an
18,675,309 → an

0

TeaScript , 35 байт

[18,11,8,80]I(+xh(x.n%3¶3©?'an':'a'

Спробуйте тут.

Пояснення

               xh(x.n%3¶3           get the relevant digits from the input
                                    xh compiles to x.head which returns the
                                    first n chars of x (implicit input)
                                    ¶ ('\xb6') compiles to ||
              +                     cast the result to an integer since
                                    .includes does a strict comparison
                         ©          ('\xa9') compiles to ))
[18,11,8,80]                        array of the special cases
            I(                      I( is an alias for .includes( which
                                    returns true if the array contains the
                                    argument
                          ?'an':'a' finally, return 'an' if the array
                                    contains the number, 'a' otherwise

0

Пітон 2.7, 66

s=`input()`
print['a','an'][s[:1]=='8'or s[:2]in len(s)%3/2*'118']

Очевидно, не такий короткий, як lambdaодин.


0

05AB1E , 26 байт

g3%ô¬D11Qs18Q+I1£8Q+>„ans∍

Можливо, можна трохи більше пограти в гольф, але це працює.

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

g3%                  # Length of the input, modulo-3
                     #  11234567 → 8 → 2
                     #  110000 → 6 → 0
   ô                 # Split the input into chunks of that size
                     #  11234567 and 2 → ['11', '23', '45', '67']
                     #  110000 and 0 → ['110000']
    ¬                # Take the Head (first element)
                     #  ['11', '23', '45', '67'] → '11'
                     #  ['110000'] → '110000'
     D11Q            # Does it equal 11?
                     #  '11' and 11 → 1
                     #  '110000' and 11 → 0
     s18Q            # Or does it equal 18?
                     #  '11' and 18 → 0
                     #  '110000' and 18 → 0
         +           # Add them together (if it was either 11 or 18, this becomes 1)
                     #  1 and 0 → 1
                     #  0 and 0 → 0
I1£                  # Get the first character of the input
                     #  11234567 → '1'
                     #  110000 → '1'
   8Q                # Does it equal 8?
                     #  '1' and 8 → 0
          +          # Add them together
                     #  1 and 0 → 1
                     #  0 and 0 → 0
           >         # Increase it by 1
                     #  1 → 2
                     #  0 → 1
            „ans∍    # Push "an", and shorten it to a size equal to the result above
                     #  "an" and 2 → "an"
                     #  "an" and 1 → "a"


0

Стакс , 25 байт

â-x▬♪°∞▄'δL|÷æ╪║>₧4¢ÿ·7åR

Запустіть і налагоджуйте його

Розпакований, неозорений та прокоментований, це виглядає приблизно так.

Vk|Eh       get the first "digit" after converting to base 1000
AJ|Eh       get the first "digit" after converting to base 100
c20>9*^/    if the result is greater than 20, divide it by 10 again
"AMj"!#     is the result one of [8, 11, 18]?
^           increment by 1
.an(        keep that many characters of the string "an"

Виконати цей


0

Пробіл , 243 байти

[S S S T    T   S S S S T   N
_Push_97_a][T   N
S S _Print_as_character][S S S T    N
_Push_1][S N
S _Duplicate_1][S N
S _Duplicate_1][T   N
T   T   _Read_STDIN_as_integer][T   T   T   _Retrieve_input][N
S S S T N
_Create_Label_LOOP][S N
T   _Swap_top_two][S S S T  N
_Push_1][T  S S S _Add][S N
T   _Swap_top_two][S N
S _Duplicate][S S S T   T   S S T   S S N
_Push_100][T    S S T   _Subtract][N
T   T   T   N
_If_negative_jump_to_Label_TWO_DIGITS][S S S T  S ST    S N
_Push_10][T S T S _Integer_division][N
S N
S T N
_Jump_to_Label_LOOP][N
S S T   N
_Create_Label_TWO_DIGITS][S N
S _Duplicate][S S S T   S S S N
_Push_8][T  S S T   _Subtract][N
T   S S S N
_If_zero_jump_to_Label_PRINT_n][S N
S _Duplicate][S S S T   S T T   N
_Push_11][T S S T   _Subtract][N
T   S S N
_If_0_jump_to_Label_2_MOD_3][S N
S _Duplicate][S S S T   S S T   S N
_Push_18][T S S T   _Subtract][N
T   S S N
_If_0_jump_to_Label_2_MOD_3][S S S T    S ST    S N
_Push_10][T S T S _Integer_division][S N
S _Duplicate][N
T   S N
_If_0_jump_to_Label_EXIT][N
S N
T   N
_Jump_to_Label_TWO_DIGITS][N
S S S N
_Create_Label_2_MOD_3][S N
T   _Swap_top_two][S S S T  T   N
_Push_3][T  S T T   _Modulo][S S S T    S M
_Push_2][T  S S T   _Subtract][N
T   T   N
_If_negative_jump_to_Label_EXIT][N
S S S S N
_Create_Label_PRINT_n][S S S T  T   S T T   T   S N
_Push_110_n][T  N
S S _Print_as_character][N
S S N
_Create_Label_EXIT]

Букви S(пробіл), T(вкладка) та N(новий рядок) додаються лише як підкреслення.
[..._some_action]додано лише як пояснення.

Спробуйте його в режимі он-лайн (лише із просторами, вкладками та новими рядками).
Програма зупиняється з помилкою: вихід не знайдено.

Пояснення в псевдокоді:

Print "a"
Integer input = STDIN as integer
Integer counter = 1
Start LOOP:
  counter = counter + 1
  If(input < 100)
    Jump to function TWO_DIGITS
  input = input integer-divided by 10
  Go to next iteration of LOOP

function TWO_DIGITS:
  If(input == 8)
    Jump to function PRINT_n
  If(input == 11 or input == 18)
    Jump to function 2_MOD_3
  input = input integer-divided by 10
  If(input == 0)
    Exit program
  Recursive call to TWO_DIGITS

function 2_MOD_3:
  If(counter modulo-3 != 2)
    Exit program
  Jump to function PRINT_n

function PRINT_n:
  Print "n"
  Exit program

0

C ++, 80 79 байт

[](int i){for(;i>999;i/=1e3);return i-11&&i-18&&i/100-8&&i/10-8&&i-8?"a":"an";}

Виявилося, що 4 байти коротше, щоб явно перевірити 8xx та 8x, ніж мати інший /=10цикл, як це:

[](int i){for(;i>999;i/=1e3);for(i==11|i==18?i=8:0;i>9;i/=10);return i-8?"a":"an";}

Демо

#include <locale>
#include <cstdio>
int main(int argc, char**argv)
{
    auto const f =
        [](int i){for(;i>999;i/=1e3);return i-11&&i-18&&i/100-8&&i/10-8&&i-8?"a":"an";}
    ;

    std::locale::global(std::locale{""});
    for (int i = 1;  i < argc;  ++i) {
        auto const n = std::stoi(argv[i]);
        printf("%'10d → %s\n", n, f(n));
    }
}
         0 → a
         8 → an
        11 → an
        18 → an
        84 → an
       110 → a
       843 → an
     1,111 → a
     1,863 → a
     8,192 → an
    11,000 → an
    18,000 → an
   110,000 → a
   180,000 → a
 1,141,592 → a
 1,897,932 → a
11,234,567 → an
18,675,309 → an

Я не знаю С ++ занадто добре, але може i/=1000бути i/=1e3і чи все це може &&стати &?
Кевін Круїссен


1
@Kevin - я в один момент мав там 1e3; Я змінив його під час налагодження і забув змінити його назад. Не &&може бути все &, тому що віднімання дає цілі числа, а не булеві значення - наприклад, 19-11це 8, а 19-18це 1; бачимо, що 8 && 1це правда, але 8 & 1неправда. Ми могли б використовувати , &але ми повинні були б змінити , -щоб !=і додати дужки.
Toby Speight

Ну звичайно .. &справді тут не працює, моє погано. До речі, чому ви також не додасте TIO-посилання до своєї відповіді?
Кевін Круїссен


-1

Perl, 71 55 49 байт

$_=<>;$_=/^8/||/^1[18]/&&length%3==1?'an':'a';say

Я знав, що потрійний оператор допоможе одного дня ...

Дозвольте мені це розбити.

  • $_=<> приймає число як вхідний.
  • Великий $_=...блок встановить значення $_після його використання.
    • ...?...:...є потрійним оператором. Якщо умова (перший аргумент) вірна, він повертає другий аргумент. В іншому випадку вона повертає третю.
    • /^8/||(/^1[18]/&&length%3==2)перевіряє, чи починається число з 8 або починається з 11 або 18 ( 1[18]приймає або), і чи має довжину мод 3 з 2.
    • Якщо це правда, $_встановлено значення an. Інакше встановлено a.
  • Потім він виводить вміст $_(або aабо an) з say.

Зміни

  • Збережено 16 байт завдяки msh210.
  • Збережено 6 байт, видаливши паролі та використовуючи параметри за замовчуванням.

$_=<>;$_=(/^8/)||/^1[18]/&&length($_)%3==1?'an':'a';sayекономить кілька байт. (Хоча число для порівняння з ним залежить від того, який є ваш новий рядок, але це не змінює кількість байтів.)
msh210

@ msh210 Схоже, що це лише 55 байт, це означає, що це економить 16 байт. Я додам це. Дякую!
ASCIIThenANSI

Ласкаво просимо. О, і ви можете кинути перші парени (я припускаю. Я не тестував). Я думаю , ви могли б також змінити length($_)до length(або , по крайней мере , падіння дужки) , але це не працює для мене з якоїсь - то причини.
msh210

@ msh210 Так, ви можете опустити парони і ($_)отримати $_=<>;$_=/^8/||/^1[18]/&&length%3==1?'an':'a';say, що становить всього 49 байт.
ASCIIThenANSI

Ви можете зберегти кілька байтів, використовуючи -pзамість $_=<>і say, y///cзамість lengthі, опускаючи лапки навколо aта an: perl -pe'$_=/^8/||/^1[18]/&&y///c%3==2?an:a'(34 байти + 1 для -p). Зверніть увагу , що вхід не може закінчуватися символом нового рядка: echo -n 11 | perl -pe'...'. Це також виправляє помилку: length%3==2аналізується як length(%3)==2, а не як length($_)%3==2, тому вона завжди повертає помилку.
ThisSuitIsBlackNot

-1

Піта, 29 31

?:_ec_z3"(^18$|^11$|^8)"0"an"\a

Перевертає рядок, розбиває її на три розділи, перевертає її знову, а потім вибирає відповідне закінчення.


5
Це неправильно на вході 111- він даєan
isaacg

Ти правий. Виправлено.
Лось
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.