Я инженер?


42

Недавно штат Орегон оштрафовал инженера-электрика на изучение светофоров на 500 долларов за то, что он называл себя инженером.

Учитывая 2-буквенную строку в качестве входных данных, представляющих штат США, выведите:

  • I am not an engineerесли штат Орегон ( OR)
  • I am an engineer если штат любой другой штат США
  • What is an engineer? учитывая любой другой вклад

Выход может не содержать какой - либо ведущий пробела, но может содержать стольких завершающих пробела , как вы хотите.

Вы можете предположить, что ввод всегда будет состоять из 2 заглавных букв.

Вот список всех 50 аббревиатур штатов США:

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

счет

Это , поэтому выигрывает меньшее количество байтов на каждом языке !


Могу ли я иметь конечный пробел в выводе?
Бизнес Кот

@BusinessCat да, будет обновлять спецификации, чтобы сказать, что
Skidsdev

4
Примечание: если вы объедините всю строку вместе, вы получите "... OKOR PARIS CSDTN ..." ;-)
Mateen Ulhaq

Матсу Ярлстрему тоже не разрешили бы представить себя инженером в Техасе.
Бен Фойгт

Ответы:


17

C #, 311 309 240 237 222 195 184 183 байта

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

Попробуйте онлайн!

Сохраненные 2 байта, добавив пробел перед anкb

-69 (huehue) -72 байта благодаря TheLethalCoder

-15 байт благодаря гениальной строке состояний TotallyHuman

-38 байт, потому что больше сжатие строк

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

Использовать ..."+bвместо интерполированных строк, заменить if..else if...elseна return s==«ИЛИ»? ....: System.Arr ... `то есть использовать троичный. Используйте u.Containsвместо Array.Exists. Я думаю, что если вы используете пробелы вместо запятых, то .Split()без параметров будет работать.
TheLethalCoder

объявляйте b и u в одной и той же строке, и хотя вам нужно использовать явный тип string, вы все равно сохраните свой байт
LiefdeWen

@StefanDelport u- это массив, а не строка. Тем не менее, вы можете сохранить байты, задав uстроку и используя .Containsее.
TheLethalCoder

240 байт: 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}?";};. Думаю, я удалил все соответствующие пробелы. (Не проверено)
TheLethalCoder

1
Вы можете изменить это, определив «инженер» в качестве отдельной переменной, чтобы сэкономить несколько байтов.
OldBunny2800

11

JavaScript (ES6), 182 байта

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

демонстрация


3
Не работает, например LA: /
Christoph

@ Кристоф теперь должно быть в порядке. Спасибо за сообщение об этом!
Арно

Мысль, что это пропало ИЛИ на мгновение - глупо!
Час Браун

Используйте codegolf.stackexchange.com/a/124164/76323 для оптимизации
l4m2

8

C 215 208 190 байтов

-7 благодаря классному парню

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

Используется "родовая строка" @ totallyhuman.

Как это работает:

  • "string"zавтоматически объединяется "string"с z( " an engineer"). Да, С делает это.
  • !strcmp(s,"OR") сравнивает строку с "ИЛИ"
  • ?"I am not"zвозвращает «Я не инженер», если верно. Иначе...
  • :strstr(...,s) проверяет, содержит ли строка гениальности @ totallyhuman предоставленную строку.
  • ?"I am"z возвращает «Я инженер», если так, и ...
  • :"What is"z"?")возвращает "Что такое инженер?" иначе.

Попробуйте онлайн!


1
206 байт:#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 Это не сработает для "Что такое инженер?" Но я получил его на работу в 209 байтов. Благодарность!
MD XF

Вы можете вернуть строку вместо ее печати
l4m2

@ l4m2 сделал что-то подобное.
MD XF


5

Python 2 , 192 186 182 178 176 байт

Возможно, может сжать строку состояния больше.

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

Попробуйте онлайн!


2
Вы используете только uв, if s in uвы можете заметить использовать его напрямую, вместо того, чтобы объявить это?
TheLethalCoder

1
@totallyhuman это сжатие строк довольно удивительно, хорошо!
Скидсдев

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- самое маленькое, что я могу сделать
Skidsdev

2
'MINCALA MSCTNMNVAKY WAZ PAR FL GA NHID COKSD ME MDE MA MTX NE NJ NY ND MOH ORIA UT WVT WIL WY'
Фелипе Нарди Батиста,

2
Ой, извините, это заняло у меня так много времени. Кажется, я проиграл, поскольку копирование этой строки не делает мой ответ лучше, чем тот, который ее использует. Пожалуйста, прекратите голосование против этого и проголосуйте за лучший ответ.
полностью человек

