Czy jestem inżynierem?

42

Ostatnio inżynier elektryk badający czasy na światłach został ukarany grzywną w wysokości 500 dolarów przez stan Oregon za określenie siebie jako inżyniera.

Biorąc pod uwagę 2-literowy ciąg jako dane wejściowe, reprezentujący stan USA, wynik:

  • I am not an engineerjeśli stan to Oregon ( OR)
  • I am an engineer jeśli stan jest jakimkolwiek innym stanem USA
  • What is an engineer? biorąc pod uwagę jakikolwiek inny wkład

Wyjściowy nie może zawierać żadnych wiodącą spacje, ale może zawierać tyle wleczonego spacji, jak chcesz.

Możesz założyć, że zawsze będą to 2 duże litery.

Oto lista wszystkich 50 skrótów stanu USA:

AL, AK, AZ, AR, CA, CO, CT, DE, FL, GA, HI, ID, IL, IN, IA, KS, KY, LA, ME,
MD, MA, MI, MN, MS, MO, MT, NE, NV, NH, NJ, NM, NY, NC, ND, OH, OK, OR, PA,
RI, SC, SD, TN, TX, UT, VT, VA, WA, WV, WI, WY

Punktacja

To jest , więc wygrywa najmniej bajtów w każdym języku !

Skidsdev
źródło
Czy mogę uzyskać końcowe miejsce na wyjściu?
Business Cat
@BusinessCat tak, zaktualizuje specyfikację, aby powiedzieć, że
Skidsdev,
4
Uwaga dodatkowa: Jeśli połączysz cały łańcuch razem, otrzymasz „... OKOR PARIS CSDTN ...” ;-)
Mateen Ulhaq
Matsowi Järlströmowi również nie pozwolono by się przedstawić jako inżynier w Teksasie.
Ben Voigt

Odpowiedzi:

17

C #, 311 309 240 237 222 195 184 183 bajtów

s=>s=="OR"?"I am not an engineer":"MINCALA MSCTNMNVAKY WAZ PAR FL GA NHID COKSD ME MDE MA MTX NE NJ NY ND MOH RIA UT WVT WIL WY".Contains(s)?"I am an engineer":"What is an engineer?";

Wypróbuj online!

Zaoszczędzono 2 bajty, dodając spację wcześniej andob

-69 (huehue) -72 bajty dzięki TheLethalCoder

-15 bajtów dzięki ciągowi stanów genialnego TotallyHuman

-38 bajtów więcej kompresji ciągu

Nie golfowany:

