ตรวจสอบว่าตัวเลขหารด้วย 13 (ไม่ใช้ 13 ตัวเอง) หรือไม่ [ปิด]


31

ความท้าทายของคุณคุณควรเลือกที่จะยอมรับมันคือการสร้างฟังก์ชั่นหรือโปรแกรมที่ส่งออก "ใช่" ถ้าจำนวนที่กำหนดคือหารด้วย 13 และเอาท์พุท "ไม่" ถ้ามันไม่ได้

กฎ:
- คุณไม่ได้รับอนุญาตให้ใช้หมายเลข 13 ทุกที่
- ไม่มีคำพ้องแบบคัดออกสำหรับทั้ง 13 ข้อ (เช่นใช้ 15 - 2)
- คะแนนโบนัสจะได้รับเมื่อไม่ได้ใช้โมดูลัสและโบนัสเพิ่มเติมสำหรับการไม่ใช้ส่วน

การให้คะแนน:
- คะแนนของคุณจะเป็นจำนวนไบต์ในโค้ดของคุณ ( ไม่รวมช่องว่าง) คูณด้วยโบนัสของคุณ
- หากคุณไม่ได้ใช้มอดุลัสโบนัสนั้นคือ 0.90; หากคุณไม่ได้ใช้การแบ่งโบนัสนั้นคือ 0.90
- หากคุณไม่ได้ใช้อย่างใดอย่างหนึ่งโบนัสนั้นคือ 0.80
- ยิ่งคะแนนของคุณต่ำลงเท่าไหร่ก็ยิ่งดีเท่านั้น

อินพุตจะเป็นจำนวนเต็มมากกว่า 0 และน้อยกว่า 2 ^ 32 เสมอ
ผลลัพธ์ของคุณควรเป็น "ใช่" หรือ "ไม่" ง่าย ๆ

คำอธิบาย:
- การใช้วิธีการวงเวียนบางอย่างในการสร้างหมายเลข 13 สำหรับการใช้งานเป็นที่ยอมรับ ไม่อนุญาตให้ใช้คำพ้องความหมายแบบง่ายเช่น (10 + 3)
- ฟังก์ชั่นหรือโปรแกรมจะต้องส่งออกอย่างแท้จริง "ใช่" หรือ "ไม่" สำหรับถ้าจำนวนที่กำหนดให้หารด้วย 13
- เช่นเคยแนะนำโซลูชั่นที่ฉลาด แต่ไม่จำเป็นต้องใช้


คือ 'จริง' หรือ 'เท็จ' เอาต์พุตที่ถูกต้อง?
Blazer

8
จาวาสคริปต์ (27 function f(n){return "yes"}ตัวอักษร) สิ่งนี้จะส่งกลับ 'ใช่' สำหรับตัวเลขทั้งหมดที่สามารถหารด้วย 13
ajax333221

5
"(ช่องว่างไม่รวม)" มักจะได้รับผลในหนึ่งในสองสถานการณ์: โปรแกรมถอดรหัสเนื้อหาในช่องว่างหรือโปรแกรมที่เขียนในช่องว่าง (การเขียนโปรแกรมภาษา)
JiminP

4
Using some roundabout method of generating the number 13 for use is acceptable.คุณจะทราบได้อย่างไรว่า "วงเวียนเพียงพอ"
Cruncher

3
@Rusher จะซื่อสัตย์ฉันไม่ได้สังเกตว่ามันเป็น 2 ปีเพิ่งเพิ่งเปิดใช้งาน สำหรับข้อเสนอแนะของคุณผมไม่อยากนินจาเปลี่ยนแปลงที่ไม่ใช่-OP คำถามมี 2 หน้าของคำตอบ .. ก
Cruncher

คำตอบ:



19

ASM - 16 บิต x86 บนเชลล์คำสั่ง WinXP

ปฏิบัติการได้ - 55 ไบต์ * 0.8 = 44

แหล่งที่มา - 288 ตัวอักษร * 0.8 = 230.4

หมายเลข 13 ไม่ปรากฏในไฟล์. com ที่ประกอบ

ประกอบโดยใช้ A86

    mov si,82h
    xor ax,ax
    xor cx,cx
a:  imul cx,10
    add cx,ax
    lodsb
    sub al,48
    jnc a
    inc cx
