Безвкусно и другие ошибки


52

В некоторых версиях стандартного приложения для калькулятора Android вы можете нажать клавишу, например «sin», а затем клавишу «del», чтобы сделать ее «si». Вероятно, это просто ошибка, которую они не могут устранить.

Снимок экрана калькулятора Android

Можно вводить следующие буквы / буквенные группы:

 

грех
си
s
соз
Колорадо
с
загар
та
T
пер
L
журнал
вот
е

Таким образом, «безвкусный» является типичным, потому что ta-steless, как и «засорение», потому что «c-log-s». Однако «get» не может быть напечатано, также как «an» или «xyz».

Напишите программу, которая принимает одно слово (или последовательность букв, только az на входе) в качестве входных данных и производит вывод, чтобы указать, является ли слово типизированным или нет.

Вывод может быть один символ / буква / цифра / и т. Д. или это может быть больше. Все вводимые слова должны давать одинаковый вывод. Все нетипизированные слова также должны выдавать одинаковый результат.

PS Просто из любопытства, «безвкусно» самое длинное словарное слово, которое можно набрать?


1
Просто чтобы прояснить: мы выводим одну непротиворечивую цифру или букву по нашему выбору, чтобы указать, что слово является вводимым, и другую единственную непротиворечивую цифру или букву по нашему выбору, чтобы указать, что слово не может быть напечатано. Это правильно?
Деннис

3
Самое длинное слово, которое я смог найти, - это 10 букв, коелостаты .
Конор О'Брайен

1
Итак, "πe" не слово?
Мистер Листер

@ Денис Да, более или менее.
ghosts_in_the_code

1
Еще один 11: бабы
Крис Х

Ответы:


20

Perl, 47 43 41 + 1 = 42 байта

-4 байта благодаря @Sunny Pun. -2 байта благодаря @Brad Gilbert b2gills и @Downgoat

Беги с -nфлагом.

say!/^(s(in?)?|co?|t(an?)?|ln?|log?|e)+$/

Это определенно может быть и дальше, но в духе соревнований я оставляю в основном оригинальное регулярное выражение, которое я придумал в начале. Ничего не возвращает, если true, 1если false.

Попробуйте онлайн!

Я скачал файл словаря, и самое длинное слово, которое я нашел, было 11 букв - tattletales


1
Я думаю, co?должно быть достаточно, так как sinбуду заботиться о s:) Приятно играть с /log?/!
Солнечный Пан

1
Это не говорит о том, что он должен быть нечувствительным к регистру (удалить i) или что единственный результат должен иметь смысл (удалить один !)
Брэд Гилберт b2gills

Вам нужно, чтобы я помечал в самом конце, так как вход только az?
Downgoat

Вы можете сделать это проще: -2: /^(s|sin?|co?|t|tan?|ln?|log?|e)+$/или если вы предпочитаете:/^([celst]|sin?|co|tan?|ln|log?)+$/
Не то, чтобы Чарльз

1
Наслаждайся своей щедростью!
ghosts_in_the_code 13.12.16

16

JavaScript (ES6), 44 байта

s=>/^((si|ta|l)n?|co?|log?|[ste])+$/.test(s)

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

объяснение

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

s=>/^(sin|si|s|cos|co|c|tan|ta|t|log|lo|l|ln|e)+$/.test(s)

Во-первых, мы можем наблюдать, что cosможет быть сформировано из coи s, делая это ненужным:

s=>/^(sin|si|s|co|c|tan|ta|t|log|lo|l|ln|e)+$/.test(s)

Некоторые из них, такие как sinи si, можно объединить, сделав последнюю букву необязательной:

s=>/^(sin?|s|co?|tan?|t|log?|ln?|e)+$/.test(s)

Это работает, потому что sin?совпадает siс или без nна конце, таким образом покрывая sinи si.

Там, кажется, n?тоже много с. Что если мы соберем их всех вместе?

s=>/^((si|ta|l)n?|s|co?|t|log?|e)+$/.test(s)

Еще один способ игры в гольф состоит в том, чтобы объединить оставшиеся опции с одним символом в диапазон символов, но это получается при той же длине:

s=>/^((si|ta|l)n?|co?|log?|[ste])+$/.test(s)

И вот как вы играете в гольф простым регулярным выражением. Я считаю, что это самое короткое из возможных регулярных выражений, которое соответствует каждой строке правильно, но, возможно, нет. Я награжу +100 наградой любому, кому удастся улучшить это регулярное выражение.


Тот, который я использовал в своем ответе, выглядит примерно так:^(s|t|co?|(l|ta|si)n?|log?|e)+$
Mama Fun Roll