public static string a(string s)
{
    var b = " an engineer";
    if (s == "OR")
    {
        return "I am not" + b;
    }
    else
    {
        if ("MINCALA MSCTNMNVAKY WAZ PAR FL GA NHID COKSD ME MDE MA MTX NE NJ NY ND MOH RIA UT WVT WIL WY".Contains(s))
        {
            return "I am" + b;
        }
        else
        {
            return $"What is{b}?";
        }
    }
}
Skidsdev
źródło
Użyj ..."+bzamiast interpolowanych ciągów, zmień if..else if...elsena return s==„LUB”? ....: System.Arr ... `tzn. Użyj trójki. Użyj u.Containszamiast Array.Exists. Myślę, że jeśli użyjesz spacji zamiast przecinków, to .Split()bez parametrów będzie działać.
TheLethalCoder
zadeklaruj b iu w tej samej linii i nawet jeśli musisz użyć jawnego typu ciąg powinien nadal oszczędzić bajt
LiefdeWen
@StefanDelport uto tablica, a nie ciąg znaków. Można jednak zapisać bajty, ustawiając je ujako ciąg i używając .Containsgo.
TheLethalCoder
240 bajtów: s=>{var b=" an engineer";return s=="OR"?"I am not"+b:"AL AK AZ AR CA CO CT DE FL GA HI ID IL IN IA KS KY LA ME MD MA MI MN MS MO MT NE NV NH NJ NM NY NC ND OH OK PA RI SC SD TN TX UT VT VA WA WV WI WY".Contains(s)?"I am"+b:$"What is{b}?";};. Myślę, że usunąłem wszystkie odpowiednie białe znaki. (Nie
przetestowano
1
Możesz zagrać w golfa, definiując „inżyniera” jako osobną zmienną, aby zaoszczędzić niektóre bajty.
OldBunny2800
11

JavaScript (ES6), 182 bajty

s=>['I am'+(x=' an engineer'),`What is${x}?`,'I am not'+x][s=='OR'?2:'MNNMLATNAKALARAZCACOCTDEFLGAHIIAIDILINKSKYMAMDMEMIMOMSMTNCNDNENHNJNVNYOHOKPARISCSDTXUTVAVTWAWIWVWY'.search(s)&1]

Próbny

Arnauld
źródło
3
Nie powiedzie się np . LA: /
Christoph
@Christoph powinien być teraz OK. Dziękujemy za zgłoszenie tego!
Arnauld
Pomyślałem, że na chwilę brakuje LUB - głupie!
Chas Brown,
Użyj codegolf.stackexchange.com/a/124164/76323, aby zoptymalizować
l4m2
8

C, 215 208 190 bajtów

-7 dzięki Cool Guy

#define z" an engineer"
#define f(s)!strcmp(s,"OR")?"I am not"z:strstr("MINCALA MSCTNMNVAKY WAZ PAR FL GA NHID COKSD ME MDE MA MTX NE NJ NY ND MOH RIA UT WVT WIL WY",s)?"I am"z:"What is"z"?"

Używany przez „genus string” @ totalhuman.

Jak to działa:

  • "string"zautomatycznie łączy się "string"z z( " an engineer"). Tak, C to robi.
  • !strcmp(s,"OR") porównuje ciąg z „LUB”.
  • ?"I am not"zzwraca „Nie jestem inżynierem”, jeśli to prawda. Inaczej...
  • :strstr(...,s) sprawdza, czy genialny ciąg @ totalhuman zawiera podany ciąg.
  • ?"I am"z zwraca „Jestem inżynierem”, jeśli tak, i ...
  • :"What is"z"?")zwraca „Co to jest inżynier?” Inaczej.

Wypróbuj online!

MD XF
źródło
1
206 bajtów:#define z " an engineer" f(char*s){!strcmp(s,"OR")?puts("I am not"z):strstr("MINCALA MSCTNMNVAKY WAZ PAR FL GA NHID COKSD ME MDE MA MTX NE NJ NY ND MOH RIA UT WVT WIL WY",s)?puts("I am"z):puts("What is"z);}
Spikatrix
@CoolGuy To nie zadziała w przypadku „Czym jest inżynier?” Ale udało mi się pracować w 209 bajtach. Dzięki!
MD XF
Możesz zwrócić ciąg zamiast go wydrukować
l4m2
@ l4m2 Zrobił coś podobnego.
MD XF,
6

Python 2 , 228 168 bajtów

lambda s:('What is%s?','I am'+' not'*(s=='OR')+'%s')[s in'MINCALA MSCTNMNVAKY WAZ PAR FL GA NHID COKSD ME MDE MA MTX NE NJ NY ND MOH ORIA UT WVT WIL WY']%' an engineer'

Wypróbuj online!

Felipe Nardi Batista
źródło
2
Kodowanie stanu jest przezabawne.
Ramon Snir
5

Python 2 , 192 186 182 178 176 bajtów

Prawdopodobnie mógł bardziej skompresować ciąg stanu.

lambda s,e=' an engineer':'I am'+' not'*(s=='OR')+e if s in'MINCALAZ SCT FL GA WIAKSD ME MD MA MNMS MOKY MTNE NVTX NH NJ NY ND COHIDE OR PARIL UT VA WA WV WY'else'What is%s?'%e

Wypróbuj online!

całkowicie ludzki
źródło
2
Używać tylko uw if s in umożna zauważyć go używać bezpośrednio zamiast deklarowania go?
TheLethalCoder
1
@ totalniehuman, że kompresja łańcuchów jest niesamowita, fajna!
Skidsdev,
2
@totallyhuman VALA WAZ NCA COH CTX SDE FL GA HID WIL MIN IAKSC KY ME MD MA MNMS MOK MTNE NH NJ NY ND PARI UT NVT WV WYto najmniejszy, jaki potrafię
Skidsdev,
2
'MINCALA MSCTNMNVAKY WAZ PAR FL GA NHID COKSD ME MDE MA MTX NE NJ NY ND MOH ORIA UT WVT WIL WY'
Felipe Nardi Batista
2
Ups, przepraszam, że zajęło mi to tak długo. Wygląda na to, że zgubiłem, ponieważ kopiowanie tego ciągu nie poprawia mojej odpowiedzi niż ta, która go używa. Proszę przestać głosować i głosować na inną lepszą odpowiedź.
całkowicieludzki
5

