Я інженер?


42

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

Дано рядок з двох літер як вхідний текст, що представляє стан США, вихід:

  • 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

Матсу Ярлстрему також не дозволили б представити себе інженером в Техасі.
Ben Voigt

Відповіді:


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 (відтінок) -72 байти завдяки TheLethalCoder

-15 байт завдяки геніальному рядку TotallyHuman

-38 байт cos більше стискання рядків

Безголівки:

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 в одному рядку, і навіть якщо вам доведеться використовувати явний рядок типу, все-таки слід зберегти вам байт
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 завдяки 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"?"

Використовується @ totalhuman "рядок роду".

Як це працює:

  • "string"zавтоматично з'єднується "string"з z( " an engineer"). Так, C робить це.
  • !strcmp(s,"OR") порівнює рядок із "АБО".
  • ?"I am not"zповертає "Я не інженер", якщо це правда. Інакше ...
  • :strstr(...,s) перевіряє, чи містить геніальний рядок @ totalhuman поданий рядок.
  • ?"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, що стискання струни є надзвичайно дивовижним, приємним!
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 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

Не задоволений ні стисненням, ні особливим випадком для ?.


Добре, що це? Ви щойно переоформили штати чи щось таке?
Ерік Аутгольфер

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

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

Спробуйте в Інтернеті!

Розширено:

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



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

Пітон 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.

Оскільки Орегон ( 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 працює не для Input, наприклад, LA
Йорг Гюльсерманн

Хм правильно: / можливо, ми можемо трохи змінити рядок .. Спробую. Також визнає недійсним відповідь js btw.
Крістоф

_NMMNINTNRIHIMIWISCNCCTMTUTVTWVNVFLILCAALGAIAMAPAVAWACOLAMOAKARKSMSNHOHOKORAZDEIDKYMEMDNENJNYNDSDTXWYтвори
Крістоф

@Christoph Або мій наказ теж працює.
Йорг Гюльсерманн

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

Гольф на основі рішення Майбе ; Новий тут, тому мені не вистачає респ. для коментарів.


Ви можете відредагувати посилання на його рішення :) Якщо натиснути поділитися на його рішенні, воно дає вам посилання прямо на нього.
Стівен

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

Спробуйте в Інтернеті!


інакше = Правда, 1<2ще коротше
BlackCap

Facepalm , дякую!
bartavelle

Ви включили ORу довгу рядок у друге визначення i
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 Не впевнений, як я зіпсую це, побачивши Орегон всюди через життя дивне ... ¯ \ _ (ツ) _ / ¯
Mateen Ulhaq

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

Пітон 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

Пітон 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 байт, по одному на стан. Для того щоб побудувати це, спочатку потрібно було поставити коди держав в алфавітному порядку коду держави, а не назву держави. На жаль, 7 байт потрібні для перетворення базового представлення jз малого державного коду в верхній регістр коду.

Ungolfed в тестовій програмі

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.