5

Java (JDK 10) , 184 байта

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

Попробуйте онлайн!

Я прошу прощения за повторное использование сжатой строки: я не мог найти ничего лучше ... :(


4

05AB1E , 104 103 101 байт

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

Попробуйте онлайн!

Старая 104-байтовая версия на случай, если ее будет легче улучшить.

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

Не устраивает ни компрессия, ни особый случай для ?.


ОК, что это? Вы только что переупорядочили штаты или что-то?
Эрик Outgolfer

@EriktheOutgolfer: 104-байтовая версия - это просто сжатие чисел, соответствующих позициям символов в алфавите (A=1,C=3 ...). 103-байтовая версия делает то же самое для некоторых состояний и объединяет некоторые состояния, заканчивающиеся той же буквой, с которой начинается новое состояние. Я уверен, что это все еще можно улучшить, и я добавлю лучшее объяснение, когда я буду играть в гольф больше.
Emigna

1
Хороший ответ! Мне нравится, что .•~Zµ∞/'—¶[@øl•Œ2ùвы использовали для некоторых состояний, а не просто сжимали все состояния и выполняли . И хороший подход в целом. (Рад, что я видел твой ответ, прежде чем пытаться что-то сам, потому что он определенно не был бы таким коротким ..)
Кевин Круйссен

4

F # , 222 байта

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

Попробуйте онлайн!

Expanded:

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

Учитывая двухбуквенное состояние v, переданное функции f , создайте кортеж (a, b), представляющий голову и хвост предложения «инженер».

Не стесняйтесь свободно использовать «сжатую строку состояния»; это на целый байт короче, чем у MINCALA ...


4

R , 109 96 байт

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

Попробуйте онлайн!

13 байтов благодаря J. Doe - благодаря использованию регулярных выражений и индексации.



1
@ J. Доу subгораздо лучше, спасибо!
JayCe


@ J. Doe Конечно!
JayCe

3

Japt , 136 135 131 129 128 байт

Можно сэкономить больше, экспериментируя с порядком сокращений штатов - я вернусь к этому через некоторое время.

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

Попробуйте онлайн


объяснение

  • Мы берем сжатую строку из сокращений в нижнем регистре, распаковываем ее и разделяем на массив из 2-х символьных строк, используя òметод.
  • Затем мы используем øметод, чтобы увидеть, содержит ли массив массив Uvвходных данных, преобразованный в нижний регистр.
  • Если мы так, мы строим нашу выходную строку, начиная с "I am "
  • Проверка того, позволяет ли входная строка ¥(равна) "OR"добавить "not "или пустую строковую переменную P.
  • А затем мы распаковываем и добавляем сжатую строку "an engineer".
  • Если входные данные не были найдены в массиве, мы выводим распаковку сжатой строки "What is an engineer?".

3

Python 3 , 180 179 178 байт

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

Попробуйте онлайн!


Да, это правильно: попробуйте это онлайн!
int6h

166 байт . Я уверен, что последовательность может быть еще немного натянута путем повторного использования состояний
Джо Кинг,

Спасибо @JoKing. Это напоминает ответ Python 2 слишком много на данный момент IMO :). Я пытался сжать строку, но самое короткое, что я мог получить, было 92 символа. Я написал короткий сценарий, чтобы сделать это, но он может сократить его только до 94 символов, и он не сжимает оптимально. Я также думаю, что в этом конкретном испытании сама магическая строка не должна быть включена в число байтов.
int6h

2

CJam , 143 байта

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

Попробуйте онлайн! или как набор тестов

объяснение

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

Так как Oregon ( OR) находится в начале строки, нахождение знака индекса входного в нем будет -1, если не найден, 0, если OR, 1, если любое другое состояние. Какая строка для печати может быть решена этим.


2

PHP, 188 байт

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

Попробуйте онлайн!


in_array(...)к strpos(_AKALARAZCACOCTDEFLGAHIIAIDILINKSKYLAMAMDMEMIMNMOMSMTNCNDNENHNJNMNVNYOHOKPARISCSDTNTXUTVAVTWAWIWVWY,$argn)&1.
Кристоф

@Christoph не работает на входе, например, LA
Jörg Hülsermann

Хм правильно: / может быть, мы можем немного изменить порядок строки .. Я попробую. Также делает недействительным ответ JS, кстати.
Кристоф

_NMMNINTNRIHIMIWISCNCCTMTUTVTWVNVFLILCAALGAIAMAPAVAWACOLAMOAKARKSMSNHOHOKORAZDEIDKYMEMDNENJNYNDSDTXWYработы
Кристоф