Java (JDK 10) , 184 bajty

s->s.format(s.equals("OR")?"I am not%s":"MINCALA MSCTNMNVAKY WAZ PAR FL GA NHID COKSD ME MDE MA MTX NE NJ NY ND MOH RIA UT WVT WIL WY".contains(s)?"I am%s":"What is%s?"," an engineer")

Wypróbuj online!

Przepraszam za ponowne użycie skompresowanego ciągu: sam nie mogłem znaleźć nic lepszego ... :(

Olivier Grégoire
źródło
4

05AB1E , 104 103 101 bajtów

„€À€ˆ„I€Ü‚.•~Zµ∞/'—¶[@øl•Œ2ù.•9₆\|&׃Ω#àöF},cΓ páe;ð²∍₆jÌn#dÅ?DvĆ8A•2ôìuIå©è¹„ORQi'€–}„€¤©É)ðýª'?®_×J

Wypróbuj online!

Stara 104-bajtowa wersja w przypadku, gdy łatwiej ją poprawić.

„€À€ˆ„I€Ü‚.•ÂkXñ…ΓVt€Ïè∍‡Λi„2¶’að=–½6™oÑþÁāõgO·ð~
λ†₃›;â&ÄFv¾‡1~ǝQa«;cS•u2ôIå©è¹„ORQi'€–}„€¤©É)ðýª'?®_×J

Niezadowolony z kompresji ani specjalnego przypadku ?.

Emigna
źródło
OK co to jest? Czy właśnie zmieniłeś kolejność stanów czy coś takiego?
Erik the Outgolfer
@EriktheOutgolfer: 104-bajtowa wersja to tylko kompresja liczb odpowiadających pozycjom znaków w alfabecie (A=1,C=3 ...). Wersja 103-bajtowa robi to samo dla niektórych stanów i łączy niektóre stany, które kończą się tą samą literą, od której zaczyna się nowy stan. Jestem pewien, że można to jeszcze poprawić i dodam lepsze wytłumaczenie, gdy będę więcej grał w golfa.
Emigna
1
Niezła odpowiedź! Lubię te .•~Zµ∞/'—¶[@øl•Œ2ù, których użyłeś w niektórych stanach, zamiast po prostu kompresować wszystkie stany i robić . I ogólnie dobre podejście. (Cieszę się, że widziałem twoją odpowiedź, zanim spróbowałem czegoś sam, ponieważ zdecydowanie nie byłby tak krótki ..)
Kevin Cruijssen,
4

F # , 222 bajty

let f v=let (a,b)=if ("WALAKSCARINMNVTNCTX NHIDE MOHIL COKY MSD PAZ WIA WVA FL GA MA MD ME MI MT NE ND NJ NY UT WY").Contains v then ("I am",".") elif "OR"=v then ("I am not",".") else ("What is","?") in a+" an engineer"+b

Wypróbuj online!

Rozszerzony:

let f v =
    let (a, b) =
        if ("WALAKSCARINMNVTNCTX NHIDE MOHIL COKY MSD PAZ WIA WVA FL GA MA MD ME MI MT NE ND NJ NY UT WY").Contains v then ("I am", ".")
        elif "OR" = v then ("I am not", ".")
        else ("What is", "?")
    a + " an engineer" + b

Biorąc pod uwagę dwuliterowy stan v przekazany do funkcji f , zbuduj krotkę (a, b) reprezentującą głowę i ogon zdania „inżynierskiego”.

Możesz swobodnie korzystać z „łańcucha stanu skompresowanego”; jest o cały bajt krótszy niż MINCALA ...

Vern DeHaven
źródło
4

R , 109 96 bajtów

function(x)sub("#"," an engineer",c("I am not#","I am#","What is#?"))[2-x%in%state.abb+!x=="OR"]

Wypróbuj online!

13 bajtów dzięki J.Doe - poprzez użycie wyrażenia regularnego i indeksacji.

