Bir UKMT IMC Belgesini İşaretleyin


22

IMC'yi bu sene yaptım. Burada başka biri yaptı mı?

Bir UKMT Orta Düzey Matematik Yarışması makalesinde yirmi beş soru var. İlk onbeş soru, doğru bulursanız size beş not verir. Diğer on soru için, onları doğru yapmak için altı puan alıyorsunuz. Son on soruda, yanlış yaparsanız puan kaybedersiniz! On altı ile yirmi arasındaki sorular için bir puan kaybedersiniz ve son beş soru için iki puan kaybedersiniz. Bir soruyu boş bırakırsanız, hiçbir puan verilmez veya düşülmez. İlk on beş sorudan herhangi birini yanlış yapmak için herhangi bir not düşülmez. Kağıt çoktan seçmeli; Her soru için A, B, C, D ve E arasından herhangi bir cevabı seçebilirsiniz. Her soru için daima tek bir doğru cevap vardır.

İki dize alan ve bir skor çıkaran bir program / fonksiyon oluşturun. İlk dize kağıda cevaplarınız olacaktır. Bir soru atlarsanız, bir boşluk, boş bir bayt veya alt çizgi kullanın. Aksi takdirde, cevap için A, B, C, D veya E harfini kullanın. Girişleri büyük veya küçük harf olarak kullanabilirsiniz. İkinci dize, makaledeki her soru için doğru cevaplar olacaktır. Programınız / fonksiyonunuz daha sonra bir sonuç verecektir. Kodunu kısalt.

Test durumları:

DDDDDDDDDDDDDDDDDDDDDDDDD
ABCDEABCDEABCDEABCDEABCDE
15

BDBEACCECEDDBDABBCBDAEBCD
BDBEACCECEDDBDABBCBDAEBCD
135

DBACBDCDBAEDABCDBEECACDC_
DBADBDCDBAEDABCDBEEDACDCA
117

_________________________
DABDABDABDABDABDABDABDABD
0

DBADBDCDBAEDABCD_E__A__C_
DBADBDCDBAEDABCDBEEDACDCA
99

_______________BBBBBBBBBB
AAAAAAAAAAAAAAAAAAAAAAAAA
-15

"On beş ila yirmi arasındaki sorular için" "On altı ila yirmi arasındaki sorular için" olmalı mı?
Greg Martin,

1
Atlanan soruları göstermek için boş bir bayt kullanabilir miyiz?
17:17

2
Ve ilk puan 27-12 = 15 olmamalı mı?
Greg Martin,

1
UKMT belgelerini gören / yapan kimse var mı? Gerçekten eğlenceliler. Ukmt.org.uk adresindeki bulmacalara göz atın. Fikirlerimin çoğunu, matematikle ilgili sorulardaki zorluklar için alıyorum.
0WJYxW9FMN

1
Test vakalarınız muhtemelen olumsuz bir puanla bir başvuru içermelidir.
Dennis,

Yanıtlar:


7

C, 88 87 86 81 bayt

c,d;i(char*a,char*b){for(c=d=0;*b;c++,a++)d+=*a^*b++?*a?-c/15-c/20:0:5+c/15;d=d;}

Çevrimiçi deneyin!


1
Yana ABCDEnoktasının 95 altındaki tüm, ben kullanabilirsiniz düşünüyorum *a<95.
Yytsi

2
Soru alt çizgi yerine boş byte almaya izin verdiğinden, -(c/15+c/20)*(*a<95)olabilir *a?-c/15-c/20:0.
Dennis,


6

Jöle , 26 23 22 bayt

=s5ị"“HHHQP‘D¤_2Fæ.n⁶¥

Çevrimiçi deneyin!

Nasıl çalışır

=s5ị"“HHHQP‘D¤_2Fæ.n⁶¥  Main link. Argument: t (answer to test), s (answer sheet)