Во-первых, я считаю 44 байта. Во- вторых, здесь альтернативный , но уже решение: / /.test.bind(/^((si|ta|l)n?|co?|log?|[ste])+$/).
Конор О'Брайен

@ ConorO'Brien Ой, не знаю, как я это не
учел

Вы можете сделать a=/^((si|ta|l)n?|co?|log?|[ste])+$/;a.testза 42 байта. Я считаю, что это разрешено, потому что a.testэто анонимная функция.
NoOneIsHere

@SeeOneRhino Это так, но это не совсем допустимо, потому f=a.testчто не работает. Интересно, допустимо ли звонить с альтернативным именем, a.testхотя ...
ETHproductions

7

Pyth, 37 33 29 28 байт

Код содержит непечатаемый символ, поэтому здесь есть xxdhexdump.

00000000: 737d 5173 4d5e 733c 5252 6336 2e22 6174  s}QsM^s<RRc6."at
00000010: 14d0 69ba 76f1 ac59 6422 346c            ..i.v..Yd"4l

Попробуйте онлайн.

Крайне астрономически неэффективно. Пространственно-временная сложность O (16 n ) O (24 n ).

объяснение

Во-первых, Qнеявно добавляется.

s}QsM^s<RRc6."…"4lQ     Implicit: Q = input
            ."…"        Generate "logsincostanlnee"
          c6            Split in 6 parts: ["log", "sin", "cos", "tan", "ln", "ee"]
         R      4       For each n from 0 to 3
       <R               Take the first n chars from each string
      s                 Flatten the results
                 lQ     Get length of input
     ^                  Take that Cartesian power of the list
   sM                   Join each resulting list
 }Q                     Check if the input is found
s                       Cast to integer

ОП уточнил; тебе не нужно s.
Деннис

6

Желе , 32 31 30 28 26 байт

