Ben mühendis miyim?


42

Son zamanlarda, trafik ışığı zamanlamalarını inceleyen bir elektrik mühendisi Oregon eyaleti tarafından kendisine bir mühendis olarak atıfta bulunmak için 500 dolar para cezasına çarptırıldı .

ABD harfini temsil eden girdi olarak 2 harfli bir dize verilirse, çıktı:

  • I am not an engineereğer devlet Oregon ise ( OR)
  • I am an engineer eğer devlet başka bir ABD devletiyse
  • What is an engineer? başka bir girdi verildiyse

Çıktı herhangi içeremez lider boşluk, ama çok olarak içerebilir sondaki istediğiniz gibi boşluk.

Girişin her zaman 2 büyük harf olacağını varsayabilirsiniz.

50 ABD devletinin kısaltmasının bir listesi:

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

puanlama

Bu , her dilde en az bayt kazanıyor!


Çıktıda takip eden bir boşluk olabilir mi?
Business Cat

@BusinessCat evet, bunu söyleyecek şekilde güncelleme yapacak
Skidsdev

4
Not: Tüm dizgiyi bir araya getirirseniz, "... OKOR PARIS CSDTN ..." ;-)
Mateen Ulhaq

Mats Järlström'ün Teksas'ta da bir mühendis olarak kendisini tanıtmasına izin verilmeyecekti.
Ben Voigt

Yanıtlar:


17

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

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

Çevrimiçi deneyin!

Önce boşluk ekleyerek 2 bayt Kaydedilen aniçinb

-69 (huehue) -LethalCoder sayesinde -72 bayt

-ToplyHuman'ın dahi devletler dizesi sayesinde -15 bayt

-38 bayt çünkü daha fazla string sıkıştırma

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

Kullanım ..."+byerine interpolated dizeleri değişikliği if..else if...elseiçin return s==üçlü kullanmak System.Arr ... `yani:? "VEYA" ..... Yerine u.Containskullanın Array.Exists. Bence virgül yerine boşluk kullanırsanız .Split()paramasız çalışamazsınız.
TheLethalCoder

b ve
u'yu

@StefanDelport udizge değil bir dizidir. Ancak, ubir dize olarak ayarlayarak ve .Containsonu kullanarak bayt kaydedebilirsiniz .
TheLethalCoder

240 bayt: 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}?";};. Sanırım tüm ilgili boşlukları kaldırdım. (
Denenmemiş

1
Bazı byte'ları kurtarmak için "bir mühendis" i ayrı bir değişken olarak tanımlayarak bunu golf yapabilirsiniz.
OldBunny2800

11

JavaScript (ES6), 182 bayt

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

gösteri


3
Örneğin başarısız LA: /
Christoph

@Christoph Şimdi tamam olmalı. Bunu bildirdiğin için teşekkürler!
Arnauld

Aptalca bir an için eksik VEYA olduğunu sanıyordum!
Chas Brown,


8

C, 215 208 190 bayt

-7 Cool Guy sayesinde

#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's "genus string" kullanıldı.

Nasıl çalışır:

  • "string"zotomatik olarak ( ) "string"ile birleştirir . Evet, C bunu yapar.z" an engineer"
  • !strcmp(s,"OR") dizeyi "OR" ile karşılaştırır.
  • ?"I am not"zdoğruysa "Ben mühendis değilim" döndürür. Aksi takdirde...
  • :strstr(...,s) @ totallyhuman'ın dahi dizgesinin verilen dizgiyi içerip içermediğini kontrol eder.
  • ?"I am"z eğer öyleyse "Ben bir mühendisim" i verir ve ...
  • :"What is"z"?")"Mühendis nedir?" aksi takdirde.

Çevrimiçi deneyin!


1
206 bayt:#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 Bu işe yaramaz "Bir mühendis nedir?" Ama 209 baytta çalışmasını sağladım. Teşekkürler!
MD XF

Dize basmak yerine geri
gönderebilirsiniz

@ l4m2 Benzer bir şey yaptım.
MD XF


5

Python 2 , 192 186 182 178 176 bayt

Durum dizesini daha fazla sıkıştırabilir.

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

Çevrimiçi deneyin!


2
Yalnızca kullanmak uiçinde if s in ubunu bildirmek yerine doğrudan kullanmak not alabilir?
TheLethalCoder

1
@totallyhuman Bu dize sıkıştırma oldukça şaşırtıcı, güzel olanı!
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 WYyapabileceğim en küçüğüdür
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
Vay be, üzgünüm bu çok uzun sürdü. Bu dizeyi kopyalarken kaybetmiş gibiyim, cevabımı onu kullanandan daha iyi yapmıyormuşum gibi geliyor. Lütfen bunu oylamayı bırak ve diğer daha iyi yanıtı oyla.
tamamen insan

5

Java (JDK 10) , 184 bayt

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

Çevrimiçi deneyin!