h:  mov dl,a and 255
c:  loop g
    sub dl,a and 255
    jz e
    mov dl,4
e:  add dl,k and 255
    mov dh,1
    mov ah,9
    int 21h
    ret
g:  inc dl
    cmp dl,c and 255
    jne c
    jmp h
k:  db 'yes$no$'

ฉันเข้าใจว่าโซลูชันนี้ฉลาด แต่เมื่อมองว่านี่เป็นโค้ดกอล์ฟเราไม่ควรเปลี่ยนวิธีแก้ปัญหาที่สั้นที่สุดแทนที่จะเป็นโซลูชันที่ฉลาดที่สุด?
mellamokb

21
@mellamokb: จากสิ่งที่ฉันอ่านใน meta บางคนคิดว่าการออกเสียงลงคะแนนเป็นเครื่องหมายแสดงความขอบคุณสำหรับวิธีแก้ปัญหาที่ฉลาด / ผิดปกติ หากเราโหวตโดยคำตอบที่สั้นที่สุดจะไม่มีประเด็นใดในการลงคะแนน ฉันเดาว่า 'ขีด' จะไปที่รหัสที่สั้นที่สุดเพื่อเป็นเครื่องหมายแห่งความรุ่งโรจน์ขั้นสูงสุด จากนั้นอีกครั้งคำตอบง่ายๆใน golfscript จะเล็กกว่าโซลูชันที่ฉลาดจริงๆใน C - ดังนั้นใครควรได้รับการโหวต? ในท้ายที่สุดการโหวตไม่สำคัญเลยมันเป็นเรื่องสนุก
Skizz

1
The input will always be an integer greater than 0 and less than 2^32กฎ: คุณไม่สามารถใช้ 16 บิต
Fabricio

@Fabricio: ตัวเลข 16 บิตทั้งหมดน้อยกว่า 2 ^ 32 :-)
Skizz

ฮ่า ๆ .. คุณพูดถูก แต่คุณไม่สามารถจัดการ 2 ^ 32-1 = p
Fabricio

17

Python 3.x: 54 * 0.8 = 43.2

อาจเป็น cop-out ที่มีสตริงความยาว 13 แต่ที่นี่จะไป:

print('no' if any((' ' * int(input())).split('             ')) else 'yes')

มันใช้งานได้โดยการสร้างสตริงของช่องว่าง n (ตัวเลือกของตัวคั่นเป็นกฎเกณฑ์ แต่ฉันเลือกพื้นที่ด้วยเหตุผลที่ชัดเจน) และแยกสตริงย่อย 13 พื้นที่ออกไปจนกว่าคุณจะเหลือสตริงที่มีช่องว่าง% n 13


4
+1 ฉันชอบช่องว่างแยกตามตัวละคร 13 ตัว ย้ายไป Python 2 และใช้เทคนิคจากคำตอบของฉันจะลงคะแนน 35.2:print 'yneos'[any((' ' * input()).split(' '))::2]
Steven Rumbalski

ฉันกำลังจะพูดว่า: คุณสามารถแทนที่' 'ด้วย' '*6+' 'เพื่อบันทึก 5 ตัวอักษร - แต่แล้วฉันก็พบว่าช่องว่างไม่ได้นับเลย ...
kratenko

15

GolfScript, 32 ตัวอักษร

