Eu sou engenheiro?

42

Recentemente, um engenheiro elétrico que estudava o horário dos semáforos foi multado em US $ 500 pelo estado de Oregon por se referir a si mesmo como engenheiro.

Dada uma entrada com 2 letras, representando um estado dos EUA, produza:

  • I am not an engineerse o estado for Oregon ( OR)
  • I am an engineer se o estado for qualquer outro estado dos EUA
  • What is an engineer? dada qualquer outra entrada

A saída pode não conter nenhum espaço em branco à esquerda , mas pode conter o espaço em branco à direita que você desejar.

Você pode assumir que a entrada sempre terá duas letras maiúsculas.

Aqui está uma lista de todas as 50 abreviações de estados dos EUA:

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

Pontuação

Isso é , e o menor número de bytes em cada idioma vence!

Skidsdev
fonte
Posso ter um espaço à direita na saída?
Cat Negócios
@BusinessCat sim, irá atualizar especificação para dizer que
Skidsdev
4
Nota: Se você concatenar a seqüência inteira juntos, você começa "... Okor PARIS CSDTN ..." ;-)
Mateen Ulhaq
Mats Järlström também não teria permissão para se apresentar como engenheiro no Texas.
Ben Voigt

Respostas:

17

C #, 311 309 240 237 222 195 184 183 bytes

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?";

Experimente online!

Economizou 2 bytes adicionando o espaço antes anparab

-69 (huehue) -72 bytes graças a TheLethalCoder

-15 bytes graças à sequência de estados geniais da TotallyHuman

-38 bytes cos mais compressão de strings

Ungolfed:

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
fonte
Use em ..."+bvez de seqüências de caracteres interpoladas, altere if..else if...elsepara return s=="OR"? ....: System.Arr ... `ou seja, use um ternário. Use em u.Containsvez de Array.Exists. Eu acho que se você usar espaços em vez de vírgulas, .Split()sem parâmetros irá funcionar.
precisa saber é o seguinte
declarar b e u na mesma linha e mesmo que você tem que usar tipo string explícita ainda deve poupar um byte
LiefdeWen
@StefanDelport ué uma matriz, não uma string. No entanto, você pode salvar bytes definindo ucomo uma sequência e usando .Containsnela.
precisa saber é o seguinte
240 bytes: 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}?";};. Acho que removi todo o espaço em branco relevante. (Não testado)
TheLethalCoder
1
Você pode jogar isso definindo "um engenheiro" como uma variável separada para salvar alguns bytes.
precisa saber é o seguinte
11

JavaScript (ES6), 182 bytes

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

Demo

Arnauld
fonte
3
Não consegue, por exemplo LA: /
Christoph
@Christoph Deve ficar bem agora. Obrigado por denunciar isso!
precisa
Pensei que estava faltando OU por um momento - bobo!
precisa
Use codegolf.stackexchange.com/a/124164/76323 para otimizar
l4m2 9/18
8

C, 215 208 190 bytes

-7 graças a 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"?"

Usada "genus string" de totallyhuman.

Como funciona:

  • "string"zconcatena automaticamente "string"com z( " an engineer"). Sim, C faz isso.
  • !strcmp(s,"OR") compara a string com "OR".
  • ?"I am not"zretorna "Eu não sou um engenheiro" se verdadeiro. De outra forma...
  • :strstr(...,s) verifica se a sequência genial de @ totallyhuman contém a sequência fornecida.
  • ?"I am"z retorna "eu sou engenheiro", se sim, e ...
  • :"What is"z"?")retorna "O que é um engenheiro?" de outra forma.

Experimente online!

MD XF
fonte
1
206 bytes:#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 3/17/17
@CoolGuy Isso não funciona para "O que é um engenheiro?" Mas consegui funcionar em 209 bytes. Obrigado!
MD XF
Você pode retornar a string em vez de imprimi-lo
l4m2
@ l4m2 Fiz algo semelhante.
MD XF
6

Python 2 , 228 168 bytes

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'

Experimente online!

Felipe Nardi Batista
fonte
2
A codificação de estado é hilária.
Ramon Snir #
5

Python 2 , 192 186 182 178 176 bytes

Provavelmente poderia comprimir mais a cadeia de estado.

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

Experimente online!

totalmente humano
fonte
2
Você usa apenas uem if s in uque você pode usá-lo diretamente em vez de declará-lo?
TheLethalCoder
1
@totallyhuman essa compactação de strings é incrível, ótima!
precisa saber é o seguinte
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 WYé o menor eu posso fazer isso
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
Opa, desculpe, demorei tanto. Parece que perdi ao copiar essa sequência não faz minha resposta melhor do que a que a está usando. Por favor, pare de votar novamente e vote em outra resposta melhor.
totallyhuman
5

Java (JDK 10) , 184 bytes

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

Experimente online!