Sıkıştırılmış dizeyi tekrar kullandığım için özür dilerim: Tek başıma daha iyi bir şey bulamadım ... :(


4

05AB1E , 104 103 101 bayt

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

Çevrimiçi deneyin!

Eski 104 bayt versiyonu daha kolay iyileştirilebilme durumunda.

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

Sıkıştırmadan ve özel durumdan memnun değil ?.


Tamam bu nedir? Az önce ülkeleri tekrar mı sipariş ettiniz?
Outgolfer Erik,

@EriktheOutgolfer: 104 baytlık sürüm, yalnızca alfabedeki karakter konumlarına karşılık gelen sayıların sıkıştırılmasıdır (A=1,C=3 ...). 103 bayt sürümü bazı eyaletler için aynı şeyi yapar ve yeni bir durumun başladığı harfle biten bazı ülkeleri birleştirir. Eminim bu hala geliştirilebilir ve daha çok golf oynadığımda daha iyi bir açıklama ekleyeceğim.
Emigna

1
Güzel cevap! .•~Zµ∞/'—¶[@øl•Œ2ùSadece bütün ülkeleri sıkıştırıp yapmak yerine, bazı eyaletlerde kullandığınızı seviyorum . Ve genel olarak güzel bir yaklaşım. (Kendime bir şey denemeden önce cevabını gördüğüme sevindim, çünkü kesinlikle kısa değildi ..)
Kevin Cruijssen

4

F # , 222 bayt

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

Çevrimiçi deneyin!

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

Bir iki harfli durumu düşünüldüğünde v fonksiyonu geçirilen f , bir demet oluşturmak (a, b) "mühendis" cümlesinin baş ve kuyruk temsil eder.

"Sıkıştırılmış durum dizesini" serbestçe kullanmaktan çekinmeyin; MINCALA'dan bir bütün byte daha kısa ...



3

Japt , 136 135 131 129 128 bayt

Devlet kısaltmalarının sırasını deneyerek daha fazla tasarruf elde edilebilir - Bir süre sonra buna geri geleceğim.

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

Çevrimiçi deneyin


açıklama

  • Sıkıştırılmış kısaltmalar için sıkıştırılmış bir dizi alırız, onu açarız ve òyöntemi kullanarak onu 2 karakterli bir dizi dizisine böleriz .
  • Daha sonra , dizginin øiçeriğini Uv, küçük harfe dönüştürülmüş girdi dizgisi olup olmadığını görmek için yöntemi kullanırız .
  • Eğer öyleyse, çıkış dizgimizi başlıyoruz. "I am "
  • Giriş dizesinin ¥(buna eşit) olup olmadığını kontrol etmek "OR"bize ya "not "boş dize değişkenini eklememize izin verir P.
  • Ve sonra sıkıştırılmış dizgiyi sıkıştırıp ekleriz "an engineer".
  • Girdi dizide bulunamadıysa, o zaman sıkıştırılmış dizenin sıkıştırmasını çıkarırız "What is an engineer?".

3

Python 3 , 180 179 178 bayt

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

Çevrimiçi deneyin!



166 bayt . Dize devletlerin yeniden kullanımıyla daha fazla sıkılaştırılabileceğinden eminim
Jo King

@JoKing teşekkürler. Bu noktada Python 2'nin cevabına çok benziyor IMO :). İpi sıkıştırmaya çalışıyordum, ancak bulabildiğim en kısa süre 92 semboldü. Bunu yapmak için kısa bir senaryo yazdım , ancak yalnızca 94 karaktere kadar kesebilir ve en iyi şekilde sıkıştırmaz. Ayrıca, bu özel mücadelede sihirli dizenin kendisinin bayt sayısına dahil edilmemesi gerektiğini düşünüyorum.
int6h

2

CJam , 143 bayt

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

Çevrimiçi deneyin! veya bir test paketi olarak

açıklama

"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) dizgenin başlangıcında olduğundan, girişin indeksinin işaretini bulmazsanız -1 OR, başka bir durumda ise 0 olur . Hangi dizge basılacağına karar verebilirsiniz.


2

PHP, 188 Bayt

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

Çevrimiçi deneyin!


in_array(...)için strpos(_AKALARAZCACOCTDEFLGAHIIAIDILINKSKYLAMAMDMEMIMNMOMSMTNCNDNENHNJNMNVNYOHOKPARISCSDTNTXUTVAVTWAWIWVWY,$argn)&1.
Christoph


Hm haklı: / belki ipi yeniden düzenleyebiliriz .. deneyeceğim. Ayrıca js btw cevabını geçersiz kılar.
Christoph,

_NMMNINTNRIHIMIWISCNCCTMTUTVTWVNVFLILCAALGAIAMAPAVAWACOLAMOAKARKSMSNHOHOKORAZDEIDKYMEMDNENJNYNDSDTXWYçalışır
Christoph

@Christoph Veya siparişim de işe yarıyor.
Jörg Hülsermann

2

C #, 178 bayt

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'de Çalıştır

Mayube'un çözümüne dayanan Golf ; Burada yeni, bu yüzden yorum yapmak için yeterli temsilcisi yok.


Çözümü için bir linkte düzenlemek isteyebilirsiniz :) Çözümü üzerindeki payına tıklarsanız, size doğrudan bir link verir.
Stephen

