Geschmacklos und andere Fehler


52

In einigen Versionen der Standard-Android-Taschenrechner-App können Sie eine Taste drücken, z. B. "sin" und dann die Taste "del", um sie zu "si" zu machen. Wahrscheinlich nur ein Fehler, den sie nicht entfernen müssen.

Screenshot des Android-Rechners

Die folgenden Buchstaben / Buchstabengruppierungen sind typisierbar:

 

Sünde
si
s
cos
co
c
bräunen
ta
t
ln
l
Log
lo
e

So ist "geschmacklos" typisierbar, weil ta-steless und so ist "Clogs", weil "c-log-s". 'Got' ist jedoch nicht typisierbar, ebenso wenig wie 'an' oder 'xyz'.

Schreiben Sie ein Programm, das ein einzelnes Wort (oder eine Folge von Buchstaben, bei der Eingabe nur az) als Eingabe verwendet und eine Ausgabe erzeugt, um anzuzeigen, ob ein Wort typisierbar ist oder nicht.

Die Ausgabe kann ein einzelnes Zeichen, ein Buchstabe, eine Ziffer usw. sein. oder es kann größer sein. Alle typisierbaren Wörter sollten die gleiche Ausgabe erzeugen. Alle nicht typisierbaren Wörter sollten auch die gleiche Ausgabe erzeugen.

PS: Ist "geschmacklos" aus Neugier das längste typisierbare Wörterbuchwort?


1
Um es klar auszudrücken: Wir geben eine einzelne, konsistente Ziffer oder einen Buchstaben unserer Wahl aus, um anzuzeigen, dass das Wort typisierbar ist, und eine andere, einzelne, konsistente Ziffer oder ein Buchstabe unserer Wahl, um anzuzeigen, dass das Wort nicht typisierbar ist. Ist das korrekt?
Dennis

3
Das längste Wort, das ich finden konnte, sind 10 Buchstaben, Coelostatika .
Conor O'Brien

1
Also ist "πe" kein Wort?
Mr Lister

@ Tennis Ya, mehr oder weniger.
ghosts_in_the_code

1
Ein weiterer 11: Sissinesses
Chris H

Antworten:


20

Perl, 47 43 41 + 1 = 42 Bytes

-4 Bytes dank @Sunny Pun. -2 Bytes dank @Brad Gilbert b2gills und @Downgoat

Laufen Sie mit der -nFlagge.

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

Es kann definitiv weiter golfen werden, aber im Geiste des Wettbewerbs lasse ich den meist originalen Regex, den ich mir zu Beginn ausgedacht habe. Gibt nichts zurück, wenn wahr, 1wenn falsch.

Probieren Sie es online!

Ich habe eine Wörterbuchdatei heruntergeladen und das längste Wort, das ich gefunden habe, waren 11 Buchstaben - tattletales


1
Ich denke, co?sollte ausreichen, da sinsich das kümmern wird s:) Schön mit zu spielen /log?/!
Sunny Pun

1
Es heißt nicht, dass zwischen Groß- und Kleinschreibung nicht unterschieden werden muss (remove i), oder dass das einzelne Ergebnis einen Sinn ergeben muss (remove one !)
Brad Gilbert b2gills

Benötigen Sie das i-Flag ganz am Ende, da die Eingabe nur az ist?
Downgoat

Sie können dies einfacher machen: -2: /^(s|sin?|co?|t|tan?|ln?|log?|e)+$/oder wenn Sie es vorziehen:/^([celst]|sin?|co|tan?|ln|log?)+$/
Nicht dass Charles

1
Viel Spaß mit deinem Kopfgeld!
ghosts_in_the_code

16

JavaScript (ES6), 44 Byte

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

Ich denke, das ist die kürzest mögliche Regex, aber natürlich kann ich mich irren.

Erläuterung

Ein naheliegender erster Startpunkt wäre ein regulärer Ausdruck, der einfach alle Optionen separat einschließt:

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

Erstens können wir beobachten, dass cosaus cound gebildet werden kann s, was es unnötig macht:

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

Einige davon, wie z. B. sinund si, können kombiniert werden, indem der letzte Buchstabe optional angegeben wird:

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

Dies funktioniert, weil es mit oder ohne am Ende sin?übereinstimmt und somit sowohl als auch abdeckt .sinsinsi

Es scheint auch viele n?s zu geben. Was ist, wenn wir sie alle zusammenfügen?

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

Eine weitere Möglichkeit, Golf zu spielen, besteht darin, die verbleibenden Single-Char-Optionen in einem Charakterumfang zu kombinieren, der sich jedoch in der gleichen Länge ergibt:

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

Und so spielt man einen einfachen Regex. Ich glaube, das ist die kürzest mögliche Regex, die zu jeder Zeichenfolge passt, aber vielleicht nicht. Ich werde jedem, der es schafft, diesen regulären Ausdruck zu verbessern, ein Kopfgeld von +100 gewähren.


