¿Soy ingeniero?

42

Recientemente, un ingeniero eléctrico que estudiaba los horarios de los semáforos fue multado con $ 500 por el estado de Oregon por referirse a sí mismo como ingeniero.

Dada una cadena de 2 letras como entrada, que representa un estado de EE. UU., Salida:

  • I am not an engineersi el estado es Oregon ( OR)
  • I am an engineer si el estado es cualquier otro estado de EE. UU.
  • What is an engineer? dado cualquier otra entrada

La salida no puede contener ningún líder de espacios en blanco, pero puede contener tanto se arrastra un espacio en blanco como desee.

Puede suponer que la entrada siempre será de 2 letras mayúsculas.

Aquí hay una lista de las 50 abreviaturas de los estados de EE. UU .:

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

Tanteo

Este es el , ¡por lo que gana menos bytes en cada idioma !

Skidsdev
fuente
¿Puedo tener un espacio final en la salida?
Business Cat
@BusinessCat sí, actualizará las especificaciones para decir eso
Skidsdev
44
Nota al margen: si concatena toda la cadena, obtendrá "... OKOR PARIS CSDTN ..." ;-)
Mateen Ulhaq
A Mats Järlström tampoco se le permitiría presentarse como ingeniero en Texas.
Ben Voigt

Respuestas:

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

Pruébalo en línea!

Ahorró 2 bytes al agregar el espacio antes andeb

-69 (huehue) -72 bytes gracias a TheLethalCoder

-15 bytes gracias a la cadena de estados geniales de TotallyHuman

-38 bytes porque más compresión de cadena

Sin golf:

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
fuente
Use en ..."+blugar de cadenas interpoladas, cambie if..else if...elsea return s=="OR"? ....: System.Arr ... `es decir, use un ternario. Usar en u.Containslugar de Array.Exists. Creo que si usa espacios en lugar de comas, entonces .Split()sin parámetros funcionará.
TheLethalCoder
declare byu en la misma línea y aunque tenga que usar una cadena de tipo explícito, aún debería ahorrarle un byte
LiefdeWen
@StefanDelport ues una matriz, no una cadena. Sin embargo, puede guardar bytes configurándolos ucomo una cadena y usándolos .Contains.
TheLethalCoder
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}?";};. Creo que he eliminado todos los espacios en blanco relevantes. (No probado)
TheLethalCoder
1
Puede jugar golf definiendo "un ingeniero" como una variable separada para guardar algunos bytes.
OldBunny2800
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]

Manifestación

Arnauld
fuente
3
Falla por ejemplo LA: /
Christoph
@ Christoph debería estar bien ahora. ¡Gracias por informar esto!
Arnauld
Pensé que faltaba O por el momento, ¡tonto!
Chas Brown
8

C, 215 208 190 bytes

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

Se utilizó la "cadena de género" de @ totallyhuman.

Cómo funciona:

  • "string"zse concatena automáticamente "string"con z( " an engineer"). Sí, C hace eso.
  • !strcmp(s,"OR") compara la cadena con "OR".
  • ?"I am not"zdevuelve "No soy ingeniero" si es cierto. De otra manera...
  • :strstr(...,s) comprueba si la cadena de genio de @ totallyhuman contiene la cadena proporcionada.
  • ?"I am"z devuelve "Soy ingeniero" si es así, y ...
  • :"What is"z"?")devuelve "¿Qué es un ingeniero?" de otra manera.

Pruébalo en línea!

MD XF
fuente
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
@CoolGuy Eso no funcionará para "¿Qué es un ingeniero?" Pero lo hice funcionar en 209 bytes. ¡Gracias!
MD XF
Puede devolver la cadena en lugar de imprimirla
l4m2
@ l4m2 Hizo algo similar.
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'

Pruébalo en línea!

Felipe Nardi Batista
fuente
2
La codificación del estado es graciosa.
Ramon Snir
5

Python 2 , 192 186 182 178 176 bytes

Probablemente podría comprimir más la cadena 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

Pruébalo en línea!

totalmente humano
fuente
2
Solo usa uen ¿ if s in upuede notar usarlo directamente en lugar de declararlo?
TheLethalCoder
1
@totallyhuman esa compresión de cuerdas es bastante sorprendente, ¡buena!
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 WYes el más pequeño que puedo lograr
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
Vaya, lo siento, me tomó tanto tiempo. Parece que he perdido al copiar esa cadena no hace que mi respuesta sea mejor que la que la usa. Por favor, deje de votar esto y vote la otra mejor respuesta.
Totalmente humano el
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")

Pruébalo en línea!