@StephenS Tahmininiz için teşekkürler!
Arthur Rump,

2

Haskell , 220 214 210 209 bayt

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

Çevrimiçi deneyin!


Aksi halde = Doğru, 1<2daha kısadır
BlackCap

Facepalm , teşekkürler!
bartavelle

Sen dahil ettik ORi ikinci tanımında uzun dizesinde
blackcap

Uzun ipi diğer cevaplardan çaldım. VEYA bunun bir parçası değil mi?
bartavelle

1
Hayır, artık değil :)
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
Saf iyileştirmes=>(!(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 güzel, bu benim cevabımı yendi.
martin

1

AWK, 189 bayt

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

Girdi, tüm durum kısaltmalarını içeren bir regex ile eşleşiyorsa, eğer durum Oregon ise, ortada 'değil' eklenmiş bir "ben bir mühendisim" yazıp ardından çıkın.

Girdi regex ile eşleşmiyorsa, ABD devleti kısaltması olmamalıdır.


1

Python 3, 238 bayt

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

açıklama

Hiçbir sıkıştırma tekniği kullanılmamıştır.

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

Oregon, Ohio değil.
L3viathan

1
@ L3viathan Oregon'u heryerde Hayattan dolayı gördükten sonra mahvettiğimden emin değilim ... ¯ \ _ (ツ) _ / ¯
Mateen Ulhaq

1

Java, 173 bayt

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'ye Hoşgeldiniz! Tüm girişler tam bir program veya işlev olmalıdır; Başına ekleyerek s->bunu geçerli bir lambda ifadesine (ve dolayısıyla işlevine) dönüştürebileceğinizi düşünüyorum .
ETHproductions

1

Stax , 100 bayt

Bu dil mücadeleyi aşıyor. Ancak yazar (ben) şimdiye kadar görmedi.

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

Koş ve hata ayıkla


1

JavaScript ES6, 175 171 Bayt

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

Bolca iyi katıldı

Veya ISO kodlamada 152 bayt

Jeneratör:

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

Diziyi yeniden düzenlemek, genişletmek için btoa kullanarak mümkün olabilir
l4m2

1

C (gcc) , 0 + 176 bayt

-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

Çevrimiçi deneyin!

saf çeviri


1

Powershell, 175 bayt

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

Test komut dosyası:

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

Çıktı:

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 bayt

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'

Çevrimiçi deneyin!

TIO, tüm eyaletler için test senaryoları içermektedir.
String sıkıştırma sayesinde -54 bayt


Bayt kaydetmek için dize sıkıştırma diğer yanıtlardan kullanabilirsiniz
TheLethalCoder

1
MINCALA MSCTNMNVAKY WAZ PAR FL GA NHID COKSD ME MDE MA MTX NE NJ NY ND MOH ORIA UT WVT WIL WYdaha iyi sıkıştırma
Skidsdev

0

q / kdb +, 174 bayt

Çözüm:

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

Açıklama:

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

Notlar:

aDeğişkenin atanmasını önlemek için tek bir satıra getirmenin bir yolunu bulmakta zorlanarak 'sıkıştırılmış' dizgiyi diğer yanıtlardan kullandı (ancak ?girdi bir durum olmadığında yine de ekleyin) .


0

Retina , 175 bayt

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

Çevrimiçi deneyin! Umarım en iyi devlet listesine sahip oldum. Açıklama:

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

Sonucu oluşturmaya başlayın. Ayrıca, bir sonraki aşamada kullanılacak durum listesini ekleyin.

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

49 durumdan biriyse, durumu ve listeyi silin.

OR~.*
not ~

Oregon ise, durumu ile değiştirin notve listeyi silin.

I am ..~.*
What is ~?

Başka bir şey varsa, her şeyi diğer çıktıyla değiştirin.

~
an engineer

Tekrarı önlemek için en son bu kelimeyi ekleyin.


0

Kristal, 232 207 205 Bayt

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

Çevrimiçi deneyin . (ARGV sorunu nedeniyle hafifçe değiştirilmiş)


0

Faktör, 135 bayt

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

Daha okunabilir ve adlandırılmış:

: 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 ] dipve x swapbaca etkisi eşdeğerdir ancak iç içe sadece ilk kısa: [ [ [ x ] dip ] dip ] dip.


0

Python 2, 213 211 194 Bayt

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

Çevrimiçi Deneyin

Kısaltmak için çalışıyorum

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

Güncelleme:

  • Değiştirilmesiyle 2 bayt Kaydedilen s=not riles=r^1
  • Ayrılmış üstbilgi ve kod altbilgisi

0

Yakut, 164 bayt

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

Bir çalışma uzunluğu kodlaması kullanır, bu nedenle sihirli dize, her bir durumda bir tane olan 50 bayttır. Bunu inşa etmek için, ilk önce devlet kodlarını, devlet adı yerine, devlet kodunun alfabetik sıralamasına koymak gerekliydi. Maalesef 7 temsilinin jbir küçük harf durum kodundan bir büyük harf durum koduna dönüştürülmesi için 7 bayta ihtiyaç vardır.

Test programında 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]]}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.