=                       Test the characters of t and s for equality.
 s5                     Split into chunks of length 5.
             ¤          Combine the two preceding links into a niladic chain.
     “HHHQP‘              Yield the code points, i.e., [72, 72, 72, 81, 80].
            D             Decimal; yield [[7, 2], [7, 2], [7, 2], [8, 1], [8, 0]].
   ị"                   Index zipwith; use the Booleans in each chunk to index into
                        the corresponding pair. Indexing is 1-based and modular, so
                        1 gives the first element and 0 the last.
              _2        Subtract 2 from each result.
                F       Flatten the resulting 5x5 matrix.
                     ¥  Combine the two preceding links into a dyadic chain.
                   n⁶     Test the characters of t for inequality with space.
                 æ.     Take the dot product of the integers to the left and the
                        Booleans to the right.

5

JavaScript (ES6), 70 68 66 bayt

Neil sayesinde 2 bayt kaydedildi
kaydedildi ETHproductions sayesinde 2 bayt kaydedildi

Başvuru sahibi cevaplarını alır ave ckörleme sözdizimini doğru cevaplar (a)(c). Atlanan soruların boşlukla işaretlenmesini bekler.

a=>c=>a.replace(/\S/g,(a,i)=>s+=a==c[j=i>14,i]?5+j:-j^i>19,s=0)&&s

Test durumları


Atlanan soruyu sözcük olmayan bir karaktere (örneğin boşluk) değiştirirseniz, /\w/giki bayttan tasarruf etmek için kullanabilirsiniz .
Neil

Ben düşünüyorum -j-(i>19) aynıdır -j^i>19Emin değilim gerçi.
ETHProductions

@ETHproductions Gerçekten de. Bu şekilde ayrıştırıldı (-j)^(i>19), evet, bu işe yarıyor.
Arnauld

4

Python 2 , 86 85 83 77 bayt

f=lambda t,s,i=24:~i and(i/10*-(14<i<t[i]<'_'),5+i/15)[t[i]==s[i]]+f(t,s,i-1)

Çevrimiçi deneyin!

Nasıl çalışır

Bu tanımlar, bir özyinelemeli fonksiyon f : iki non-optimal bağımsız değişkenleri alır t (test etmek için cevap) ve s (cevap levha). Bu iki bağımsız değişkenlerle sadece çağrıldığında, f başlatır i için 24 , her ikisi de son indeksi t ve s .

Her zaman f eğer ilk çekler, denir ~ i (NOT bit cinsinden i ) truthy / non-sıfırdır. Yana ~ (1) = 0 kez bu durumda I değere ulaşır -1 . Eğer i = -1 , p = 0 döndürülür, ancak ben değerleri alır 24'e kadar , 0 (tüm indisleri t ve s ), kod şunları andyürütülür ve f getiri sonucu.

İken ben Eksi olmayan aşağıdaki işlemler gerçekleştirilir. İlk,

(i/10*-(14<i<t[i]<'_'),5+i/15)

uzunluk 2 bir demet oluşturur :

  • Bölüm i/10olan 0 ise 0 ≤ i <10 , 1 ise ≤ 10 i <20 ve 2 ise 20 ≤ i <25 . Zincirleme karşılaştırma 14<i<t[i]<'_'döner Doğru ise ve tüm bireysel karşılaştırmalar iade yalnızca Doğru , yani ancak ve ancak ı ≥ 15 (cezası soruların aralık), i daha küçüktür [i] t tüm sayılar daha küçük olduğundan (her zaman doğru Python 2) 'deki tüm yinelemeler ve t [i] bir alt çizgi değildir.

    Karşılaştırma False döndürürse , unary 0- döndürür ve ifadenin tamamı 0 olarak değerlendirilir . Bununla birlikte, kıyaslama döner ise doğru , tekli döner -1 , tamamını ifade değerlendirir böylece 0 ise 0 ≤ i <10 , -1 ise ≤ 10 i <20 ve -2 ise 20 ≤ i <25 ; bunlar tüm endekslerin yanlış ya da eksik cevaplarının net sonuçlarıdır i .-

  • 5+i/150 ≤ i <15 ise 5 + 0 = 5 ve 15 ≤ i <25 ise 5 + 1 = 6 döndürür . Bunlar tüm endeksler için doğru cevapların net sonuçlarıdır i .