Pido disculpas por reutilizar la cadena comprimida: no pude encontrar nada mejor por mí mismo ... :(

Olivier Grégoire
fuente
4

05AB1E , 104 103 101 bytes

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

Pruébalo en línea!

Versión antigua de 104 bytes en caso de que se mejore más fácilmente.

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

No estoy contento con la compresión ni el caso especial para ?.

Emigna
fuente
OK, que es esto? ¿Acabas de volver a ordenar los estados o algo así?
Erik the Outgolfer
@EriktheOutgolfer: la versión de 104 bytes es solo una compresión de los números correspondientes a las posiciones de los caracteres en el alfabeto (A=1,C=3 ...). La versión de 103 bytes hace lo mismo para algunos estados y fusiona algunos estados que terminan en la misma letra con la que comienza un nuevo estado. Estoy seguro de que esto aún se puede mejorar y agregaré una mejor explicación cuando haya jugado más al golf.
Emigna
1
¡Buena respuesta! Me gusta lo .•~Zµ∞/'—¶[@øl•Œ2ùque has usado para algunos de los estados, en lugar de simplemente comprimir todos los estados y hacer el . Y buen enfoque en general. (Me alegro de haber visto tu respuesta antes de intentar algo yo mismo, porque definitivamente no habría sido tan breve ...)
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

Pruébalo en línea!

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 un estado de dos letras v pasado a la función f , construya una tupla (a, b) que represente la cabeza y la cola de la oración "ingeniero".

Siéntase libre de usar la "cadena de estado comprimido" libremente; es un byte entero más corto que el MINCALA ...

Vern DeHaven
fuente
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"]

Pruébalo en línea!

13 bytes gracias a J.Doe - a través del uso de expresiones regulares e indexación.

JayCe
fuente
1
97 bytes
J.Doe
1
@ J.Doe subes mucho mejor, gracias!
JayCe
96 bytes 😉
J.Doe
@ J.Doe ¡Por supuesto!
JayCe
3

Japt , 136 135 131 129 128 bytes

Puede haber más ahorros disponibles al experimentar con el orden de las abreviaturas estatales. Volveré a eso en un momento.

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

Pruébalo en línea


Explicación

  • Tomamos una cadena comprimida de las abreviaturas en minúsculas, la descomprimimos y la dividimos en una matriz de cadenas de 2 caracteres usando el òmétodo.
  • Luego usamos el ømétodo para ver si la matriz contiene Uv, que es la cadena de entrada convertida a minúsculas.
  • Si es así, construimos nuestra cadena de salida, comenzando con "I am "
  • Verificando si la cadena de entrada ¥(es igual a) "OR"nos permite agregar cualquiera "not "o la variable de cadena vacía P.
  • Y luego descomprimimos y agregamos la cadena comprimida "an engineer".
  • Si la entrada no se encontró en la matriz, entonces sacamos la descompresión de la cadena comprimida "What is an engineer?".
Lanudo
fuente
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+"?"

Pruébalo en línea!

int6h
fuente
Sí, es correcto: ¡ Pruébelo en línea!
int6h
166 bytes . Estoy seguro de que la cuerda también se puede tensar un poco más reutilizando estados
Jo King
Gracias @JoKing. Se parece demasiado a la respuesta de Python 2 en este punto IMO :). He estado tratando de comprimir la cadena, pero lo más corto que pude obtener fueron 92 símbolos. He escrito un guión corto para hacer eso, pero solo puede reducirlo a 94 caracteres, y no se comprime de manera óptima. También creo que en este desafío en particular, la cadena mágica en sí no debería incluirse en el recuento de bytes.
int6h
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"\

Pruébalo en línea! o como un conjunto de pruebas

Explicación

"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á al comienzo de la cadena, encontrar el signo del índice de la entrada será -1 si no se encuentra, 0 si OR, 1 si cualquier otro estado. Qué cadena para imprimir se puede decidir por eso.

Gato de negocios
fuente
2

PHP, 188 bytes

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

Pruébalo en línea!

Jörg Hülsermann
fuente
in_array(...)a strpos(_AKALARAZCACOCTDEFLGAHIIAIDILINKSKYLAMAMDMEMIMNMOMSMTNCNDNENHNJNMNVNYOHOKPARISCSDTNTXUTVAVTWAWIWVWY,$argn)&1.
Christoph
@Christoph no funciona para una entrada, por ejemplo, LA
Jörg Hülsermann
Hm a la derecha: / tal vez podamos reordenar la cadena un poco ... Lo intentaré. También invalida la respuesta js por cierto.
Christoph
_NMMNINTNRIHIMIWISCNCCTMTUTVTWVNVFLILCAALGAIAMAPAVAWACOLAMOAKARKSMSNHOHOKORAZDEIDKYMEMDNENJNYNDSDTXWYfunciona
Christoph
@ Christoph O mi pedido también funciona.
Jörg Hülsermann
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");