Der, den ich in meiner Antwort verwendet habe, ist ähnlich:^(s|t|co?|(l|ta|si)n?|log?|e)+$
Mama Fun Roll

Erstens zähle ich 44 Bytes. Zweitens, hier ist eine alternative , aber längere Lösung: / /.test.bind(/^((si|ta|l)n?|co?|log?|[ste])+$/).
Conor O'Brien

@ ConorO'Brien Hoppla, ich weiß nicht, wie ich das falsch gezählt habe ...
ETHproductions

Sie können a=/^((si|ta|l)n?|co?|log?|[ste])+$/;a.testfür 42 Bytes tun . Ich glaube das ist erlaubt, da a.testes sich um eine anonyme Funktion handelt.
NoOneIsHere

@SeeOneRhino Es ist, aber es ist nicht wirklich zulässig, weil f=a.testes nicht funktioniert. Ich frage mich, ob es akzeptabel ist, mit dem alternativen Namen a.test
anzurufen

7

Pyth, 37 33 29 28 Bytes

Der Code enthält ein nicht druckbares Zeichen. Hier ist also ein 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

Probieren Sie es online aus.

Extrem astronomisch ineffizient. Die zeitliche und räumliche Komplexität beträgt O (16 n ) O (24 n ).

Erläuterung

Zunächst Qwird implizit ein angehängt.

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

Das OP hat geklärt; du brauchst das nicht s.
Dennis

6

Jelly , 32 31 30 28 26 Bytes

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

Gibt 0 aus, wenn das Wort typisierbar ist, und 1, wenn nicht. Vielen Dank an @JonathanAllan für das Abschlagen von 1 Byte!

Probieren Sie es online!

Wie es funktioniert

ŒṖ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

Brachylog , 33 Bytes

Behebung eines Fehlers dank @Synoli.

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

Probieren Sie es online!

Ausgänge true.wenn typisierbarem oder aus false.anderen Gründen .

Erläuterung

Wir versuchen, die Eingabe zu dekonkatenieren, bis wir eine finden, für die alle verketteten Zeichenfolgen ein Präfix von einer von ihnen sind ["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

Warum .nachher true?
Kritixi Lithos

1
@KritixiLithos In SWI-Prolog , wenn eine Abfrage wahr es druckt ist true.und false.anders. Ich habe dies nur neu implementiert: Wenn die Ausgabe ignoriert wird (so wie sie hier ist) und es keine Schreibvorgänge gibt STDOUT, wird sie gedruckt true.oder false.abhängig davon, ob das Hauptprädikat erfolgreich ist oder fehlschlägt. Es hat einen Punkt in SWI-Prolog, weil true.und false.tatsächlich gültige Programme sind, die immer erfolgreich sind / immer fehlschlagen.
Fatalize

Wie funktioniert diese Lösung, ohne tanexplizit in der Liste zu erscheinen?
Synoli

2
@ Synoli Das tut es nicht. Ich habe es auf Kosten von 3 Bytes behoben, danke.
Fatalize

4

Perl 6 ,  60 50  44 Bytes

erster Versuch ( 60 )

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

Übersetzung der Perl 5 Antwort ( 50 )

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

mit -nSchalter ( 43 + 1 )

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

Der erste ?konvertiert das Ergebnis in einen Booleschen Wert und der erste konvertiert das Ergebnis in +eine Zahl ( 1für True, 0für False).


3

Mathematica, 101 Bytes

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

Es scheint, dass die schwierigen Teile dieser Herausforderung darin bestehen, die kürzeste Regex zu finden und die prägnanteste Sprache zu wählen, die zur Regex passt. Ich habe nichts zum ersteren beizutragen, und Mathematica ist kein guter Kandidat für das letztere, da Sie StringMatchQund verwenden müssen RegularExpression. Ich kann Ihnen nur antworten: Ist "geschmacklos" das längste Wort, das Sie eingeben können?

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" scheint also die längste von einem Charakter zu sein.


Warum ist das nicht konkurrierend? Ist die Funktion f Sie definieren nicht mit den Regeln der Herausforderung erfüllen?
Dennis

Nein, es gibt Trueoder Falseeher als ein einzelnes Zeichen.
Genisis

In mit Entscheidungsproblemen getaggten Beiträgen geht es darum, Richtig / Falsch zu bestimmen. Ich denke also, dass dies konkurriert.
FlipTack

Der Status "Nicht konkurrierend" ist für Einsendungen reserviert, die eine Sprache oder Sprachfunktion verwenden, die zum Zeitpunkt der Veröffentlichung der Herausforderung nicht vorhanden war oder einen Fehler aufwies.
Dennis

Fair genug. Ich habe meine Antwort bearbeitet, um eine tatsächliche Lösung zu erhalten.
Genisis

2

Wunder , 41 Bytes

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

Verwendungszweck:

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

Hat die Frage vorher total missverstanden, aber jetzt ist alles behoben. Ausgänge Ffür Übereinstimmung und Tfür keine Übereinstimmung.

Nicht konkurrierend, 35 Bytes

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

Verwendungszweck:

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

Hierfür werden anwendbare reguläre Ausdrücke verwendet, die nach dieser Herausforderung implementiert wurden.


2
nNach meinem Verständnis kann man im Taschenrechner nur das letzte Zeichen löschen, das heißt nicht eintippbar aber sinund lnsind.
Sunny Pun

Diese Regex erkennt saals wahr
Kritixi Lithos

1
Damit ist der Testfall nicht bestanden got.
Dennis

Ich glaube, es ist behoben.
Mama Fun Roll

Das ?macht den Unterausdruck fügsam; Siehe rexegg.com/regex-quantifiers.html#cheat_sheet . Aber selbst wenn man es mit gierig ??oder besitzergreifend ?+macht, funktioniert es aus irgendeinem Grund nicht (zumindest in PHP). coelostatsLöst die Falle aus (bei lound ta).
Titus

2

Verarbeitung, 223 Bytes

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;}