JayCe
źródło
1
97 bajtów
J.Doe
1
@ J.Doe subjest znacznie lepszy, dziękuję!
JayCe,
96 bajtów 😉
J.Doe
@ J.Doe Oczywiście!
JayCe
3

Japt , 136 135 131 129 128 bajtów

Więcej oszczędności można uzyskać, eksperymentując z kolejnością skrótów państwowych - wrócę do tego za chwilę.

`mnnmlãGLÏz¯¬ct¸flgaá[9¨kyµmçpCijmsmtnhnvnyn¬kpÂÉcsdk¡x©vavt°±wvwy`ò øUv)?"I am {¥"OR"?"not ":P}"+` à¨\ `:`Wt   à¨\?

Wypróbuj online


Wyjaśnienie

  • Bierzemy skompresowany ciąg małych liter, dekompresujemy go i dzielimy na tablicę 2 łańcuchów znaków, używając tej òmetody.
  • Następnie używamy ømetody, aby sprawdzić, czy tablica zawiera Uv, czyli łańcuch wejściowy przekonwertowany na małe litery.
  • Jeśli tak, budujemy nasz ciąg wyjściowy, zaczynając od "I am "
  • Sprawdzenie, czy wejściowy ciąg znaków ¥(jest równy) "OR"pozwala nam dołączyć jedną "not "lub pustą zmienną ciągu P.
  • Następnie dekompresujemy i dołączamy skompresowany ciąg "an engineer".
  • Jeśli dane wejściowe nie zostały znalezione w tablicy, wówczas wypisujemy dekompresję skompresowanego łańcucha "What is an engineer?".
Kudłaty
źródło
3

Python 3 , 180 179 178 bajtów

def f(s):e=" not"*(s=="OR")+" an engineer";return"I am"+e if s in"PALAKSCAZ CTNMINCOR FL GA MDE ME MND MA MSD MOKY NE NH NJ NY WA OHID UTX MTNVARIA WIL WVT WY"else"What is"+e+"?"

Wypróbuj online!

int6h
źródło
Tak, to prawda: wypróbuj online!
int6h
166 bajtów . Jestem pewien, że strunę można jeszcze bardziej zaostrzyć, ponownie wykorzystując stany
Jo King,
Dzięki @JoKing. W tym momencie IMO za bardzo przypomina odpowiedź Python 2 :). Próbowałem skompresować ciąg, ale najkrótszy, jaki mogłem uzyskać, to 92 symbole. Napisałem krótki skrypt, aby to zrobić, ale można go ograniczyć do 94 znaków i nie kompresuje się optymalnie. Myślę również, że w tym konkretnym wyzwaniu sam magiczny ciąg nie powinien być wliczany do liczby bajtów.
int6h
2

CJam , 143 bajty

"ORIA MINCALA MSCTNMNVAKY WAZ PAR FL GA NHID COKSD ME MDE MA MTX NE NJ NY ND MOH UT WVT WIL WY"q#g"I am not 
I am 
What is?"N/=)" an engineer"\

Wypróbuj online! lub jako pakiet testowy

Wyjaśnienie

"ORIA...."       e# Push a string in which every state is a substring, but no non-state is
                 e# a substring.
q                e# Read the input.
#                e# Find the index of the input in the string. (-1 if not found)
g                e# Signum of the index: -1 for negative, 0 for 0, 1 for positive.
"I am.... "      e# Push this string. Note the trailing space on the first two lines of it.
N/               e# Split it on newlines.
=                e# Get the string at index given by the signum.
)                e# Pull out the last character.
" an engineer"\  e# Push " an engineer" and bring the other character to the TOS.
                 e# Implicit output.

Ponieważ Oregon ( OR) znajduje się na początku ciągu, znalezienie znaku indeksu wejścia będzie wynosić -1, jeśli nie zostanie znalezione, 0 jeśli OR, 1 jeśli dowolny inny stan. Który ciąg do wydrukowania może w ten sposób zdecydować.

Business Cat
źródło
2

PHP, 188 bajtów

$e=" an engineer";echo strpos(_TNNMLAALAKAZARCACOCTDEFLGAHIIDILINIAKSKYMEMDMAMIMNMSMOMTNENVNHNJNYNCNDOHOKORPARISCSDTXUTVTVAWAWVWIWY,$argn)&1?"I am".($argn!="OR"?"":" not").$e:"What is$e?";

Wypróbuj online!

Jörg Hülsermann
źródło
in_array(...)do strpos(_AKALARAZCACOCTDEFLGAHIIAIDILINKSKYLAMAMDMEMIMNMOMSMTNCNDNENHNJNMNVNYOHOKPARISCSDTNTXUTVAVTWAWIWVWY,$argn)&1.
Christoph
@Christoph nie działa w przypadku danych wejściowych na przykład LA
Jörg Hülsermann
Hm racja: / może możemy trochę zmienić kolejność struny ... Spróbuję. Unieważnia również odpowiedź js btw.
Christoph
_NMMNINTNRIHIMIWISCNCCTMTUTVTWVNVFLILCAALGAIAMAPAVAWACOLAMOAKARKSMSNHOHOKORAZDEIDKYMEMDNENJNYNDSDTXWYdziała
Christoph
@Christoph Lub moje zamówienie też działa.
Jörg Hülsermann
2

C #, 178 bajtów

s=>(s=="OR"?"I am notx":"MINCALA MSCTNMNVAKY WAZ PARIA FL GA NHID COKSD ME MDE MA MTX NE NJ NY ND MOH UT WVT WIL WY".Contains(s)?"I amx":"What isx?").Replace("x"," an engineer");

Uruchom w C # Pad

Golf oparty na rozwiązaniu Mayube ; nowe tutaj, więc nie mam wystarczającej liczby przedstawicieli, aby móc komentować.

Arthur Rump
źródło
Może chcesz edytować link do jego rozwiązania :) Jeśli klikniesz opcję Udostępnij na jego rozwiązaniu, otrzymasz link bezpośrednio do niego.
Stephen
@StephenS Dzięki za wskazówkę!
Arthur Rump,
2

Haskell , 220 214 210 209 bajtów

s(a:b:c)=[a,b]:s(b:c)
s _=[]
a="I am "
e="an engineer "
i"OR"=a++"not "++e
i x|x`elem`s"MINCALA MSCTNMNVAKY WAZ PAR FL GA NHID COKSD ME MDE MA MTX NE NJ NY ND MOH RIA UT WVT WIL WY"=a++e
i _="What is "++e++"?"

Wypróbuj online!

bartavelle
źródło
w przeciwnym razie = Prawda, 1<2jest jeszcze krótszy
BlackCap
Facepalm , dzięki!
bartavelle
Uwzględniłeś ORdługi ciąg w drugiej definicji i
BlackCap
Ukradłem długi sznur z innych odpowiedzi. Czy to nie jest jego część?
bartavelle
1
Nie, już nie :)
BlackCap
1

JavaScript 204

s=>{h=/^(A[LKZR]|C[AOT]|DE|FL|[GPLV]A|[HR]I|I[DLNA]|K[SY]|M[EDAINSOT]|N[EVHJMYCD]|O[HK]|S[CD]|T[NX]|[VU]T|W[AVIY]|(OR))$/.exec(s);return(!h?"What is ":"I am "+(h[2]?"not ":""))+"an engineer"+(!h?'?':'')}
jaskółka oknówka
źródło
1
Czysta optymalizacjas=>(!(h=/(A[LKZR]|C[AOT]|DE|FL|[GPLV]A|[HR]I|I[DLNA]|K[SY]|M[EDAINSOT]|N[EVHJMYCD]|O[HKR]|S[CD]|T[NX]|[VU]T|W[AVIY])/.test(s))?"What is":"I am"+(s=='OR'?" not":""))+" an engineer"+['?'[+h]]
l4m2
@ l4m2 nicea, to jest mój rytm odpowiedzi.
martin
1

AWK, 189 bajtów

/A[LKZR]|C[AOT]|DE|FL|[GPV]A|HI|I[DLNA]|KS|KY|LA|M[EDAINSOT]|N[EVHJMYCD]|O[HKR]|RI|SC|SD|TN|TX|UT|VT|W[AVIY]/{print"I am "($0~OR?"not ":"")"an engineer";exit}
{print"What is an engineer?"}

Jeśli dane wejściowe pasują do wyrażenia regularnego zawierającego wszystkie skróty stanu, wydrukuj „Jestem inżynierem” z „nie” wstawionym na środku, jeśli stan to Oregon, a następnie wyjdź.

Jeśli dane wejściowe nie pasują do wyrażenia regularnego, nie może to być skrót stanu USA.

Arc676
źródło
1

Python 3, 238 bajtów

def f(x):s=x in('ALAKAZARCACOCTDEFLGAHIIDILINIAKSKYLAMEMDMAMIMNMSMOMTNENVNHNJNMNYNCNDOHOKORPARISCSDTNTXUTVTVAWAWVWIWY'[i:i+2]for i in range(0,100,2));o=x=='OR';q=(1-o)*(1-s);return q*'What is'+(1-q)*('I am'+o*' not')+' an engineer'+q*'?'

Wyjaśnienie

Nie zastosowano technik kompresji.

def f(x):
    # Check if State
    s = x in ('ALAK...WIWY'[i:i+2]
              for i in range(0, 100, 2))

    # Check if Oregon
    o = x == 'OR'

    # Check if neither Oregon nor State
    q = (1-o) * (1-s)

    # Construct output string
    return q * 'What is' + \
        (1-q) * ('I am' + o * ' not') + \
        ' an engineer' + \
        q * '?'
Mateen Ulhaq
źródło
To Oregon, nie Ohio.
L3viathan
1
@ L3viathan Nie jestem pewien, jak mam to zepsuć po tym, jak wszędzie widzę Oregon z powodu Life is Strange ... ¯ \ _ (ツ) _ / ¯
Mateen Ulhaq
1

Java, 173 bajty

s->(!"MINCALARIA MSCTNMNVAKY WAZ PAR FL GA NHID COKSD ME MDE MA MTX NE NJ NY ND MOH UT WVT WIL WY OR".contains(s)?"What is":"I am"+(s.equals("OR")?" not":""))+" an engineer"
JWH
źródło
3
Witamy w PPCG! Wszystkie wpisy muszą być pełnym programem lub funkcją; Wierzę, że możesz to zmienić w poprawne wyrażenie lambda (a zatem i funkcję), dodając s->do początku.
ETHproductions
1

Stax , 100 bajtów

Ten język jest datą na wyzwanie. Ale autor (ja) nie widział tego do tej pory.

éë&W≈#W¬π█▐╜╣╟◙√a☻∞ZrπU♫ÿô♠▌⌠Që≡AûpI⌡ÄNA綵↑╝╣òøΩ.¬É]╩Æ↓d∩é¡2ŲeB┼¼▬5∟┤sW♠♂↑q▐WMï╝|Ñ↑╫+3¼↔îûvlLΩ∟┬oë

Uruchom i debuguj

rekurencyjny
źródło
1

JavaScript ES6, 175 171 bajtów

x=>[`What is${e=" an engineer"}?`,`I am${x=="OR"?" not"+e:e}`][+!!'MINCALA MSCTNMNVAKY WAZ PAR FL GA NHID COKSD ME MDE MA MTX NE NJ NY ND MOH ORIA UT WVT WIL WY'.match(x)]

Dołączył wiele dobrych

Lub 152 bajty na kodowaniu ISO

Generator:

'x=>[`What is${e=" an engineer"}?`,`I am${x=="OR"?" not"+e:e}`][+!!btoa`*`.match(x)]'.replace('*',atob('MINCALA MSCTNMNVAKY WAZ PAR FL GA NHID COKSD ME MDE MA MTX NE NJ NY ND MOH ORIA UT WVT WIL WY '.replace(/ /g,'/')))
l4m2
źródło
Może być możliwe przestawienie łańcucha, więc użycie btoa do rozwinięcia
l4m2
1

C (gcc) , 0 + 176 bajtów

-Dz"=an engineer" -Df(s)*s-79|1[s]-82?strstr("MINCALA=MSCTNMNVAKY WAZ PAR FL GA NHID COKSD ME MDE MA MTX NE NJ NY ND MOH RIA UT WVT WIL WY",s)?"I am"z:"What is"z"?":"I am not"z

Wypróbuj online!

czyste tłumaczenie

l4m2
źródło
1

PowerShell, 175 bajtów

(('I am'+' not'*!($i='ORIA MINCALA MSCTNMNVAKY WAZ PAR FL GA NHID COKSD ME MDE MA MTX NE NJ NY ND MOH UT WVT WIL WY'.IndexOf($args))+($e=' an engineer')),"What is$e`?")[!++$i]