~){.14base{+}*.@<}do('no''yes'if

ฉันต้องการลองสิ่งที่แตกต่างจากคนอื่นดังนั้นโซลูชันของฉันคำนวณรากดิจิตอล 14 ฐานของจำนวนโดยการแปลงตัวเลขเป็นฐาน14ซ้ำ ๆและสรุปตัวเลขจนกว่าผลลัพธ์จะไม่เล็กลงอีกต่อไป สิ่งนี้จะเหมือนกับการคำนวณโมดูโลส่วนที่เหลือ 13 ยกเว้นว่าผลลัพธ์จะอยู่ในช่วง 1 ถึง 13 แทนที่จะเป็น 0 ถึง 12

เนื่องจากการตรวจสอบว่ารูทดิจิทัลเท่ากับ 13 นั้นยากไหมถ้าไม่ใช้หมายเลข 13 ด้วยตัวเอง (หรือวิธีแก้ปัญหาบางอย่างเช่น 12 + 1) สิ่งที่ฉันทำจริง ๆ คือฉันเพิ่มหมายเลขอินพุตทีละหนึ่งก่อนลูปและลดผลลัพธ์ในภายหลัง ด้วยวิธีนี้ผลลัพธ์ที่ได้จากการหารด้วย 13 จะเป็นศูนย์ซึ่งง่ายต่อการตรวจสอบ

นี่เป็นเวอร์ชันที่แสดงความเห็นของโปรแกรม:

~              # evaluate the input, turning it from a string to a number
)              # increment by one
{              # start of do-loop 
    .          # make a copy of the previous number, so we can tell when we're done
    14 base    # convert the number to base 14
    { + } *    # sum the digits
    . @ <      # check if the new number is less than the previous number...
} do           # ...and repeat the loop if so
(              # decrement the result by one
'no' 'yes' if  # output 'no' if the result is non-zero, 'yes' if it's zero

โปรแกรมนี้จะจัดการกับสิ่งใดอินพุตจำนวนเต็มที่ไม่เป็นลบเนื่องจาก GolfScript ใช้เลขคณิตเลขฐานสอง แน่นอนอินพุตที่มีขนาดใหญ่มากอาจใช้เวลาและ / หรือหน่วยความจำมากเกินไป

รหัสไม่ได้ใช้ทั้งโมดูโลหรือการหารโดยตรงแม้ว่ามันจะใช้ตัวดำเนินการแปลงพื้นฐานของ GolfScipt ซึ่งเกือบจะแน่นอนว่ามีการหารและส่วนที่เหลืออยู่ภายใน ฉันจะทิ้งให้ GigaWatt ตัดสินใจว่าสิ่งนี้มีคุณสมบัติฉันสำหรับโบนัสหรือไม่


หากทุกคนเท่านั้นที่จะแสดงความคิดเห็นรหัส golfscript ของพวกเขาเป็นอย่างดี Kudos
skibrianski

13

C, 68 * 0.8 = 54.4

หลังจาก 24 คำตอบยังไม่มีใครพบอัลกอริทึมที่ชัดเจนนี้:

f(x){puts("no\0yes"+3*((x*330382100LL>>32)-(~-x*330382100LL>>32)));}

ฉันรอคนที่จะทำจำนวนเต็มคูณซึ่งกันและกัน ไม่เพียง แต่จะเป็นทางออกที่ยอดเยี่ยมสำหรับความท้าทายเท่านั้น แต่ยังเป็นเทคนิคที่มีประโยชน์ในตัวมันเองด้วยการเพิ่มประสิทธิภาพ
Sir_Lagsalot

สิ่งนี้ยังคงใช้ได้แม้ว่าจะไม่ได้มาตรฐานมาก?
oldrinb

1
@oldrinb ฉันเห็นว่าไม่มีข้อกำหนดสำหรับการปฏิบัติตามมาตรฐานในคำถาม โดยทั่วไปแล้วการปฏิบัติตามมาตรฐานที่เข้มงวดนั้นน่ารำคาญอย่างยิ่งในการตีกอล์ฟ
ugoren

คุณช่วยอธิบายได้ไหมว่าทำไมสิ่งนี้ถึงได้ผล
Vedaad Shakib

@ user2767189 เป็นเทคนิคที่เรียกว่า "reciprocal multiply" - โดยพื้นฐานแล้ววิธีการใช้การหารด้วย X โดยใช้การคูณด้วย (2 ^ K / X) ในกรณีนี้ X คือ 13 และ 330382100 * 13 เกือบเท่ากับ 2 ^ 32
ugoren

11

JavaScript (27.9)

เวอร์ชันปัจจุบัน (31 ตัวอักษร * 0.90 โบนัส = 27.9)

alert(prompt()*2%26?'no':'yes')

ตัวอย่าง: http://jsfiddle.net/9GQ9m/2/

แก้ไข 1:ทิ้งโบนัสที่สองโดยใช้โมดูลัสเพื่อลดคะแนนอย่างมากและหลีกเลี่ยงการforวนซ้ำ กำจัด~~และบันทึกสองตัวอักษรด้วย (ขอบคุณ@copy)


รุ่นที่เก่ากว่า (48 ตัวอักษร * 0.80 โบนัส = 38.4)

for(n=~~prompt()*2;n-=26>0;);alert(n?'no':'yes')​

คูณทุกอย่างด้วยสองและใช้ 26 แทน ... ไม่เห็นว่าจะมา
Mr. Llama

คุณสามารถละเว้น~~อินพุตที่ถูกต้องได้ มิฉะนั้นprompt()<<1จะใช้งานได้เช่นกัน
คัดลอก

ถึงแม้ว่าฉันจะยอมรับมันในทางเทคนิคไม่ถึงขีด จำกัด ของ 2 ^ 32 อีกต่อไปใช้วิธีนี้ ..
mellamokb

1
ในความเป็นจริงมันทำงานได้เกิน 2 ^ 32 เนื่องจากคุณปล่อยผู้ประกอบการในระดับบิต
คัดลอก

3
นี่ยังคงใช้เลขคณิต quickie เพื่อหาการหารด้วย 13 และมีกฎที่บอกว่าไม่มีเลขคณิต cop outs ...
WallyWest

7

brainfuck

คะแนน: 200 * 0.8 = 160

>++++++[>++++++++<-]>>,[<[-<+>>-<]<[->+<]>>>[->++++++++++<]>[-<+>]<<[->+<],]++++
+++++++++>[>+<-<-[>>>]>>[[-<<+>>]>>>]<<<<]>[<<<[-<++>]<++++++++++++++.+.>]<<[[-<
++++++<++++++++>>]<-----.<---.>------.>]

อ่านจาก stdin อาจไม่ใช่วิธีที่ฉลาดที่สุด แต่การได้รับสิ่งใดก็ตามที่ทำงานใน BF นั้นเป็นสิ่งที่ดี มันค่อนข้างกะทัดรัด


คำอธิบายใด ๆ เกี่ยวกับวิธีการทำงาน? ดูเหมือนว่าโดยค่าเริ่มต้น BrainFuck จะได้รับโบนัสเต็ม 0.8 เพราะมันไม่มีการแบ่งหรือโมดูลัส
Mr. Llama

@GigaWatt มันคำนวณโมดูลัส
คัดลอก

1
ใช่ แต่สิ่งที่ฉันหมายถึงคือมันไม่ได้ใช้ตัวดำเนินการโมดูลัส (เพราะไม่มี) ดังนั้นมันจะได้รับโบนัสเสมอหากไม่ได้ใช้ นอกจากนี้ยังมีรูปชีวภาพที่ดี
Mr. Llama

@GigaWatt ฉันไม่เห็นด้วยกับคุณเพียงแค่ตอบคำถามของคุณ
คัดลอก

7

สกาล่า (38 * 0.9 = 34.2)

คล้ายกับ0xD(hex) หรือ015(oct)

ค่าASCIIของCRคือ 13

def t(n:Int)=if(n%'\r'==0)"yes"else"no"

1
ฉันสงสัยว่านานแค่ไหนก่อนที่ฉันจะเห็นใครคนหนึ่งใช้ประโยชน์จากค่า ascii
Mr. Llama

1
คุณสามารถเพิ่มคะแนนในโพสต์ของคุณได้ไหม? ควรเป็น 38 * 0.9 = 34.2
mellamokb


5

งูหลาม:

f=lambda n:1==pow(8,n,79)

เช่น

[i for i in range(100) if f(i)]

จะช่วยให้

[0, 13, 26, 39, 52, 65, 78, 91]

1
ตอนนี้ฉันชอบ อย่างไรก็ตามจะต้องมีค่าใช่ / ไม่ใช่ตามเกณฑ์การท้าทายและคุณควรโพสต์คะแนนของคุณ (25 * .08 = 20)
Blazer

f=lambda n:pow(8,n,79)-1 and "no" or "yes"แก้ไขมัน, 43 * 0.8 = 34.4
ugoren

4

C, 54.4 == 68 * .8   80 * .8

char*f(c){char*s=" yes\0\rno";while(c&&*s++);return c>0?f(c-*s):++s;}

ใช้ดี\r- ฉันคิดว่ามันดีสำหรับการรองรับ Windows เท่านั้น แต่ทำไมจะทำc>0เมื่อcใด
ugoren

@ugoren: มันจะไม่ทำลองคิดดู
หยุดที่จะเปลี่ยนรหัสล็อคซึ่งเป็น

You're right, I got confused somehow. I was thinking about numbers above 2^31, where >0 is no good. But instead of noticing that your function doesn't support them, I thought == is good.
ugoren

4

ECMAScript 6, 25 × 0.9 = 22.5

Yeah, it's a boring way of getting 13.

n => n % '             '.length ? 'no' : 'yes'

i was trying to figure out how your score was so low, then i realized the genius in using whitespace for your number... lol
mellamokb

1
+1 for abusing the rules. If I stated them, it would be "not counting REMOVABLE whitespace". So is anyone going to give us a 0 byte solution?
ugoren


3

APL ((21 - 1) × 0.8 = 16)

'yes' 'no'[1=⎕∨⌊⍟9*6]

⎕IO should be set to 0 for this to work properly in Dyalog APL. To generate 13, we take the floor () of the natural logarithm () of 9 to the power of 6 (9*6). After that, we find the GCD () of our input () and 13, and we then test if that equals 1. This is used to index ([...]) the vector of answers.

If anyone wants to be pedantic about the mention of bytes in the scoring specification, the score for the UTF-8 encoded version of this is (29 - 1) × 0.8 = 22.4. :)