Peço desculpas por reutilizar a sequência compactada: não consegui encontrar nada melhor sozinha ... :(

Olivier Grégoire
fonte
4

05AB1E , 104 103 101 bytes

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

Experimente online!

Versão antiga de 104 bytes, caso seja melhorada com mais facilidade.

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

Não está satisfeito com a compressão nem com o caso especial ?.

Emigna
fonte
OK o que é isso? Você acabou de reordenar os estados ou algo assim?
Erik the Outgolfer
@EriktheOutgolfer: A versão de 104 bytes é apenas uma compactação dos números correspondentes às posições dos caracteres no alfabeto (A=1,C=3 ...). A versão de 103 bytes faz o mesmo em alguns estados e mescla alguns estados que terminam na mesma letra em que um novo estado começa. Tenho certeza de que isso ainda pode ser melhorado e adicionarei uma explicação melhor quando jogar mais.
Emigna
1
Boa resposta! Eu gosto do .•~Zµ∞/'—¶[@øl•Œ2ùque você usou para alguns estados, em vez de apenas comprimir todos os estados e fazer o . E uma abordagem agradável em geral. (Ainda bem que eu vi sua resposta antes de tentar algo me, porque definitivamente não teria sido tão curto ..)
Kevin Cruijssen
4

F # , 222 bytes

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

Experimente online!

Expandido:

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

Dado um estado de duas letras v passado para a função f , construa uma tupla (a, b) representando a cabeça e a cauda da sentença "engenheiro".

Sinta-se livre para usar a "cadeia de estado compactada" livremente; é um byte inteiro mais curto que o do MINCALA ...

Vern DeHaven
fonte
4

R , 109 96 bytes

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

Experimente online!

13 bytes graças ao J.Doe - através do uso de regex e indexação.

JayCe
fonte
1
97 bytes
J.Doe 17/09/18
1
@ J.Doe subé muito melhor, obrigado!
jayce
96 bytes 😉
J.Doe
@ J.Doe Claro!
jayce
3

Japt , 136 135 131 129 129 128 bytes

Mais economias podem estar disponíveis, experimentando a ordem das abreviações do estado - voltarei a isso daqui a pouco.

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

Experimente online


Explicação

  • Nós pegamos uma sequência compactada das abreviações em minúsculas, descompactamos e dividimos em uma matriz de 2 seqüências de caracteres usando o òmétodo
  • Em seguida, usamos o ømétodo para verificar se a matriz contém Uv, que é a sequência de entrada convertida em minúscula.
  • Nesse caso, criamos nossa string de saída, começando com "I am "
  • Verificar se a sequência de entrada ¥(é igual a) "OR"permite acrescentar uma "not "variável ou a sequência vazia P.
  • E então descompactamos e anexamos a string compactada "an engineer".
  • Se a entrada não foi encontrada na matriz, produzimos a descompressão da string compactada "What is an engineer?".
Shaggy
fonte
3

Python 3 , 180 179 178 bytes

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+"?"

Experimente online!

int6h
fonte
Sim, está correto: experimente online!
int6h 17/09/18
166 bytes . Tenho certeza que a corda pode também ser apertados até um liitle mais reutilizando estados
Jo rei
Obrigado @JoKing. Assemelha-se muito à resposta do Python 2 neste momento IMO :). Eu tenho tentado comprimir a corda, mas o menor que consegui foi de 92 símbolos. Eu escrevi um script curto para fazer isso, mas ele só pode reduzi-lo a 94 caracteres e não é compactado de maneira ideal. Eu também acho que nesse desafio em particular a própria string mágica não deve ser incluída na contagem de bytes.
int6h 18/09/18
2

CJam , 143 bytes

"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"\

Experimente online! ou como uma suíte de teste

Explicação

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

Como Oregon ( OR) está no início da cadeia, a localização do índice da entrada será -1 se não for encontrada, 0 se OR, 1 se houver outro estado. Qual string imprimir pode ser decidida por isso.

Gato de negócios
fonte
2

PHP, 188 bytes

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

Experimente online!

Jörg Hülsermann
fonte
in_array(...)para strpos(_AKALARAZCACOCTDEFLGAHIIAIDILINKSKYLAMAMDMEMIMNMOMSMTNCNDNENHNJNMNVNYOHOKPARISCSDTNTXUTVAVTWAWIWVWY,$argn)&1.
Christoph
@Christoph não funciona para uma entrada, por exemplo, de LA
Jörg Hülsermann 2/17
Humm certo: / talvez possamos reordenar um pouco a corda .. Vou tentar. Também invalida a resposta js btw.
Christoph
_NMMNINTNRIHIMIWISCNCCTMTUTVTWVNVFLILCAALGAIAMAPAVAWACOLAMOAKARKSMSNHOHOKORAZDEIDKYMEMDNENJNYNDSDTXWYfunciona
Christoph
@Christoph Ou meu pedido também funciona.
Jörg Hülsermann 2/17
2

C #, 178 bytes

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");

Executar no C # Pad

Golfe baseado na solução da Mayube ; novo aqui, então não tenho representante suficiente para comentar.

