Duolingo, приложение для изучения языка, предлагает много вещей, но есть одна серьезная проблема, которая сводит меня с ума. Он говорит мне, сколько дней подряд я использовал приложение с сообщением, как будто Вы на 7-дневной полосе! Если оставить в стороне переносы и указывать, нужно ли указывать число, это прекрасно работает для большинства чисел, но, безусловно, неправильно, когда говорится, что вы на 8-дневной полосе! Я не использую его для изучения английского языка, но это все еще неудачное поведение для языкового приложения.
Вы собираетесь помочь команде Duolingo, написав полную программу или функцию, которая выясняет, следует ли заданному числу предшествовать a или an . Ряд предшествует , если его произношение в разговорном английском языке начинается с согласным или полугласным звуком и предшествует , если его произношение начинается с гласным звуком. Таким образом, единственные числа, которым предшествует, - это те, чье произношение начинается с восьми , одиннадцати , восемнадцати или восьмидесяти .
Предположительно, команда разработчиков 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
Ответы:
Pyth, 23 байта
Это выбирает, сколько букв нужно вырезать с конца
"an"
, проверяя, не является ли первая буква буквой8
A, и что первая цифра числа при рассмотрении в базе 1000 не равна ни 11, ни 18. Полученное логическое число - это количество символов, которое нужно вырезать из конец.источник
Python 2, 60 байт
Анонимная функция. Добавляет,
n
если либо:источник
n
> = '8' `` сохраняет три байта.GNU Sed, 32
Оценка включает +1 за
-E
опцию sed.Попробуйте онлайн.
an
a
Спасибо @ MartinBüttner за его подход к сетчатке, который сэкономил 10 байт.
источник
Shell + bsd-игры, 30
Ввод читать из STDIN.
number
преобразует десятичную строку в слова Тогда легко решить, начинается ли результатe
.источник
Сетчатка , 27 байт
Это не очень отличается от ответа Retina на DigitalTrauma, но они настояли, чтобы я отправил это сам.
Попробуйте онлайн.
Первое регулярное выражение заменяет все соответствующие числа на
an
, а второе заменяет все оставшиеся числа наa
. Это работает для тех же байтов:источник
С ++, 101
Это моя задача, так что это не должно быть конкурентным ответом. Просто хотел посмотреть, насколько коротким я смог получить его в C ++. Строковые операции слишком многословны, так что это делается с помощью математики. Я чувствую, что должен быть способ уменьшить это состояние, но я не могу понять это.
источник
Mathematica, 53 байта
Решение, использующее обработку строк, на самом деле будет длиннее.
источник
PostScript,
119113 символовС тестовым кодом:
источник
JavaScript (ES6)
70614638 байтСообщество вики, потому что текущее решение настолько отличается от моего оригинала. Всем спасибо!
Демо: http://www.es6fiddle.net/iio40yep/
источник
eval
уловки! Я знал, что должно быть и лучшее регулярное выражение, но я не мог придумать ничего более короткого. Спасибо!n=>/^8|^(?=1[18])..(\d{3})*$/.test(n)?'an':'a'
( es6fiddle.net/iiehl1ex ). Это 46 байтов в длину.8
, начинается ли он1[18]
и имеет ли длина чисел2 * (3n)
. По сути, это весь ваш код, но внутри регулярного выражения.Серьезно,
4340 байтСтратегия здесь состоит в том, чтобы смотреть только на 1, 2 или 3 наиболее значимых цифры, целочисленным делением ввода на наибольшее значение
10^(3n)
, которое меньше, чем ввод.Попробуйте онлайн
Объяснение:
источник
Сетчатка , 34
Прямой перевод моего ответа sed :
Попробуйте онлайн.
Один байт сохранен благодаря @Timwi.
источник
Perl 6 ,
3130 байт(Perl 6 использует
[ ]
регулярные выражения для захвата( )
и использует<[ ]>
наборы символов)Использование:
источник
PostScript, 109 байт
Код проверяет, начинается ли номер с определенных префиксов. Приставка
8
всегда проверяется ( восемь , восемьдесят с чем-то , восемь-сотни-и ), но11
и18
( одиннадцать и восемнадцать ) проверяются только тогда , когда количество цифр кратна 3 плюс 2.Мы начнем с предварительного результата,
a
и когда префикс будет найден, результат будет заменен наan
.anchorsearch
используется, чтобы избежать извлечения префикса из строки. Даже если совпадение найдено, мы продолжаем проверять остальные префиксы - зачем тратить 5 байтов наexit
? -, но поскольку исходная строка заменяется наa
мы, мы уверены, что не получим никаких ложных срабатываний.Чтобы вернуть
a
-или-an
результат в стеке операндов, а не печатать его, удалите завершающий символ=
(итоговая длина: 107 байт).Тестовый код:
источник
PostScript (с двоичными токенами), 63 байта
Это
’
байты со значением 146 (десятичное),¥
165 и$
3. 3. Все остальные - 7-битные ASCII-символы для печати.Это то же самое, что и моя версия PostScript [чистый ASCII], но использует двоичные токены, где это помогает уменьшить общую длину. Я публикую это отдельно по 3 причинам:
источник
Python 3,
11093917674706564 байтаВот длинный, но простой.
Изменить: Исправлено с помощью isaacg . Сохранено несколько пробелов после сравнений. Многие байты сохраняются благодаря Timwi , Mego , benpop и Алисса .
или для того же количества байтов.
Ungolfed:
источник
843
«восемьсот сорок три», что должно бытьan
.(-~len(n)%3)<1
вместоlen(n)%3==2
?(n[:2]=="11"or n[:2]=="18")
быть сокращено до"118".contains(n[:2])
?n[:2]in"118"
?Java 10, 102 байта
Попробуйте онлайн.
Объяснение:
источник
Japt ,
2827 байтовПопробуйте онлайн!
Распаковано и как это работает
источник
1e3
наA³
GNU
sed -r
+ BSDnumber
, 34 байтаСначала мы конвертируем в английский номер. Затем удалите все, кроме возможного инициала
e
и префикса сa
. Затем преобразоватьe
(если есть) вn
. Единственный трюк в гольфе - это соответствие необязательностиe
в первой замене, поэтому мы можем повторно использовать схему в следующей строке.демонстрация
источник
TeaScript , 35 байт
Попробуй это здесь.
объяснение
источник
Python 2.7, 66
Очевидно, не такой короткий, как
lambda
тот.источник
05AB1E , 26 байт
Возможно, можно играть в гольф немного больше, но это работает.
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник
QuadS , 32 байта
Попробуйте онлайн!
источник
Stax , 25 байт
Запустите и отладьте его
Распакованный, размазанный и прокомментированный, это выглядит так.
Запустите этот
источник
Пробел , 243 байта
Буквы
S
(пробел),T
(табуляция) иN
(новая строка) добавляются только как подсветка.[..._some_action]
добавлено только для пояснения.Попробуйте онлайн (только с необработанными пробелами, вкладками и новыми строками).
Программа останавливается с ошибкой: выход не найден.
Объяснение в псевдокоде:
источник
C ++,
80-79 байтОказалось, что на 4 байта короче для явного тестирования на 8хх и 8х, чем на другой
/=10
цикл, например:демонстрация
источник
i/=1000
бытьi/=1e3
, и все могут&&
стать&
?&&
может быть все&
, потому что вычитание дает целые числа, а не логические значения - например19-11
, 8 и19-18
1; видите, что8 && 1
это правда, но8 & 1
это ложь. Мы могли бы использовать ,&
но мы должны были бы изменить ,-
чтобы!=
и добавить скобки.&
действительно не работает здесь, мой плохой. Кстати, почему бы вам не добавить TIO-ссылку в ответ?Perl 5
-p
, 26 байтПопробуйте онлайн!
источник
Perl,
715549 байтЯ знал, что троичный оператор поможет однажды ...
Позвольте мне сломать это.
$_=<>
принимает число в качестве ввода.$_=...
блок установит значение$_
после его использования....?...:...
является троичным оператором. Если условие (первый аргумент) истинно, оно возвращает второй аргумент. В противном случае возвращается третье./^8/||(/^1[18]/&&length%3==2)
проверяет, начинается ли число с 8 или начинается с 11 или 18 (1[18]
принимает либо), и имеет длину 3 из 2.$_
устанавливается наan
. В противном случае он установлен наa
.$_
(илиa
илиan
) с помощьюsay
.изменения
источник
$_=<>;$_=(/^8/)||/^1[18]/&&length($_)%3==1?'an':'a';say
сохраняет несколько байтов. (Хотя число, которое нужно сравнить с ним, зависит от того, какой у вас символ новой строки, но это не меняет счетчик байтов.)length($_)
кlength
(или , по крайней мере , падение скобки) , но это не работает для меня по какой - то причине.($_)
получить$_=<>;$_=/^8/||/^1[18]/&&length%3==1?'an':'a';say
, что составляет всего 49 байтов.-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
, поэтому всегда возвращает false.Пиф,
2931Переворачивает строку, разбивает ее на части по три, снова переворачивает, затем выбирает подходящее окончание.
источник
111
- это даетan