私はエンジニアですか?


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

MatsJärlströmは、テキサス州でエンジニアとして自分自身を紹介することも許可されません。
ベンフォークト

回答:


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

オンラインでお試しください!

の前anにスペースを追加して2バイトを節約しましたb

-69(huehue) -TheLethalCoderのおかげで-72バイト

TotallyHumanの天才状態文字列のおかげで-15バイト

-38バイト以上の文字列圧縮

ゴルフをしていない:

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補間された文字列の代わりに使用し、「OR」?....:System.Arr ... ` に変更if..else if...elsereturn s==ます。つまり、3進数を使用します。の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

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

@totallyhumanの「genus string」を使用しました。

使い方:

  • "string"z()"string"と自動的に連結します。はい、Cはそれを行います。z" an engineer"
  • !strcmp(s,"OR") 文字列を「OR」と比較します。
  • ?"I am not"ztrueの場合、「私はエンジニアではありません」を返します。そうでなければ...
  • :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の2192の 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
おっと、申し訳ありませんでした。その文字列をコピーしても、それを使用するものよりも私の答えが良くならないため、私は失ったようです。これを支持しないで、他のより良い答えを支持してください。
完全に人間の


4

05AB1E104の 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

関数fに渡される2文字の状態vが与えられた場合、「エンジニア」文の先頭と末尾を表すタプル(a、b)を構築します。

「圧縮状態文字列」を自由に使用してください。MINCALAのバイトよりも1バイト短い...



3

JAPT136の 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"
  • 入力が配列で見つからなかった場合、圧縮されたstringの解凍を出力します"What is an engineer?"

3

Pythonの3180の 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+"?"

オンラインでお試しください!



166バイト。状態を再利用することで、文字列をさらに引き締めることができると確信しています
ジョーキング

@JoKingに感謝します。この時点でIMOはPython 2の回答に似すぎています:)。文字列を圧縮しようとしましたが、取得できる最短は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、OR他の状態の場合は0、1の場合は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の一例の入力のためではない動作
イェルクHülsermann

Hm right:/多分、文字列を少し並べ替えることができます。js answer 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#パッドで実行

Mayubeのソリューションに基づくゴルフ。ここで新しいので、コメントするのに十分な担当者がいません。


彼のソリューションへのリンクを編集したい場合があります:)彼のソリューションで共有をクリックすると、それへのリンクが表示されます。
スティーブン

@StephenSヒントをありがとう!
アーサーランプ

2

Haskell220 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

ORiの2番目の定義の長い文字列に含まれています
-BlackCap

他の回答から長い文字列を盗みました。またはそれの一部ではありませんか?
バルタヴェル

1
いいえ、もうありません:)
ブラックキャップ

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

入力がすべての州の略語を含む正規表現と一致する場合、州がオレゴンの場合、「not am」が中央に挿入された状態で「私はエンジニアです」と出力し、終了します。

入力が正規表現と一致しない場合、米国の州の略語であってはなりません。


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

スタックス、100 バイト

この言語は挑戦を後回しにしています。しかし、著者(私)は今までそれを見ませんでした。

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

実行してデバッグする


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

たくさんの良いに参加しました

またはISOエンコードで152バイト

発生器:

'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の3236の 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

更新:

  • に置き換えs=not rて2バイトを節約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バイト長で、状態ごとに1つです。これを構築するには、最初に、状態名ではなく、状態コードをアルファベット順に並べる必要がありました。残念ながら、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]]}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.