@ Кристоф Или мой заказ тоже работает.
Йорг Хюльсерманн

2

C #, 178 байт

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

Запустить в C # Pad

Гольф на основе решения Mayube ; здесь новость, поэтому у меня недостаточно представителей, чтобы комментировать.


Возможно, вы захотите отредактировать ссылку на его решение :) Если вы нажмете поделиться с ним на его решении, оно даст вам ссылку прямо на него.
Стивен

@StephenS Спасибо за совет!
Артур Рамп

2

Haskell , 220 214 210 209 байт

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

Попробуйте онлайн!


в противном случае = True, 1<2еще короче
BlackCap

Facepalm , спасибо!
bartavelle

Вы включили ORв длинную строку во втором определении я
BlackCap

Я украл длинную строку из других ответов. ИЛИ не является ли это частью?
bartavelle

1
Нет, больше нет :)
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?'?':'')}

1
Чистая оптимизацияs=>(!(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 здорово, это мой ответ.
мартин

1

AWK, 189 байт

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

Если входные данные соответствуют регулярному выражению, содержащему все сокращения состояний, выведите «Я инженер» со словом «не», вставленным в середине, если штат - Орегон, затем выйдите.

Если ввод не соответствует регулярному выражению, он не должен быть аббревиатурой штата США.


1

Python 3, 238 байт

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

объяснение

Методы сжатия не используются.

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

Это Орегон, а не Огайо.
L3viathan

1
@ L3viathan Не знаю, как я все испортил, увидев Орегон повсюду из-за жизни, странно ... ¯ \ _ (ツ) _ / ¯
Матеин Улхак,

1

Java, 173 байта

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"

3
Добро пожаловать в PPCG! Все записи должны быть полной программой или функцией; Я считаю, что вы можете превратить это в действительное лямбда-выражение (и, следовательно, функцию), добавив s->в начало.
ETHproductions


1

JavaScript ES6, 175 171 байт

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

Присоединился много хорошего

Или 152 байта в кодировке ISO

Генератор:

'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,'/')))

Может быть возможно переставить строку, используя btoa для расширения
l4m2


1

Powershell, 175 байт

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

Тестовый скрипт:

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

Выход:

True: I am not an engineer
True: I am an engineer
True: I am an engineer
True: What is an engineer?

0

Python 3 , 236 182 181 байт

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'

Попробуйте онлайн!

TIO содержит контрольные примеры для всех штатов.
-54 байта благодаря сжатию строки


Вы можете использовать сжатие строк из других ответов для сохранения байтов
TheLethalCoder

1
MINCALA MSCTNMNVAKY WAZ PAR FL GA NHID COKSD ME MDE MA MTX NE NJ NY ND MOH ORIA UT WVT WIL WYлучше сжатие
Skidsdev

0

q / kdb +, 174 байта

Решение:

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

Объяснение:

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

Заметки:

Использовал «сжатую» строку из других ответов, изо всех сил пытаясь найти способ вывести ее в одну строку, чтобы избежать присвоения aпеременной (но все же добавить, ?когда вход не является состоянием.


0

Сетчатка , 175 байт

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

Попробуйте онлайн! Надеюсь, я присвоил лучший государственный список. Объяснение:

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

Если это один из 49 штатов, удалите штат и список.

OR~.*
not ~

Если это штат Орегон, замените штат на notи удалите список.

I am ..~.*
What is ~?

Если это что-то еще, замените все другим выходом.

~
an engineer

Добавьте это слово в последнюю очередь, чтобы избежать повторения.


0

Кристалл, 232 207 205 байт

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

Попробуйте онлайн . (немного изменен из-за проблемы с ARGV)


0

Фактор, 135 байт

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

Более читабелен и назван:

: 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 ] dipи x swapэквивалентны по эффекту стеки , но первый короче только тогда , когда вложенные: [ [ [ x ] dip ] dip ] dip.


0

Python 2, 213 211 194 байта

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

Попробуйте онлайн

Вещи, которые я работаю над сокращением:

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

Обновить:

  • Сохранено 2 байта путем замены s=not rнаs=r^1
  • Отдельный заголовок и нижний колонтитул кода

0

Рубин, 164 байта

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

Используется кодировка длины серии, поэтому длина магической строки составляет 50 байтов, по одному на состояние. Чтобы построить это, сначала необходимо было поместить коды состояния в алфавитном порядке кода штата, а не названия штата. К сожалению, для преобразования представления base36 jиз строчного кода состояния в верхний регистр требуется 7 байтов .

Неуправляемый в тестовой программе

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]]}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.