Endlich beschlossen, eine Antwort ohne Regex zu machen. Verwenden Sie zum Aufrufen der Funktion l("tasteless");. Gibt 0für false und 1für true zurück.

Erweiterter Code mit Erklärung

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;
}

Grundsätzlich iterieren wir über den angegebenen String und bauen bchar für char auf. Wir prüfen mit , d()wenn eine der tan, log... beginnen mit b. Wenn ja, ist es gültig. Andernfalls prüfen wir, ob das Zeichen an dieser Position gültig ist, und setzen es zurück b. Jetzt, wenn es ungültig ist, 0wird zurückgegeben, oder es wird noch gültig sein. Wenn das Programm am Ende noch nichts zurückgegeben hat, kehren Sie zurück 1.


Kann die dFunktion nicht a zurückgeben bool?
Roman Gräf

@ RomanGräf Es sind mehr Bytes zu verwenden booleanals int. Auch trueund falseerfordern mehr Bytes als 1und0
Kritixi Lithos

2

Scala, 49 Bytes

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

Gibt true zurück, wenn die angegebene Zeichenfolge mit dem regulären Ausdruck übereinstimmt, andernfalls false.


2

Python 3 , 154 Bytes

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=='')

Probieren Sie es online!


1
Möglicherweise müssen Sie die Einrückung überprüfen, ich musste den Code bearbeiten, damit es funktioniert
George

@ George, komisch, ich habe es in IDLE und dem Online-Compiler versucht, und beide scheinen zu funktionieren
Henke

2

Python 3 , 149 130 Bytes

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)

edit # 1: 19 Bytes mit @Henke Lösung rasiert


0

Python 2, 124 Bytes

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 Bytes

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

Von ETHproductions gestohlener Regex : Nimmt
Eingaben vom Kommandozeilenargument entgegen. druckt 1für typisierbar, 0für nicht typisierbar.

ältere Versionen, 75 73 69 Bytes

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

Ersetzt alle möglichen Wörter durch eine leere Zeichenfolge, gibt das Ergebnis zurück und negiert.

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

Teilt die Eingabe nach Regex-Übereinstimmungen auf. Flag 1steht für PREG_SPLIT_NO_EMPTYund weist preg_splitan, nur nicht leere Ergebnisse zurückzugeben. Wenn die Eingabe typisierbar ist, enthält preg_splitsie nur leere Ergebnisse, sodass ein leeres Array zurückgegeben wird, das falsch ist. !negiert das Ergebnis.

Beide Versionen nehmen Eingaben vom Kommandozeilenargument entgegen
und geben aus, 1wenn das Ergebnis leer ist (Eingaben können eingegeben werden), sonst nichts.

Anmerkungen: Das
Packen des regulären Ausdrucks mit ?funktioniert hier nicht. es macht die Ausdrücke grässlich; wahrscheinlich wegen backtracking. Und die Reihenfolge der Alternativen ist wichtig: tamuss vorher stehen toder der Motor hört auf zu passen, wenn er es findet t.

Ich habe ein Quantifier-Spickzettel gefunden , dachte ??oder ?+könnte helfen; aber sie arbeiteten nicht für mich.


0

Java 8, 55 Bytes

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

Disclamer: Ich habe den regulären Ausdruck von ETHproductions verwendet, weil er viele Bytes kürzer war als meiner. Volle Gutschrift auf dem Regex an ihn. Ich habe 24 Bytes hinzugefügt, um es zu einer Java-Funktion zu machen.

Gibt zurück, falsewenn das Wort nicht in den Regex passte, sonst true.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.