Skrypt testowy:

$f = {

$e=' an engineer'
$i='ORIA MINCALA MSCTNMNVAKY WAZ PAR FL GA NHID COKSD ME MDE MA MTX NE NJ NY ND MOH UT WVT WIL WY'.IndexOf($args)
(('I am'+' not'*!$i+$e),"What is$e`?")[!++$i]

# Important! OR is a first state in the modified @totallyhuman's genuis string

}

@(
    ,('OR', 'I am not an engineer')
    ,('AL', 'I am an engineer')
    ,('IL', 'I am an engineer')
    ,('ZZ', 'What is an engineer?')
) | % {
    $s,$e = $_
    $r = &$f $s
    "$($r-eq$e): $r"
}

Wynik:

True: I am not an engineer
True: I am an engineer
True: I am an engineer
True: What is an engineer?
mazzy
źródło
0

Python 3 , 236 182 181 bajtów

lambda s:'I am not'+e if s=='OR'else'I am'+e if s in'MINCALA MSCTNMNVAKY WAZ PAR FL GA NHID COKSD ME MDE MA MTX NE NJ NY ND MOH RIA UT WVT WIL WY'else'What is%s?'%e
e=' an engineer'

Wypróbuj online!

TIO zawiera przypadki testowe dla wszystkich stanów.
-54 bajty dzięki kompresji łańcucha