Arthur Rump
fonte
Pode querer editar em um link para a solução dele :) Se você clicar em compartilhar na solução dele, ele fornecerá um link direto para ela.
Stephen
Obrigado Stephen pela dica!
Arthur Rump
2

Haskell , 220 214 210 209 bytes

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++"?"

Experimente online!

bartavelle
fonte
caso contrário = True, 1<2é ainda menor
Cabeção
Facepalm , obrigado!
#
Você incluiu ORna longa seqüência no segundo definição do i
Cabeção
Eu roubei a longa corda das outras respostas. OU não faz parte disso?
bartavelle
1
Não, não é mais :)
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?'?':'')}
Martin
fonte
1
Pure optimizes=>(!(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 nice, essa é minha resposta batida.
martin
1

AWK, 189 bytes

/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?"}

Se a entrada corresponder a um regex contendo todas as abreviações de estado, imprima "Eu sou um engenheiro" com um 'não' inserido no meio, se o estado for Oregon, e saia.

Se a entrada não corresponder ao regex, não deverá ser uma abreviação de estado dos EUA.

Arc676
fonte
1

Python 3, 238 bytes

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*'?'

Explicação

Nenhuma técnica de compressão usada.

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
fonte
É Oregon, não Ohio.
precisa saber é o seguinte
1
@ L3viathan Não tenho certeza como eu estragar tudo depois de ver Oregon toda parte devido à vida é estranha ... ¯ \ _ (ツ) _ / ¯
Mateen Ulhaq
1

Java, 173 bytes

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
fonte
3
Bem-vindo ao PPCG! Todas as entradas devem ser um programa completo ou uma função; Eu acredito que você pode transformar isso em uma expressão lambda válida (e, portanto, função) adicionando s->ao início.
ETHproductions
1

Stax , 100 bytes

Esse idioma adia o desafio. Mas o autor (eu) não o viu até agora.

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

Execute e depure

recursivo
fonte
1

JavaScript ES6, 175 171 bytes

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

Juntou muitos bons

Ou 152 bytes na codificação ISO

Gerador:

'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
fonte
Pode ser possível para reorganizar a corda de modo usando btoa para expandir
l4m2
1

C (gcc) , 0 + 176 bytes

-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

Experimente online!

pura tradução

l4m2
fonte
1

Powershell, 175 bytes

(('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]

Script de teste:

$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"
}

Saída:

True: I am not an engineer
True: I am an engineer
True: I am an engineer
True: What is an engineer?
confuso
fonte
0

Python 3 , 236 182 181 bytes

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'

Experimente online!

O TIO contém casos de teste para todos os estados.
-54 bytes graças à compressão de strings

Notts90
fonte
Você pode usar a compressão corda das outras respostas para salvar bytes
TheLethalCoder
1
MINCALA MSCTNMNVAKY WAZ PAR FL GA NHID COKSD ME MDE MA MTX NE NJ NY ND MOH ORIA UT WVT WIL WYé melhor compressão
Skidsdev 2/17
0

q / kdb +, 174 bytes

Solução:

{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]}

Explicação:

  {
  // 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]
  }

Notas:

Usou a string 'compactada' de outras respostas, lutando para encontrar uma maneira de trazê-la para uma única linha, a fim de evitar a atribuição da avariável (ainda assim, adicione a opção ?quando a entrada não for um estado.

rua
fonte
0

Retina , 175 bytes

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

Experimente online! Espero ter me apropriado da melhor lista de estados. Explicação:

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

Comece a construir o resultado. Além disso, insira a lista de estados para uso no próximo estágio.

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

Se for um dos 49 estados, exclua o estado e a lista.

OR~.*
not ~

Se for Oregon, substitua o estado por note exclua a lista.

I am ..~.*
What is ~?

Se houver mais alguma coisa, substitua tudo pela outra saída.

~
an engineer

Adicione estas palavras por último para evitar repetições.

Neil
fonte
0

Crystal, 232 207 205 Bytes

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

Experimente online . (ligeiramente modificado devido a um problema de ARGV)

Domii
fonte
0

Fator, 135 bytes

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

Mais legível e nomeado:

: 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 ] dipe x swapsão equivalentes em efeito chaminé, mas o primeiro é mais curto apenas quando aninhados: [ [ [ x ] dip ] dip ] dip.

gato
fonte
0

Python 2, 213 211 194 bytes

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

Experimente Online

Coisas que estou trabalhando para reduzir:

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

Atualizar:

  • Economizou 2 bytes substituindo s=not r pors=r^1
  • Cabeçalho e rodapé separados do código
Raffi
fonte
0

Ruby, 164 bytes

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

Usa uma codificação de duração da execução, portanto, a string mágica tem 50 bytes de comprimento, um por estado. Para criar isso, primeiro foi necessário colocar os códigos de estado em ordem alfabética do código de estado, em vez do nome do estado. Infelizmente, são necessários 7 bytes para converter a representação base36 dej um código de status em minúsculas em um código de status em maiúsculas.

Ungolfed in program program

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
fonte