ŒṖw@€€“¡Ṡ[ẈKœịḲ-¢ȧ?-»’%3ḌẠ

Выводит 0, если слово можно ввести, и 1, если нет. Спасибо @JonathanAllan за отыгрывание 1 байта!

Попробуйте онлайн!

Как это устроено

ŒṖw@€€“¡Ṡ[ẈKœịḲ-¢ȧ?-»’%3ḌẠ  Main link. Argument: s (string of lowercase letters)

ŒṖ                          Yield all partitions of s.
      “¡Ṡ[ẈKœịḲ-¢ȧ?-»       Yield "sine  logcostanln". Every third character
                            marks the start of a typeable word.
  w@€€                      Find the indices of all substrings in the partitions
                            in the string to the right (1-based, 0 if not found).
                     ’      Decrement. "Good" indices are now multiples of 3.
                      %3    Modulo 3. "Good" indices are mapped to 0, "bad"
                            indices are mapped to 1 or 2.
                        Ḍ   Convert from decimal to integer. A partition will
                            yield 0 iff all indices are "good".
                         Ạ  All; yield 0 if one or more integers are falsy (0), 1
                            if all integers are truthy (non-zero).

6

Брахилог , 33 байта

Исправлена ​​ошибка благодаря @Synoli.

~c:1a
,"sincostanloglneeee"@6e@[?

Попробуйте онлайн!

Выходы, true.если типизируемые или false.нет.

объяснение

Мы пытаемся деконкатенировать ввод, пока не найдем тот, для которого все строки, которые мы объединяем, являются префиксом одной из ["sin", "cos", "tan", "log", "lne", "eee].

~c                          A list of strings which when concatenated results in the Input
  :1a                       All strings of this list satisfy the predicate below:

,"sincostanloglneeee"@5           The list ["sin", "cos", "tan", "log", "lne", "eee"]
                       e          Take one element of that list
                        @[?       The input is a prefix of that element

Почему .после true?
Критиси Литос

1
@KritixiLithos В SWI-Prolog, когда запрос верен, он печатает true.и false.иначе. я просто переопределил это: если вывод игнорируется (как здесь) и нет записи в него STDOUT, то он будет печататься true.или в false.зависимости от того, будет ли основной предикат успешным или нет. Он имеет точку в SWI-Prolog , потому что true.и false.в самом деле действующие программы , которые всегда удается / всегда терпит неудачу.
Fatalize

Как это решение работает без tanявного появления в списке?
Синоли

2
@ Синоли Это не так. Я исправил это по стоимости 3 байта, спасибо.
Fatalize

4

Perl 6 ,  60 50  44 байтов

первая попытка ( 60 )

put +?(get~~/^<{<sin cos tan ln log e>».&{|m:ex/^.+/}}>*$/)

перевод Perl 5 ответа ( 50 )

put +?(get~~/^[s[in?]?|co?|t[an?]?|ln?|log?|e]*$/)

используя -nпереключатель ( 43 + 1 )

put +?/^[s[in?]?|co?|t[an?]?|ln?|log?|e]*$/

Первый ?преобразует результат в логическое значение, а первый +преобразует его в число ( 1для True, 0для False)


3

Mathematica, 101 байт

If[StringMatchQ[#,("sin"|"si"|"s"|"cos"|"co"|"c"|"tan"|"ta"|"t"|"ln"|"l"|"log"|"lo"|"e")..],"T","F"]&

Кажется, что сложная часть этой задачи состоит в том, чтобы найти самое короткое регулярное выражение и выбрать самый краткий язык, соответствующий этому регулярному выражению. У меня нет ничего, чтобы поспособствовать первому, и Mathematica не является хорошим кандидатом на второе, так как вы должны использовать StringMatchQи RegularExpression. Что я могу сделать, это ответить на ваш PS: «безвкусно» самое длинное слово, которое вы можете напечатать?

In[1]:= f=StringMatchQ[#,("sin"|"si"|"s"|"cos"|"co"|"c"|"tan"|"ta"|"t"|"ln"|"l"|"log"|"lo"|"e")..]&;

In[2]:= Select[EntityList@"Word",f@#[[2,1]]&][[All,2,1]]//SortBy[StringLength]//DeleteDuplicates
Out[2]= {c,e,l,s,t,cc,cl,el,et,lo,si,sl,ta,te,ccc,col,cos,cot,eel,ell,eta,etc,lee,let,log,lot,sec,see,set,sic,sin,sit,tae,tan,tat,tec,tee,cell,clog,clot,coco,cole,colt,coss,cost,cote,else,less,loco,loge,loll,lose,loss,lota,sect,seel,sell,sess,seta,sett,sill,silo,silt,sine,sise,siss,site,sloe,slog,slot,stet,taco,tact,tael,talc,tale,tall,tect,tell,test,cello,close,cosec,costa,cotan,eccle,elect,elsin,ettle,loess,lotte,secle,setee,since,sleet,stale,stall,state,steel,stele,tasse,taste,tatee,teest,telco,testa,tetel,tsine,cellco,closet,coleta,collet,coltan,cosine,cosset,costal,ecesis,estate,lessee,scelet,select,sellee,sestet,settee,settle,siesta,silole,stacte,stance,stasis,tallet,tallot,taslet,tassel,tasset,tattle,tectal,teetan,tellee,testee,tsetse,celesta,cessile,cocotte,collect,costate,ecolect,ectasis,electee,sessile,sinless,sitelet,statant,tassell,tastant,testate,coestate,colessee,colocolo,cosiness,costless,electant,lossless,sceletal,siletane,statelet,tactless,tallness,telltale,telocoel,coelostat,sissiness,stateless,tasteless,tattletale}

Так что "tattletale" кажется самым длинным на одного персонажа.


Почему это не конкурирует? Соответствует ли определенная вами функция f правилам вызова?
Деннис

Нет, он выдает Trueили Falseвместо одного символа.
ngenisis

Сообщения с тегом «решение проблемы» посвящены определению Истина / Ложь, поэтому я думаю, что это конкурирует.
FlipTack

Неконкурентный статус зарезервирован для заявок, в которых используется язык или языковая функция, которой не было или в которой была опубликована проблема.
Деннис

Справедливо. Я отредактировал свой ответ, чтобы иметь реальное решение.
ngenisis

2

Чудо , 41 байт

!.(mstr"^(s|t|co?|(l|ta|si)n?|log?|e)+$")

Использование:

(!.(mstr"^(s|t|co?|(l|ta|si)n?|log?|e)+$")) "tasteless"

Раньше совершенно неправильно понял вопрос, но теперь все решено. Выходы Fна совпадение и Tна отсутствие совпадения.

Неконкурентный, 35 байт

!.`^(s|t|co?|(l|ta|si)n?|log?|e)+$`

Использование:

(!.`^(s|t|co?|(l|ta|si)n?|log?|e)+$`) "tasteless"

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


2
Насколько я понимаю, вы можете удалить только последний символ в калькуляторе, что означает, что nне для ввода, но sinи lnесть.
Солнечный Пан

Это регулярное выражение определяет saкак истинное
Kritixi Lithos

1
Это не проходит контрольный пример got.
Деннис

Я верю, что это исправлено.
Mama Fun Roll

?Сделать выражение к югу послушными; см. rexegg.com/regex-quantifiers.html#cheat_sheet . Но даже если сделать его жадным ??или ?+притязательным, по какой-то причине не работает (по крайней мере, в PHP). coelostatsвызывает ловушку (в loи ta).
Тит

2

Обработка, 223 байта

int d(String b){for(String p:"tan0log0sin0cos0ln0e".split("0"))if(p.startsWith(b))return 1;return 0;}

int l(String p){String b="";int t=1;for(char c:p.toCharArray()){b+=c;if(d(b)<1){b=c+"";t=d(b);}if(t<1)return t;}return t;}

Наконец решил сделать ответ без регулярных выражений. Для вызова функции используйте l("tasteless");. Возвращает 0за ложь и 1за истину.

Расширенный код с объяснением

int d(String b){
  for(String p:"tan0log0sin0cos0ln0e".split("0"))
    if(p.startsWith(b))
      return 1;
  return 0;
}
//main function
int l(String p){
  String b="";
  int t=1;
  for(char c:p.toCharArray()){
    b+=c;
    if(d(b)<1){
      b=c+"";
      t=d(b);
    }
    if(t<1)return t;
  }
  return t;
}

По сути, мы перебираем данную строку, bсобирая char по char. Мы проверяем , используя , d()если какой - либо из tan, log... начать с b. Если это так, то это действительно. Иначе, мы проверяем, является ли символ в этой позиции действительным, и сбрасываем b. Теперь, если он недействителен, 0будет возвращен, иначе он все равно будет действительным. В конце, если программа еще не возвратила что-то, вернитесь 1.


Не может dфункция возвращать bool?
Роман Грэф

@ RomanGräf Больше байт для использования, booleanчем int. Также trueи falseтребуется больше байтов, чем 1и0
Kritixi Lithos

2

Скала, 49 байт

s=>s.matches("(s(in?)?|co?|t(an?)?|ln?|log?|e)+")

Возвращает true, если данная строка соответствует регулярному выражению, иначе false.


2

Python 3 , 154 байта

r=1;i=input()
while r:
 r=0
 for s in'sin,cos,tan,log,ln,co,lo,si,ta,s,c,t,l,e'.split(','):
  if i.startswith(s):r=i=i.replace(s,'',1);break
print(i=='')

Попробуйте онлайн!


1
Вам может понадобиться проверить отступ, мне пришлось отредактировать код, чтобы он заработал
Джордж

@george, странно, я попробовал в IDLE и онлайн-компиляторе, и оба, кажется, работают
Henke

2

Python 3 , 149 130 байт

i=input()
for a in 'tan,sin,cos,log,si,co,ta,lo,lo,ln,s,c,t,l,e'.split(','):
    if a in i:
        i=i.replace(a,"")
print(not i)

правка №1: побрили 19 байт, используя решение @Henke


0

Python 2, 124 байта

f=lambda w:any(f(w[len(s):])if w[:len(s)]==s else 0for s in'sin,cos,tan,log,ln,co,lo,si,ta,s,c,t,l,e'.split(','))if w else 1

0

PHP, 60 байт

<?=preg_match("#^((si|ta|l)n?|co?|log?|s|e|t)+$#",$argv[1]);

регулярное выражение, украденное из ETHproductions :
принимает входные данные из аргумента командной строки; печатает 1для печатного, 0для не печатного.

старые версии, 75 73 69 байт

<?=!preg_replace("#co|log|ln|lo|sin|si|tan|ta|[celst]#","",$argv[1]);

заменяет все возможные слова пустой строкой, возвращает результат, отрицает.

<?=!preg_split("#co|log|ln|lo|sin|si|tan|ta|[celst]#",$argv[1],-1,1);

разбивает ввод по совпадениям регулярных выражений. Флаг 1обозначает PREG_SPLIT_NO_EMPTYи говорит preg_splitтолько о возврате непустых результатов. Если ввод вводимый, он preg_splitбудет иметь только пустые результаты, поэтому он возвратит пустой массив, что неверно. !сводит на нет результат.

Обе версии принимают входные данные из аргумента командной строки
и печатают, 1если результат пуст (ввод вводим), иначе ничего.

Примечания:
упаковка с использованием регулярных выражений ?здесь не работает; это делает выражения неловкими; вероятно из-за возврата. И порядок альтернатив важен: taдолжен стоять раньше, tиначе двигатель перестанет совпадать, когда найдет t.

Я нашел шпаргалку , подумал ??или ?+мог бы помочь; но они не работают для меня.


0

Java 8, 55 байт

s->return s.matches("^((si|ta|l)n?|co?|log?|[ste])+$");

Disclamer: я использовал регулярное выражение ETHproductions, потому что оно было на много байтов короче моего. Полный кредит на регулярное выражение ему. Я добавил 24 байта, чтобы сделать его функцией Java.

Возвращает, falseесли слово не вписывается в регулярное выражение, иначе true.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.