Son olarak, [t[i]==s[i]]seçer inşa başlığın birinci elemanı ise t [i] ve s [i] (yanlış veya eksik cevap) ve (doğru cevap) eşit ise, ikinci bir, sonra dönüş değeri ekler farklıdır f indirildiği ile adı Ben bu sonucu. Bir kez i ulaşır -1 , son puan hesaplandı ve tarafından döndürülen f .


3

Mathematica, 114 bayt

Tr@(m=MapThread)[#/.True->#2/.False->-#3&,{Tr/@Partition[m[Equal,#/."_"->u]/.u==_->0,5],{5,5,5,6,6},{0,0,0,1,2}}]&

Sıralı bir çift karakter listesi alarak bir tamsayı döndüren salt işlev. Cevabın eşit olduğu yerlerde m[Equal,#/."_"->u]formun değerlendirilmemiş girişleri haricinde bir boole listesi verir ; sonra hemen, değerlendirilmemiş girişleri s'ye çevirir . bu girişleri bir defada 5 ekler, bu da ilk test durumu veya son test durumu için bir liste oluşturur . Sonra her koordinatta ve uygun skorlarla eşleştirilir ve sonuçlar bir araya getirilir.u=="B""_"u==_->00Tr/@Partition[...,5]{4False+True, 4False+True, 4False+True, 4False+True, 4False+True}{5True, 5True, 5True, 2True, 2True}TrueFalse


3

Jöle , 22 21 bayt

Zm0ṁ135µ;t€⁶E€’;E€ṫ⁹S

Çevrimiçi deneyin!

@ Dennis'in cevabının muhtemelen yenilebilir olduğunu düşündüm . Ve çok sayıda farklı olasılık denedikten ve şaşırtıcı bir tesadüfden faydalandıktan sonra nihayet başardım!

Bu program girdi olarak bir çift [öğrencinin cevabı, doğru cevabı] alır ve eksik bir cevabı belirtmek için boşluk kullanır.

açıklama

Bu program, neler olup bittiğini takip etmek için bazı tuhaf dahili giriş formatları kullanıyor, bu yüzden bunu bir adım öteye taşıyacağız.

  1. Z

    Bu girdiyi aktarır, bu yüzden her bir soru için bir tane olan 25 elementin bir listesini elde edeceğiz; her eleman [öğrenci cevabı, doğru cevap] şeklindedir. Bu formun bir öğesini büyük harfle göstereceğiz; A1. soru için, B2. soru için vb. Yani cevaplar şu anda olarak saklanıyor

    ABCDEFGHIJKLMNOPQRSTUVWXY
    
  2. m0

    Bu "daha büyük bir palindrom" işlemidir; şu andaki değeri tersine, değerin kendisine ekleriz:

    ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
    
  3. ṁ135

    (Kalıp) operatör bir kaç şey, ama bu bağlamda etkili sürekli kendi akım değerini ekleyerek üretilen sonsuz listesindeki ilk 135 elemanları alır. Bu bize aşağıdakileri veriyor (kolaylık sağlamak için 50 elementin gruplarına ayrıldım; bu sadece dahili olarak 135 çiftin bir listesi):

    ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
    ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
    ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQP
    
  4. µ;

    µGeçerli değeri, eksik işlenenler için yeni varsayılan olarak ayarlar. Sonra hemen bir operand eksik bir yerleşik görüyoruz; ;ekler, ancak neyle ekleneceğini belirlemedik. Sonuç olarak, şu anki değer en sondaki değere eklenir µ(aynı zamanda şu anki değerdir), bize şu 270 öğelik geçerli değeri verir:

    ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
    ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
    ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPABCDEFGHIJKLMNO
    PQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBAABCDEFGHIJKLMNO
    PQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBAABCDEFGHIJKLMNO
    PQRSTUVWXYYXWVUTSRQP
    
  5. t€⁶

    Yukarıdaki tüm büyük harflerin [öğrencinin cevabı, doğru cevabı] bir çiftini temsil ettiğini unutmayın. İşlem t€⁶her ( ) çiftte çalışır ve çiftin her iki tarafından (yani çiftte görünen herhangi bir alandan t) boşlukları ( ) siler . Bu yüzden hala birçok tekrarlı aynı 270 sorudan oluşan bir listeye sahibiz, ancak bunlar [doğru cevap] (öğrenci cevap vermedi) veya [öğrenci cevap, doğru cevap] (öğrenci cevap verdi) şeklindedir.

  6. E€’

    E€’Operasyon aynı zamanda her (çalışır nedeniyle kullanımı,) eleman ve Etüm unsurları (yani öğrenci cevap veya soru hakkın var vermedi) eşit ise 1'den eleman değiştirir veya tüm 0 değilse, elemanlar eşittir (yani öğrenci cevapladı, ancak soruyu yanlış yaptı). Burada kullanımı numaralandırmayı değiştirir, bu da sırasıyla sırasıyla -1 veya 0 kullandığımızı gösterir. Cezaya uygun bir soru olsaydı cezalandırılacak bir cevap için -1, eksik veya doğru bir cevap için 0 olan bu yeni tür öğe için küçük harfler kullanacağım:

    abcdefghijklmnopqrstuvwxyyxwvutsrqponmlkjihgfedcba
    abcdefghijklmnopqrstuvwxyyxwvutsrqponmlkjihgfedcba
    abcdefghijklmnopqrstuvwxyyxwvutsrqpabcdefghijklmno
    pqrstuvwxyyxwvutsrqponmlkjihgfedcbaabcdefghijklmno
    pqrstuvwxyyxwvutsrqponmlkjihgfedcbaabcdefghijklmno
    pqrstuvwxyyxwvutsrqp
    
  7. ;E€

    İkimiz de gördük E€ve ;önce; şu anki değere bir şey ekliyoruz ve tüm öğeler eşitse 1, bazıları da farklıysa 0 biçimini kullanıyoruz ( bu sefer hayır !). Burada eksik bir işlenen var, bu yüzden değeri sondan itibaren kullanıyoruz µ(örn. 3. adımın çıktısı). 3. adımda, öğelerden boşluklar silmedik, bu nedenle doğru cevap için 1, yanlış veya eksik bir cevap için 0 alacağız (çünkü boşluk doğru cevapla eşleşmeyecektir). Bundan sonra, bunun için büyük harf kullanacağım 1 = doğru, 0 = yanlış / eksik format ve küçük harf kullanmaya devam etmek için 0 = doğru / eksik, -1 = yanlış. Elde edilen değer 405 elemente sahiptir ve şöyle görünür:

    abcdefghijklmnopqrstuvwxyyxwvutsrqponmlkjihgfedcba
    abcdefghijklmnopqrstuvwxyyxwvutsrqponmlkjihgfedcba
    abcdefghijklmnopqrstuvwxyyxwvutsrqpabcdefghijklmno
    pqrstuvwxyyxwvutsrqponmlkjihgfedcbaabcdefghijklmno
    pqrstuvwxyyxwvutsrqponmlkjihgfedcbaabcdefghijklmno
    pqrstuvwxyyxwvutsrqpABCDEFGHIJKLMNOPQRSTUVWXYYXWVU
    TSRQPONMLKJIHGFEDCBAABCDEFGHIJKLMNOPQRSTUVWXYYXWVU
    TSRQPONMLKJIHGFEDCBAABCDEFGHIJKLMNOPQRSTUVWXYYXWVU
    TSRQP
    
  8. ṫ⁹

    İşte daha önce bahsettiğim şaşırtıcı tesadüf geliyor. Kodun bu kısmından bahsetmeden önce, sahip olduğumuz yerin stokunu almak istiyorum.

    Her büyük harf doğru bir cevap için + 1'i temsil eder; ilk 15 soru ( Aaracılığıyla O), dizede her biri 5 kez görünür ve son 10 soru ( Paracılığıyla Y) her biri 6 kez görünür. Bu bit gerçekten büyülü değil; Programdaki 135 sayısını daha önce seçtiğimde (5 × 15 + 6 × 10'du) ve buradaki tek şans darbesi 5'in tuhaf bir sayı olduğu şeklinde tasarlanmıştı (yani son 10 ilk 10'dan ziyade fazladan zamana gelen sorular. Hemen bu önceki 15 harf içeren pboyunca tbir kez (-1 ceza sorular) ve uiçinden y(-2 ceza soru) ile iki kez. Bu da bir tesadüf değil; çünkü kullandıkm0daha önce, soruların ekstra kopyaları sıralıdır PQRSTUVWXYYXWVUTSRQPve sonraki sorular doğal olarak bu dizginin ortasına yakın olarak ortaya çıkacaktır (bu nedenle, "ilave" soruların son 15'ini almak kenarlara yakın olanlara daha az tekrar verecektir; ve Tabii ki, "ekstra" soruların son gelmesi şaşırtıcı değil).

    Her küçük harf yanlış, eksik bir cevap için puandan 1 çıkardığından ve her büyük harf doğru bir cevap için 1'e puan eklediğinden, bu nedenle sadece son 135 + 15 = 150 öğeyi almamız gerekir. Her eleman türü, doğru sayıda. Jelly’in listenin sonunda bir alt dize alma emri ; ancak, istediğiniz öğe sayısını değil, istediğiniz ilk öğenin dizinini belirtir. Bu noktada 405 elementimiz var ve 150 istiyoruz, bu yüzden indeks (405 - 150 + 1) veya 256'dan başlamamız gerekiyor. İnanılmaz bir tesadüfte 256, mevcut farklı oktetlerin sayısı olarak gerçekleşir ve böylece Jelly’te kısa bir gösterim (). Bunu gerçekleştirmek için yapabileceğim çok az şey vardı; adim 4, tur numarasına ulaşmak için listenin başına 135 eleman daha ekledi, ancak eklemek istediğim 135 eleman olduğu gerçeği (programın bu noktasında kolayca bulunabilen bir değer) gerçekten uygun oldu. Temel olarak başka herhangi bir sayı bu durumda tamamen yararsızdır.

    İşte dahili değer şimdi nasıl görünüyor:

    uvwxyyxwvutsrqpABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQP
    ONMLKJIHGFEDCBAABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQP
    ONMLKJIHGFEDCBAABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQP
    
  9. S

    Son olarak, şimdi soruların puanlarında bir değişiklik listesi var, tek yapmamız gereken onları kullanarak toplamak Sve işimiz bitti.


2

Python 2 , 93 91 bayt

f=lambda a,b,n=0:a>""and((a[0]==b[0])*(5+n/15)or-(n/15*n/10)*(a[0]<"^"))+f(a[1:],b[1:],n+1)

Çevrimiçi deneyin!

@KritixiLithos sayesinde -2 bayt


Giriş:

  • a: _Atlanan soru için öğrencinin dize olarak cevapları
  • b : doğru cevap
  • n: Mevcut soru sayısı 0temelli, varsayılan0

Bayt kaydetmek a[0]<'^'yerine yapabilirsiniza[0]!="_"
Kritixi Lithos

Bunun a>""yerine çalışabileceğini düşünüyoruma!=""
Kritixi Lithos

İlk kontrolünüz aboşken özyinlemeyi sonlandırıyorsa, yapamaz a andmısınız? Boş bir dize yanlıştır, aksi takdirde doğrudur.
FlipTack

Bu bir atardı @FlipTack TypeErrorbir dize dönecekti son özyinelemeli araması olarak
ovs

1

k, 52 bayt

İşlev 2 dizge alır, test durumlarına göre biçimlendir

{+/(~x="_")*(+,/'(15 5 5#'0 -1 -2;15 10#'5 6))@'x=y}

Örnek:

k){+/(~x="_")*(+,/'(15 5 5#'0 -1 -2;15 10#'5 6))@'x=y}["DBADBDCDBAEDABCD_E__A__C_";"DBADBDCDBAEDABCDBEEDACDCA"]
99

1

Haskell, 84 bayt

i x a b|a>'Z'=0|a==b=6-0^x|1<2= -x
w x=x<$[1..5*3^0^x]
(sum.).zipWith3 i(w=<<[0..2])

Kullanım örneği: ((sum.).zipWith3 i(w=<<[0..2])) "DBADBDCDBAEDABCD_E__A__C_" "DBADBDCDBAEDABCDBEEDACDCA"-> 99. Çevrimiçi deneyin! .

Nasıl çalışır: i x a btek bir cevabın skorunu adoğru sonucu bve xyanlış cevabın cezasını (negatif olmayan bir değer) hesaplar . Eğer ( a>'Z') atlarsanız , skor doğru 0, eğer cevap doğru ise ( a==b), skor 6-0^xbaşka, skor -x.

w=<<[0..2]uygulayarak 25 soru için ceza bir listesini yapar wiçin 0, 1ve 2, yani yapım 5*3^0^xher numaranın kopyalarını (-> 15 kez 0, 5 kez1 ve 5 kez 2).

zipWith3geçerlidir icezalar, cevapların listesi ve doğru sonuçlar listesine listesine. Sonunda tüm puanlar eklendi ( sum).


1

Octave, 61 54 bayt

@(a,b)[a==b,-(a<95&a~=b)]*[(x=1:25>15)+5,(1:25>20)+x]'

Çevrimiçi deneyin!

Önceki cevap:

@(a,b)(m=a==b)*(((f=kron(z=[0 0 0:2],z|1)')&1)+5)-(a<95&~m)*f

1

JavaScript (ES6), 105 103 101 94 89 88 85 84 78 77 bayt

ES6'daki ilk çözümüm, belki ilk Javascript'te bile

f=(s,a,i=24)=>i+1&&(s[i]>'Z'?0:s[i]==a[i]?5+(i>14):~(i>19)*(i>14))+f(s,a,i-1)

s sunulan çözümdür ve a doğru çözümdür. Her ikisi de dizge olarak alınacaktır.

İşte 78 byte özyinelemeli olmayan bir çözüm:

s=>a=>eval([...s].map((c,i)=>c>'Z'?0:c==a[i]?5+(i>14):~(i>19)*(i>14)).join`+`)

Körleme sözdiziminden girdi alır.

9 byte tasarruf için @ETHproductions sayesinde ! s[i]için cve (-1-(i>19|0))hiç~(i>19) .

Bir bayt tasarrufu için @Kritixi Lithos için teşekkürler ! c=='_'için c>'Z'.

Çevrimiçi deneyin!


Bunun JS'deki ilk çözümünüz olduğunu söylemek gerekirse, kod golf için ana diliniz nedir? Sadece kod golf için Python ve beynini kullandım.
0WJYxW9FMN

@ J843136028 Ana dilim Python, ancak ben de C # ile biraz golf oynadım. Haxe bir süredir yola çıkıyor, ama ben geri dönebilirim.
Yytsi,

Güzel! Beynimi sadece bir kez kullandım, bu yüzden ana dilim Python.
0WJYxW9FMN

@ J843136028 Evet, aslında yanıtlarınızı burada ve orada gördüm. Biyomun ürettiği gibi, çözümleri bulmak için o kadar fazla zaman harcamıyorum, bu yüzden çoğu zaman ilgilenmiyorlar. BrainF * ck ile sadece çok az şey yaptım, çünkü kısa çözümler bulmak, hatta ara problemler için çok zaman alıyor.
Yytsi

BF hakkında ne demek istediğini biliyorum. İnsanların cevaplarıma bakmasına şaşırdım.
0WJYxW9FMN
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.