Ejecutar en C # Pad

Golf basado en la solución de Mayube ; nuevo aquí, así que no tengo suficiente representante para comentar.

Arthur Rump
fuente
Es posible que desee editar en un enlace a su solución :) Si hace clic en compartir en su solución, le da un enlace directo a ella.
Stephen
@StephenS ¡Gracias por la sugerencia!
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++"?"

Pruébalo en línea!

bartavelle
fuente
de lo contrario = Verdadero, 1<2es aún más corto
BlackCap
Facepalm , gracias!
bartavelle
Has incluido ORen la cadena larga en la segunda definición de i
BlackCap
Robé la larga cuerda de las otras respuestas. ¿O no es parte de eso?
bartavelle
1
No, ya no :)
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?'?':'')}
martín
fuente
1
Optimización puras=>(!(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 bien, ese es mi ritmo de respuesta.
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?"}

Si la entrada coincide con una expresión regular que contiene todas las abreviaturas estatales, escriba "Soy ingeniero" con un "no" insertado en el medio si el estado es Oregon, luego salga.

Si la entrada no coincide con la expresión regular, no debe ser una abreviatura del estado de EE. UU.

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

Explicación

No se utilizan técnicas de compresión.

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
fuente
Es Oregon, no Ohio.
L3viathan
1
@ L3viathan No estoy seguro de cómo lo arruino después de ver a Oregon en todas partes debido a que Life is Strange ... ¯ \ _ (ツ) _ / ¯
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
fuente
3
Bienvenido a PPCG! Todas las entradas deben ser un programa completo o una función; Creo que puede convertir esto en una expresión lambda válida (y, por lo tanto, función) agregando s->al principio.
ETHproductions
1

Stax , 100 bytes

Este lenguaje es posterior al desafío. Pero el autor (yo) no lo vio hasta ahora.

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

Ejecutar y depurarlo

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

Se unió mucho bien

O 152 bytes en codificación ISO

Generador:

'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
fuente
Podría ser posible reorganizar la cadena de modo que use 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

Pruébalo en línea!

traducción pura

l4m2
fuente
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 prueba:

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

Salida:

True: I am not an engineer
True: I am an engineer
True: I am an engineer
True: What is an engineer?
mazzy
fuente
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'

Pruébalo en línea!

TIO contiene casos de prueba para todos los estados.
-54 bytes gracias a la compresión de cadena

Notts90
fuente
Puede usar la compresión de cadena de las otras respuestas para guardar bytes
TheLethalCoder
1
MINCALA MSCTNMNVAKY WAZ PAR FL GA NHID COKSD ME MDE MA MTX NE NJ NY ND MOH ORIA UT WVT WIL WYes mejor compresión
Skidsdev
0

q / kdb +, 174 bytes

Solución:

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

Explicación:

  {
  // 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:

Utilicé la cadena 'comprimida' de otras respuestas, luchando por encontrar una manera de ponerla en una sola línea para evitar la asignación de la avariable (y aún así agregar la ?entrada cuando no es un estado.

callejero
fuente
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

Pruébalo en línea! Espero haberme apropiado de la mejor lista de estados. Explicación:

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

Comience a construir el resultado. Además, inserte la lista de estados para su uso en la siguiente etapa.

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

Si es uno de los 49 estados, elimine el estado y la lista.

OR~.*
not ~

Si es Oregon, reemplace el estado con noty elimine la lista.

I am ..~.*
What is ~?

Si se trata de algo más, reemplace todo con la otra salida.

~
an engineer

Agregue estas palabras en último lugar para evitar la repetición.

Neil
fuente
0

Cristal, 232 207 205 Bytes

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

Pruébalo en línea . (ligeramente modificado debido a un problema de ARGV)

Domii
fuente
0

Factor, 135 bytes

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

Más legible y nombrado:

: 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 ] dipy x swapson equivalentes en efecto de chimenea pero el primero es más corta sólo cuando anidado: [ [ [ x ] dip ] dip ] dip.

gato
fuente
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

Pruébalo en línea

Cosas que estoy trabajando en acortar:

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

Actualizar:

  • Guardado 2 Bytes al reemplazar s=not rcons=r^1
  • Encabezado y pie de página separados del código
Raffi
fuente
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}

Utiliza una codificación de longitud de ejecución, por lo tanto, la cadena mágica tiene 50 bytes de longitud, una por estado. Para construir esto, primero fue necesario poner los códigos de estado en orden alfabético del código de estado, en lugar del nombre del estado. Desafortunadamente, se necesitan 7 bytes para convertir la representación base36 de jun código de estado en minúsculas en un código de estado en mayúsculas.

Sin golf en el programa de prueba

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
fuente