1
I so want to be pedantic about bytes.
Steven Rumbalski

1
Ohhhhhhhh snap you di-int.
Dillon Cower


3

Perl - 44 × 0.8 = 35.2

#!perl -p
map$_+=4*chop,($_)x10;$_=chop^$_*3?'no':yes

Counting the shebang as one byte.

I'm a bit late to the game, but I thought I'd share the algorithm, as no other posts to this point have used it.

This works under the observation that if n is divisible by 13, then ⌊n/10⌋+n%10*4 is also divisible by 13. The values 13, 26 and 39 cycle onto themselves. All other multiples of 13 will eventually reach one of these values in no more than log10 n iterations.


In Other Bases

Admittedly, chop is a bit of a cop-out. With a base 10 representation, it's equivalent to divmod. But the algorithm works prefectly well in other bases, for example base 4, or 8.

Python style pseudo-code of the above algorithm (base 10):

def div13(n):
    while n > 40:
        q, r = n // 10, n % 10
        n = q + 4*r
    return n in [13, 26, 39]

In base 2:

def div13(n):
    while n > 40:
        q, r = n >> 1, n & 1
        n = q + 7*r
    return n in [13, 26, 39]

In base 4:

def div13(n):
    while n > 40:
        q, r = n >> 2, n & 3
        n = q + 10*r
    return n in [13, 26, 39]