Notts90
źródło
Możesz użyć kompresji ciągów z innych odpowiedzi, aby zapisać bajty
TheLethalCoder
1
MINCALA MSCTNMNVAKY WAZ PAR FL GA NHID COKSD ME MDE MA MTX NE NJ NY ND MOH ORIA UT WVT WIL WYjest lepsza kompresja
Skidsdev
0

q / kdb +, 174 bajty

Rozwiązanie:

{a:" an engineer?";$[(#:)l:ss["ORIA MINCALA MSCTNMNVAKY WAZ PAR FL GA NHID COKSD ME MDE MA MTX NE NJ NY ND MOH UT WVT WIL WY";x];-1_"I am",$[l~(),0;" not";""],a;"What is",a]}

Wyjaśnienie:

  {
  // save string into variable a
  a:" an engineer?";
  // try to find the input x in the condensed string, save location in variable l, $ is a if/else
  $[(#:)l:ss["ORIA MINCALA MSCTNMNVAKY WAZ PAR FL GA NHID COKSD ME MDE MA MTX NE NJ NY ND MOH UT WVT WIL WY";x];
  // found a match, check if it was at index 0 ('OR') and inject " not" if so, drop the '?' off the end
  -1_"I am",$[l~(),0;" not";""],a;
  // otherwise return 'What is an engineer?'
  "What is",a]
  }

Uwagi:

Użyłem „skompresowanego” ciągu z innych odpowiedzi, starając się znaleźć sposób, aby umieścić go w jednym wierszu, aby uniknąć przypisania azmiennej (ale nadal dodawać, ?gdy wejście nie jest stanem.

Streetster
źródło
0

Siatkówka , 175 bajtów

..
I am $&~MINCALAZ SCT FL GA WIAKSD ME MD MA MNMS MOKY MTNE NVTX NH NJ NY ND COHIDE PARIL UT VA WA WV WY
(..)~.*\1.*
~
OR~.*
not ~
I am ..~.*
What is ~?
~
an engineer

Wypróbuj online! Mam nadzieję, że przywłaszczyłem listę najlepszych stanów. Wyjaśnienie:

..
I am $&~MINCALAZ SCT FL GA WIAKSD ME MD MA MNMS MOKY MTNE NVTX NH NJ NY ND COHIDE PARIL UT VA WA WV WY

Zacznij budować wynik. Wstaw także listę stanów do użycia w następnym etapie.

(..)~.*\1.*
~

Jeśli jest to jeden z 49 stanów, usuń stan i listę.

OR~.*
not ~

Jeśli jest to Oregon, zamień stan na noti usuń listę.

I am ..~.*
What is ~?

Jeśli to cokolwiek innego, zamień wszystko na inne dane wyjściowe.

~
an engineer

Dodaj te słowo na końcu, aby uniknąć powtórzeń.

Neil
źródło
0

Kryształ, 232 207 205 bajtów

i="ORALAKAZARCACOCTDEFLGAHIIDILINIAKSKYLAMEMDMAMIMNMSMOMTNENVNHNJNMNYNCNDOHOKPARISCSDTNTXUTVTVAWAWVWIWY".split(/(..)/).index ARGV[0];p (i ?"I am ": "What is ")+(i==1 ?"not ": "")+"an engineer"+(i ?"": "?")

Wypróbuj online . (nieznacznie zmodyfikowany z powodu problemu ARGV)

Domii
źródło
0

Współczynnik, 135 bajtów

USE: usa-cities [ " an engineer"swap [ "I am"swap string>state OR = 
[ " not"append ] when ""] [ 2drop "What is" "?"] recover surround ]

Bardziej czytelny i nazwany:

: engineer? ( state-name -- str ) 
  [ " an engineer" ] dip ! put this below the input on the stack 
  [ 
    [ "I am" ] dip       ! put this below the input too but above the other 
    string>state OR =    ! string>state throws on a non-state name 
    [ " not" append ] when ""  ! otherwise and if it is OR, append this 
  ] 
  [ 2drop "What is" "?" ] recover surround ; ! catch error, surround string

[ x ] dipi x swapsą równoważne w efekcie stosu ale pierwsza jest krótsza tylko gdy zagnieżdżone: [ [ [ x ] dip ] dip ] dip.

kot
źródło
0

Python 2, 213 211 194 bajtów

c="uTXnMSCORIDEwVAKYmTNHILfLAZpALmNEmOKSDwINCARmEwAnJnDmAmIAgAwYcTnVToHnYmD"
r=(lambda x:x in c or x[0].lower()+x[1]in c)(i)^1
u="What is "*r+("I am "+"not "*(i=="OR"))*(r^1)+"an engineer"+"?"*r

Wypróbuj online

Rzeczy, nad którymi pracuję nad skracaniem:

  • (i=="OR")
  • or x[0].lower()+x[1]in c

Aktualizacja:

  • Zapisano 2 bajty, zastępując s=not rjes=r^1
  • Oddzielny nagłówek i stopka kodu
Raffi
źródło
0

Rubin, 164 bajty

->s{r="What is an engineer?"
j=379
"##(*Q0'7q;N>%*$o(.F%#&'#&#5##%$%+%5%)5r@#P,B353*/%".bytes{|i|s==(j+=i-34).to_s(36).upcase&&r="I am not"[0,i==41?8:4]+r[7,12]}
r}

Wykorzystuje kodowanie długości przebiegu, dlatego ciąg magiczny ma długość 50 bajtów, po jednym na stan. Aby to zbudować, najpierw konieczne było umieszczenie kodów stanu w kolejności alfabetycznej kodu stanu, a nie nazwy stanu. Niestety potrzeba 7 bajtów, aby przekonwertować reprezentację base36 jz małego kodu statycznego na duży kod statyczny.

Niegolfowany w programie testowym

f=->s{                                                  #s is the input string.
  r="What is an engineer?"                              #Set r to "What is an engineer?"
  j=379                                                 #Set j to one less than 380, which in base36 becomes AK, the first statecode alphabetically
  "##(*Q0'7q;N>%*$o(.F%#&'#&#5##%$%+%5%)5r@#P,B353*/%". #Iterate through the run length encoded string 
  bytes{|i|                                             #(each character represents how far in base 36 each state code is from the previous one)
    s==(j+=i-34).to_s(36).upcase&&                      #take the ascii value of the character and subtract 34 (example #=35-34=1) and add to j. Convert j to base36 to get a state code.
      r="I am not"[0,i==41?8:4]+r[7,12]                 #if the state code matches s, modify r. Take the first 4 characters of "I am not" (first 8 in the case of OR where i==41) 
  }                                                     #and add r[7,12]==" an engineer" (12 characters of the existing value of r, starting at character 7 
r}                                                      #return r

%w{AL AK AZ AR CA CO CT DE FL GA HI ID IL IN IA KS KY LA ME MD MA MI MN MS MO MT NE NV NH NJ NM NY NC ND OH OK OR PA RI SC SD TN TX UT VT VA WA WV WI WY XX}.map{|i|p [i,f[i]]}
Level River St
źródło