Без смаку та інші помилки


52

Деякі версії стандартного додатка для калькулятора Android дозволяють натиснути клавішу, наприклад "sin", а потім клавішу "del", щоб зробити її "si". Мабуть, просто помилка, яку вони не можуть заважати видаленню.

Знімок екрана калькулятора Android

Набираються такі літери / групові букви:

 

гріх
си
с
cos
ко
c
засмага
та
т
ln
л
журнал
ло
е

Отже, "несмачний" можна набрати, тому що ta-steless і так само "засмічується", оскільки "c-log-s". Однак 'got' не можна набрати, а також 'an' або 'xyz'.

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

Вихід може бути одним символом / буквою / цифрою / тощо. або він може бути більшим. Усі набрані слова повинні давати однаковий результат. Усі слова, які не можна набрати, також повинні давати однаковий результат.

PS Щойно з цікавості, чи «несмачний» це найдовше словникове слово, яке можна набрати?


1
Щоб було зрозуміло: ми виводимо одну, послідовну цифру чи букву за власним бажанням, щоб вказати, що слово вводиться, а інша, одна, послідовна цифра чи літера на наш вибір, щоб вказати слово не вводиться. Це правильно?
Денніс

3
Найдовше слово, яке я міг знайти, - це 10 букв, целостати .
Conor O'Brien

1
Отже, чи "πe" не є словом?
Містер Лістер

@Dennis Ya, більш-менш.
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)+$/

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

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

Я завантажив файл словника, і найдовше знайдене слово - це 11 букв - tattletales


1
Я думаю, що цього co?має бути достатньо, оскільки sinподбає про s:) Приємно грати /log?/!
Сонячний каламбур

1
Це не говорить про те, що це повинно бути нечутливим до регістру (видалити i) або що єдиний результат повинен мати сенс (видалити !)
Бред Гілберт b2gills

Чи потрібен вам прапор у самому кінці, оскільки вхід лише az?
Пуховик

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

1
Насолоджуйтесь своєю винагородою!
ghosts_in_the_code

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])+$/).
Conor O'Brien

@ 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 байт

Код містить недрукований символ, тому ось xxdшестнадцятковий.

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 ).

Пояснення

Спочатку a 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?
Kritixi Lithos

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

Як працює це рішення без tanявного відображення у списку?
Синолі

2
@Synoli Це не так. Я виправив це за 3 байти, дякую.
Фаталізувати

4

Перл 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

Математика, 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}

Отож, «татутлетка», здається, найдовша на одного персонажа.


Чому це неконкуренто? Чи визначена вами функція 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є.
Сонячний Pun

Цей регулярний вираз визначає 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. Ми перевіряємо , використовуючи , d()якщо якийсь - або з tan, log... почати з b. Якщо так, то це дійсно. В іншому випадку ми перевіряємо, чи є знак char у цій позиції дійсним і скидаємо його b. Тепер, якщо він недійсний, 0він буде повернутий, інакше він все ще буде дійсним. Зрештою, якщо програма ще щось не повернула, поверніться 1.


Не можна dфункцію повернути a 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

Пітон 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])+$");

Відмова: Я використовував регулярний вираз ETHproductions, оскільки він був на багато байтів коротший, ніж мій. Повний кредит на Regex йому. Що я зробив, це додати 24 байти, щоб зробити його функцією Java.

Повертається, falseякщо слово не входило в Regex, в іншому випадку true.

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