In base 8:

def div13(n):
    while n > 40:
        q, r = n >> 3, n & 7
        n = q + 5*r
    return n in [13, 26, 39]

etc. Any base smaller than 13 works equally well.


2

Javascript: 59*0.8 = 47.2 (?)

fiddle:

function r(n){
  for(c=0;n>c;n-=12,c++);
  return n==c?'yes':'no';
}

Including mellamokb's improvement (57*0.8 = 45.6):

function r(n){
  for(c=0;n>c;n-=12,c++);
  return n-c?'no':'yes'
}

1
You can save two chars by changing return to return n-c?'no':'yes' and omitting the second semicolon.
mellamokb

@mellamokb Good catch. Could probably improve further by writing it in Ruby, or something that allows more compact function definitions.
Supr

There is also an accepted standard on CG to use prompt for input and alert for output, which makes the program interactive and saves a few chars.
mellamokb


2

Perl (19.8)

21 bytes * .9

say2*<>%26?"no":"yes"

note: My first Perl program ever. Weakly typed is good for golf i guess.


I've found that a good way to measure your knowledge of a language is to try and golf in it. Usually requires knowing edge cases. Also, your score is actually 23 * 0.90 (whitespace doesn't count).
Mr. Llama

Thought I had accounted for the whitespace. Fixed now. Thanks for pointing that out.
Steven Rumbalski

Wow. No love for Perl. Can't say I like it either.
Steven Rumbalski

2

in C (K&R): 47 * 0.8 = 37.6

f(i){for(;i>0;i-=__LINE__);puts(i?"no":"yes");}

EDIT1: okay removed all dependencies on external functions, the above will work as long as you put this line on the 13th line of the file! :) If __LINE__ is okay to be replaced by say 0xd then can save a further 5 characters (score: 33.6)


7
If this needs to be on 13th line, you need to add 12 newlines to your code, and therefore, to your score: it becomes 59 * 0.8 = 47.2
Vereos


2

JavaScript (108 less 0 for whitespace) => 108, x 0.8 (no modulus, no division) = 86.4

b=b=>{a=z,a=a+"";return+a.slice(0,-1)+4*+a.slice(-1)};z=prompt();for(i=99;i--;)z=b();alert(b()-z?"no":"yes")

This method uses the following algorithm: 1. Take the last digit, multiply it by four, add it to the rest of the truncated number. 2. Repeat step 1 for 99 iterations... 3. Test it one more time using step 1, if the resulting number is itself, you've found a multiple of 13.

Previous update, removed var, and reversed logic at the alert to remove more chars by using subtraction-false conditional.

Technically, the end result is that you'll eventually reach a two digit number like 13, 26, or 39 which when run through step 1 again will give 13, 26, or 39 respectively. So testing for iteration 100 being the same will confirm the divisibility.



2

Common Lisp (71 bytes * 0.8) = 56.8

Simple recursion, really.

(defun w(x)(if(> x 14)(w(- x 13))(if(> 14 x 12)(print'yes)(print'no))))

Ungolfed:

(defun w (x)
  (if (> x 14)
      (w (- x 13))
      (if (> 14 x 12)
          (print 'yes)
          (print 'no))))


1

D 56 chars .80 bonus = 44.8

bool d(double i){
    return modf(i*0,0769230769,i)<1e-3;
}

this might have been a cop-out with using 1/13 and a double can store any 32 bit number exactly

edit: this works by multiplying with 1/13 and checking the fractional part if it's different from 0 (allowing for rounding errors) or in other words it check the fractional part of i/13


doesn't modf count as using modulus?
Blazer

@Blazer not really it takes the fractional part of the first argument and returns it while storing the integral part in the second arg
ratchet freak

Just a note: the result (yes/no) has to actually be output. Also, I'm somewhat curious as how this solution works. An explanation would be much appreciated!
Mr. Llama

1

Python 2.7

(20 - 1 whitespace) * 0.9 (no division) = 17.1

print input()%015==0

yes/no instead of true/false: 31 * 0.9 (no division) = 27.9

print'yneos'[input()%015!=0::2]

takes advantage of python's int to convert other bases from strings into base 10 integers. you can see in both versions they use a different (yet same character length) base

edit: 1 char save in yes/no version

edit2: another 2 chars shaved!

edit3: thanks again to comments! even more characters shaved off by using python's builtin octal representations (015 == 13...) instead of int's base translation


3
I see a cop-out with the different bases
ratchet freak

14 in base 9? I should have seen that coming.
Mr. Llama

1
print['no','yes'][input()%int('d',14)==0
Steven Rumbalski

as far as I saw, a cop-out was defined as being something like 14-1 or 26/2. I just took creative liberty to represent 13
Blazer

@StevenRumbalski thanks for the 1 char save :P
Blazer

1

Perl, 95 * 0.8 = 76

$_=<>;
while($_>0){
$q=7*chop;
$d=3*($m=chop$q);
chop$d;
$_-=$d+$m}
if($_){print"no"}
else{print"yes"}

The line breaks were added for clarity. I could have probably made this answer a lot shorter, but I feel that this answer represents a unique way of approaching the problem.


1

Python - score 27.9

(31 characters * 0.90) -- forgoes some bonus for shorter code.

print'yneos'[2*input()%26>0::2]

older version: (47 characters * 0.80) -- complete rip-off of mellamokb's Javascript answer, but in Python.

n=2*input()
while n>0:n-=26
print'yneos'[n<0::2]

older version: (60 characters * 0.80)

n=input()
while n>12:
 for _ in'x'*12+'!':n-=1
print'yneos'[n>0::2]

older version: (105 characters * 0.80)

n=abs(input())
while n>12:n=abs(sum(int(x)*y for x,y in zip(`n`[::-1],n*(1,-3,-4,-1,3,4))))
print'yneos'[n>0::2]

Hmm, this is a nifty method. That 1,-3,-4 pattern is similar to what I saw on wikipedia. Still cool to see it in code.
Mr. Llama

@GigaWatt: That's where I got it. The other pattern (1,10,9,12,3,4) would save 1 character but would not resolve to a value less than 13.
Steven Rumbalski

1

In Q:

d:{$[0=x mod "I"$((string 6h$"q")[1 2]);`yes;`no]}
50*.9=45

Welcome to CodeGolf.SE. You should put your code in a codeblock, and which point you can use backticks where you mean backticks as they no longer have formatting meaning. I've done the first part for you, please check it and fix any errata I've introduced.
dmckee

1

Right Linear Grammar - ∞ points

S->ε
S->1A
S->0S
S->9I
S->3C
S->5E
S->4D
S->2B
S->7G
S->6F
S->8H
F->3K
K->0F
A->2L
K->1G
A->5B
A->0J
B->7A
J->5A
G->6K
G->8S
H->9K
F->5S
K->2H
I->6E
I->5D
J->4S
D->8I
B->6S
K->9B
F->6A
G->9A
K->6L
K->4J
C->1E
L->8K
E->5C
B->4K
C->0D
J->2K
D->2C
A->9F
J->7C
C->6J
C->8L
E->0K
L->0C
B->9C
E->2S
L->6I
I->0L
J->0I
B->2I
I->3B
H->1C
I->7F
C->4H
F->1I
G->4I
I->0G
C->3G
F->8C
D->0A
E->3A
I->9H
A->7D
C->2F
H->7I
A->8E
F->9D
E->8F
A->6C
D->6G
G->0E
D->5F
E->9G
H->2D
D->7H
H->3E
I->2A
K->3I
C->9S
C->7K
E->4B
D->1B
L->1D
J->9E
I->1S
E->1L
J->8D
D->9J
L->2E
J->3L
B->5L
B->8B
L->7J
L->9L
G->1F
A->4A
K->5K
B->3J
H->6H
E->7E
J->1J
D->4E
G->2G
J->6B
D->3D
E->6D
H->4F
I->4C
C->5I
F->0H
H->5G
K->7S
G->3H
L->5H
H->8J
A->3S
H->0B
B->1H
G->7L
K->8A
F->2J
F->7B
L->4G
F->4L
A->1K
B->0G
G->5J
L->3F

Then depending on how you choose to 'run' it, it will output 'yes' or 'no'.

Not a serious entry, just some fun ;)

EDIT: Perhaps I should explain a bit.

A grammar is a set of rules (productions) which define a language. A language can be thought of as all of the possible strings formed by an alphabet, that conform to the rules of it's grammar.

Here the alphabet is the set of all decimal digits. The grammar's rules are that all strings must form decimal integers that are divisible by 13.

We can use the grammar above to test whether a string belongs to our language.

The rules of the grammar contain terminal symbols (which are elements in the language) as well as non-terminal symbols which are replaced recursively.

It's easier to explain what's going on with an example:

Lets say for example that the string we are testing is 71955.

There is always a start symbol (which is non-terminal), in the case of the grammar above this is 'S'. At this point we have not read any characters from our string:

current pattern                    symbol read
S                                  ε

Now, we read the first symbol in our string which is '7', then we look for a rule in the grammar which has any of the non-terminals in our current pattern in the left hand side of the '->' and that has our symbol in the right hand side of the '->'. Luckily there is one (S->7G), so we replace the non-terminal symbols in our current pattern with the right hand side of the new rule:

current pattern                    symbol read
7G                                 7

Now we have the non-terminal 'G' in our pattern, and the next symbol to be read is '1', So we look for a rule in our grammar that begins with 'G->1". We find there is one (G->1F), so we replace the non terminal with the RHS of our new rule:

current pattern                    symbol read
71F                                1

Keep repeating this process:

Next rule: F->9D

current pattern                    symbol read
719D                               9

Next rule: D->5F

current pattern                    symbol read
7195F                              5

Next rule: F->5S

current pattern                    symbol read
71955S                             5

At this point we have no more symbols in our string, but we have another non-terminal symbol in there. We see from the first rule in the grammar that we can replace 'S' with the empty string (ε): S->ε

Doing so gives us the current patter: 71955ε which is the equivalent to 71955.

We have read all of the symbols in our string, and the pattern contains no non-terminal symbols. Which means that the string belongs to the language and therefore 71955 is in fact divisible by 13.

I.e. the goal is to have pattern = string. If you are left with any non-terminal symbols, after reading all of the symbols in your string, the string doesnt belong to the language. Likewise, if you still have more symbols in your string to read, but there are no rules in the grammar allowing you to go forward, then the string does not belong to the language.


I'm... not even sure what I'm looking at here.
Mr. Llama

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.