ถอดรหัสรหัสไปที่รหัสล็อคแบบผสม


22

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

กุญแจรหัส

คุณรู้ด้วยว่าเมื่อดูที่คำสั่งของตัวเลขในบรรทัดอื่นคุณสามารถคำนวณได้ว่าตัวเลขใดที่ต้องอยู่ในบรรทัดการรวม (ดังนั้นจึงเป็นการรวมกันเพื่อปลดล็อก)

ถ้าบรรทัดล็อคทุกคนจะได้รับหมายเลขเริ่มต้นจากบรรทัด 0 สำหรับสายการรวมกัน (บรรทัดที่ปลดล็อคล็อค) กับสาย 9. ตัวอย่างเช่นถ้าตัวเลขบนสาย 4 มีแล้วรวมกันเพื่อปลดล็อคมันจะเป็น53361992

โชคไม่ดีที่ล็อคนั้นได้รับการบรรจุแล้วและมุมมองของการล็อคแต่ละครั้งของคุณนั้นถูกบดบังดังนั้นคุณจะเห็นเฉพาะตัวเลขบนเส้นต่าง ๆ ของการล็อค

ความท้าทาย

รับ 4 คู่หลักที่ตัวเลขแรกของจำนวนเต็มแสดงหมายเลขบรรทัดและตัวเลขที่สองหมายถึงจำนวนที่ปรากฏบนบรรทัดนั้นผลงานการรวมกันเพื่อล็อค ตัวอย่างเช่นถ้าคุณป้อน:

57 23 99 45

จากนั้นก็ควรส่งออก:

2101

หรือ

25 78 63 15

และ

3174

สมมติว่าอินพุตจะเป็นจำนวนเต็มบวก 4 เสมอในรูปแบบ `25 64 72 18

นี่คือดังนั้นโปรแกรมที่สั้นที่สุดในจำนวนไบต์ชนะ

นี่เป็นคำถามแรกของฉันดังนั้นคำติชมใด ๆ ก็ได้รับการชื่นชม


ฉันคิดว่าคุณจำเป็นต้องชี้แจงการป้อนข้อมูล คุณพูดว่า " ได้รับ 4 คู่ของจำนวนเต็ม " 57 23 99 45จากนั้นให้ตัวอย่าง นั่นไม่ใช่จำนวนเต็มสี่คู่: เป็นจำนวนเต็มสี่คู่ และบางคำตอบก็สมมติว่าพวกเขาเข้าใจว่าเป็นสตริงในขณะที่คนอื่น ๆ คิดว่ามันมาพร้อมแจงเป็น 4 int
Peter Taylor

ฉันไม่เห็นด้วยความจริงที่ว่ามันบอกว่าจำนวนเต็มสี่คู่ทำให้รูปแบบของการป้อนข้อมูลชัดเจน 57 คือจำนวนเต็มคู่ที่ 5 และ 7 ไม่ใช่จำนวนเต็ม 57 ข้อสันนิษฐานแรกของฉันคือเส้นเป็น 57 และรวมกันเป็น 23
Qwerty01

1
วิธี "คู่ของตัวเลข" ที่จะมากขึ้นที่ชัดเจนและแม่นยำ (และยังทำงานร่วมกับผู้นำ0s)
ปุย

เทคนิค, คำที่ถูกต้องจะล็อคเปลี่ยนแปลง "การรวมกันล็อค" ส่วนใหญ่เป็นล็อคการเปลี่ยนแปลงเนื่องจากจริง ๆ แล้วลำดับของตัวเลขที่สร้างความแตกต่าง
nyuszika7h

ในทางเทคนิคแล้วมันถูกต้อง แต่ฉันไม่คิดว่าจะทำให้ชื่อลวง
Rory McPerlroy

คำตอบ:


32

CJam, 9 8 ไบต์

ea9fbAf%

อ่านคู่หลักเป็นอาร์กิวเมนต์บรรทัดคำสั่ง เพื่อลองรหัสออนไลน์ , การเปลี่ยนแปลงeaที่จะlS/อ่านจาก STDIN จำลอง

ตัวอย่างการวิ่ง

$ cjam <(echo ea9fbAf%) 57 23 99 45; echo
2101
$ cjam <(echo ea9fbAf%) 25 78 63 15; echo
3174

มันทำงานอย่างไร

รหัสตัวละครหลักdคือ48 + D ดังนั้นเมื่อพิจารณาสตริงสองหลักXYฐาน 9 อัตราผลตอบแทนจำนวน9 * (48 + x) + (48 + y) = 10 * (48 + x) + Y - X ≡ Y - X (สมัย 10)

ea       " Push the array of command-line arguments.                                      ";
  9fb    " Mapped base 9 conversion; replace each string 'xy' with (9 * ord(x) + ord(y)). ";
     Af% " Take the results modulo 10.                                                    ";

บ้าคุณไม่สามารถปล่อยให้ใครชนะใช่ไหม? : P
เครื่องมือเพิ่มประสิทธิภาพ

ฉันไม่คิดว่าเราจะได้รับคำตอบที่ดีกว่านี้
Rory McPerlroy

1
เกิดอะไรขึ้นที่นั่น
สงคราม

1
@ DigitalTrauma: แน่นอนไปเลย สตริง"99"ถูกตีความตามจริงเป็นอาร์เรย์[57 57]โดยb; จะดำเนินการเป็น"xy"9b 9 * ord(x) + ord(y)ฉันควรจะเพิ่มเข้าไปในคำตอบของฉัน
เดนนิส

4
10,000 ครอบคลุมโปรแกรม 2 ตัวอักษรแทบทั้งหมดหากเรา จำกัด วิธีแก้ปัญหาที่เป็นไปได้สำหรับ ASCII ที่พิมพ์ได้
Dennis

13

CJam, 13 12 11 ตัวอักษร

ต้องขอบคุณผู้ใช้ 23013 ตอนนี้ลดลงเหลือ 11 ตัวอักษร :)

4{Ar:--A%}*

คำอธิบาย:

4{       }*     "Run the code block 4 times";
   r            "Read the next input token (whitespace separated)";
    :-          "Subtract 2nd number from the first treating r as a 2 numbered string";
  A   -         "Subtract the result of above from 10";
       A%       "Take modulus of 10 and store it on stack";

ลองออนไลน์

ฉันรู้ว่ามันสามารถตีกอล์ฟได้มากกว่านี้ แต่นี่เป็นความพยายามครั้งแรกของฉันใน CJam และฉันถูก จำกัด ด้วยประสบการณ์ :)


อีกวิธีหนึ่งในการทำสิ่งเดียวกันด้วยอักขระพิเศษ 1 ตัว:

l~]{_A/-A%}/     // My previous solution

หรือ

4{ri_A/-A%}*     // As pointed out by Ingo

หรือ

ea{i_A/-A%}/     // If input is passed through command line

ฉันรอสิ่งนี้ สัปดาห์หน้า ...
Soham Chowdhury

อักขระสามตัวแรกอาจเป็นทางเลือกl~]ก็ได้ ฉันรู้สึกว่าการแยกวิเคราะห์อินพุตควรเป็นไปได้ด้วยน้อยกว่าสาม แต่ฉันไม่เคยใช้ CJam มาก่อน: /
Ingo Bürk

4{ri_A/-A%}*สั้นลงหนึ่งไบต์
Ingo Bürk

1
อาหรือสิ่งที่คุณทำจากความคิดเห็นก่อนหน้าของฉัน ตอนนี้มีสองโซลูชั่น 12 ไบต์! :)
Ingo Bürk

3
4{Ar:--A%}*หรือ
jimmy23013

6

Golfscript (14 13 )

ลองออนไลน์ได้ที่นี่

มันค่อนข้างเหมือนกับโซลูชันของเครื่องมือเพิ่มประสิทธิภาพแต่ในภาษาอื่น มันยากที่จะเข้าถึงมันในวิธีที่ต่างกันเนื่องจากปัญหาค่อนข้างง่ายดังนั้นการผูกไปที่เครื่องมือเพิ่มประสิทธิภาพอย่างแน่นอนซึ่งรายการก่อนหน้านี้อยู่แล้ว

~]{.10:^/-^%}/

สำหรับจำนวนไบต์เดียวกันคุณสามารถทำได้

~]{.10/- 10%}/

ไม่มีตัวแปรที่กำหนดไว้ล่วงหน้าที่มีค่า 10 ใน Golfscript?
เครื่องมือเพิ่มประสิทธิภาพ

@Optimizer น่าเสียดายที่ไม่มี น่าเสียดายที่เนื่องจากการป้อนข้อมูลในสแต็กแล้วจะเป็นประโยชน์กับ CJam
Ingo Bürk

ใช่มันสามารถเป็น 10 ตัวอักษรใน CJam (ด้วยการป้อนข้อมูลในสแต็ค) หรือ 11 ใน Golfscript (พร้อมตัวแปรที่กำหนดไว้ล่วงหน้า)
เครื่องมือเพิ่มประสิทธิภาพ

ฉันจะได้ 12 Golfscript เช่นกันถ้าเพียง - 10แต่ผมไม่ได้ต้องออกจากพื้นที่ใน
Ingo Bürk

1
heh แม้แต่ภาษาที่สั้นที่สุดก็ยังมีที่มาที่สั้น : P
Optimizer

6

GNU dc , 14 ไบต์

การยืมเคล็ดลับ 9 ฐานที่ฉลาดของ Dennis :

9i[?A%nd]dxxxx

อินพุตจำนวนเต็มอ่านจาก STDIN หนึ่งรายการต่อบรรทัด

คำอธิบาย:

9i                # Set input radix to 9
  [     ]         # push a macro, defined thus:
   ?              #   read number from STDIN and push
    A             #   push literal 10
     %            #   calculate number mod 10
      n           #   print, with no newline
       d          #   duplicate macro
         d        # duplicate macro
          xxxx    # execute the macro 4 times    

เอาท์พุท:

$ for i in 57 23 99 45; do echo $i; done | dc ./combolock.dc
2101$ 
$ for i in 25 78 63 15; do echo $i; done | dc ./combolock.dc
3174$ 
$ 

คำตอบก่อนหน้า 18 ไบต์:

เพราะฉันคิดว่าฉันสามารถเข้าใกล้ภาษา "กอล์ฟ" ได้มากขึ้นด้วยสิ่งนี้ (แต่ไม่ได้):

[A?A~--A%n]dddxxxx

1
คุณสามารถบันทึกไบต์:9i[?A%nd]dxxxx
Dennis

@Dennis - ยอดเยี่ยม! ตอนนี้ฉันคอและคอพร้อม golfscript และ APL!
Digital Trauma

6

C 64 63 56 หรือ 61

หากอินพุตสามารถถูกไพพ์จากไฟล์

main(a){while(scanf("%d",&a)>0)putchar(48+(a-a/10)%10);}

หากอินพุตควรถูกพิมพ์ไปยัง stdin

i;main(a){for(;i++-4;putchar(48+(a-a/10)%10))scanf("%d",&a);}

อ่านตัวเลขสี่ตัวในลูปแล้วประมวลผลแต่ละค่าด้วยการลบตัวเลขตัวแรกออกจากค่าและพิมพ์โมดูโลผลลัพธ์ 10

ประหยัดขอบคุณความคิดเห็นต่างๆด้านล่างและใช้ putchar แทน printf


เย็น. คุณสามารถบันทึกเครื่องหมายจุลภาคโดยใส่สิ่งscanfภายนอกfor()เช่นนี้a,i;main(){for(;i++-4;printf("%d",(a-a/10)%10))scanf("%d",&a);}
ระดับแม่น้ำเซนต์

คุณสามารถบันทึก 2 ไบต์โดยใช้a*.9แทนa-a/10
rev

@stververill ชอบมัน เพ่งความสนใจไปที่การใส่ทุกอย่างลงในลูปที่ฉันพลาดไป
เล่นแร่แปรธาตุ

1
@AcidShout ขออภัย - ใช้งานไม่ได้ ตัวอย่างเช่น 78 * .9 = 70.2 ในขณะที่ 78 - 78/10 = 71 นอกจากนี้การใช้. 9 ยังส่งเสริมอาร์กิวเมนต์ให้เป็นสองเท่าดังนั้นฉันจึงไม่สามารถใช้ mod ได้
เล่นแร่แปรธาตุ

คุณสามารถบันทึกไม่กี่ไบต์โดยใช้การwhileวนซ้ำและประกาศaเป็นอาร์กิวเมนต์ของmain:main(a){while(scanf("%d",&a)>0)printf("%d",(a-a/10)%10);}
เดนนิส

5

Python 3, 64

ซื่อตรง

print(''.join([(i-i//10)%10 for i in map(int,input().split())]))

มันจะสั้นกว่านี้ถ้าฉันอนุญาตให้พิมพ์พูด[2, 1, 0, 1]แทน ( 46 ):

print([i%10-i//10 for i in map(int,input().split())])

คุณสามารถบันทึกบางส่วนโดยการโดยตรงแทนการใช้เป็นครั้งที่สองstr((i-i//10)%10) map()ฉันเริ่มต้นด้วยเครื่องกำเนิดไฟฟ้าเช่นกันสำหรับฉัน แต่พบว่าการforวนซ้ำจริงนั้นสั้นลง
DLosc

ใช่ขอบคุณสำหรับสิ่งนั้น!
Soham Chowdhury

เหตุใดคุณจึงใช้ list-comprehensions ใช้ genexps เพื่อประหยัด 2 print(''.join((i-i//10)%10for i in map(int,input().split())))ตัวอักษร: นอกจากนี้หากช่องว่างจะ allowd ในการส่งออกคุณสามารถหลีกเลี่ยงjoinและการใช้ print(*((i-i//10)%10for i in map(int,input().split())))tuple-เอาออก:
Bakuriu

ฉันเดาว่าคุณพูดถูก
Soham Chowdhury

4

C, 92

#define a(n) ,(10+v[n][1]-*v[n])%10
main(int c,char**v){printf("%d%d%d%d"a(1)a(2)a(3)a(4));}

อินพุตจาก commandline ลบรหัส ASCII แรกของแต่ละอาร์กิวเมนต์จากที่สองเพิ่ม 10 และใช้เวลา modulo 10

ฉันคิดว่านี่เป็นครั้งแรกที่ฉันเขียน a printfสี่%s และไม่มีเครื่องหมายจุลภาค (เครื่องหมายจุลภาคอยู่ใน #define.)


#define f scanf("%c%c ",&a,&b);putchar(48+(9*a+b)%10)ตามด้วยa,b;main(){f;f;f;f;}จะสั้นกว่า 18 ไบต์
เดนนิส

@Dennis นั่นเป็นการปรับปรุงที่ดี แต่โดยพื้นฐานแล้วมันเป็นโปรแกรมที่แตกต่างอย่างสิ้นเชิง ฉันคิดว่าถ้าใครโพสต์มันควรจะเป็นคุณไม่ใช่ฉัน ฉันไม่แน่ใจว่าscanfจำเป็นต้องใช้พื้นที่ในหรือไม่เนื่องจากscanfจะต้องแยกช่องว่างเป็นตัวคั่นเท่านั้น นักเล่นแร่แปรธาตุมีความคิดที่ดียิ่งขึ้นใน C. แต่ดูเหมือนว่าคุณจะชนะมันด้วยคำตอบ Cjam ของคุณ
ระดับแม่น้ำเซนต์

ใช่ฉันเริ่มด้วยการสังเกตว่าเว้นช่องว่างหลังจากa(n)นั้นฉันสังเกตเห็นว่าการวนprintf("%d%,...)รอบแมโครของคุณจะประหยัดสักสองสามไบต์และในที่สุดฉันก็ถูกพาไป ... - พื้นที่เป็นสิ่งจำเป็นตั้งแต่%cอ่านตัวละครใด ๆตัวอักษรดังนั้นในการทำงานที่สองมันจะเก็บ a32 - การตี CJam ด้วย C น่าจะพิสูจน์ได้ยาก printf()ที่มีอยู่แล้วตราบใดที่คำตอบของฉัน ...
เดนนิส

4

Java - 203 ไบต์

เพียงเพราะมีมีจะเป็นรายการ Java ผมเห็นเป็นโอกาสที่ดีที่จะให้รหัสนี้มีโอกาสเล่นกอล์ฟ (ส่งครั้งแรก)

class M{public static void main(String[] a){String r="";for(int i=0;i<4;i++){int l=Byte.valueOf(a[i].substring(1));int f=Byte.valueOf(a[i].substring(0,1));r+=(l-f<0)?l-f+10:l-f;}System.out.print(r);}}

หากมีที่ว่างสำหรับการปรับปรุงฉันยินดีที่จะรู้เกี่ยวกับพวกเขา ;-)


คุณสามารถค้นหา [เคล็ดลับ] และรับเคล็ดลับต่าง ๆ เกี่ยวกับการเล่นกอล์ฟเพื่อเริ่มต้น :)
เครื่องมือเพิ่มประสิทธิภาพ

เจ๋งขอบคุณ! การตรวจสอบจากเคล็ดลับช่วยให้ฉันโกน 13 ไบต์ :)
ซานเดอร์

3

Lua - 46 ตัวอักษร

while''do a,b=io.read(1,1,1)print((b-a)%10)end

อ่านครั้งละสามตัวอักษร (ให้ความเมตตาเล็ก ๆ ของการป้อนช่องว่างตอนท้าย) และถึงแม้ว่า a และ b จะเป็น string-y ... ba MAGICALUALY ช่วยให้พวกเขาเข้าใจถึงจำนวนเต็มของทารกที่ดีต่อสุขภาพ ทำการตรวจสอบรอบในขณะที่ทำการพิมพ์หรือไม่

ฉันจะเรียกใช้:


1
คุณสามารถให้ตัวอย่างอินพุต / เอาต์พุตข้อมูลได้หรือไม่ดูเหมือนไม่สามารถเรียกใช้บนIdeone
Rory McPerlroy

@ Harry12345 อ่าขอโทษด้วย อนาธิปไตยกอล์ฟกำลังตั้งความคิดของฉันเกี่ยวกับวิธีการใช้ stdinput ฉันอาจเขียนโค้ดได้ดีกว่า แต่ meh lua แย่มาก ฉันโพสต์ตัวอย่างการใช้งานโปรแกรม
AndoDaan

3

JavaScript ES6 - 53 43 ไบต์

f=n=>n.replace(/.. ?/g,a=>(1+a[1]-a[0])%10)

ฟังก์ชั่นตรงไปตรงมาเป็นธรรมใช้ regex เพื่อรับตัวเลข ลองที่http://jsfiddle.net/efc93986/1/ หากฟังก์ชั่นไม่ได้รับอนุญาตให้ใช้โปรแกรมสแตนด์อโลนที่ 52 ไบต์:

alert(prompt().replace(/.. ?/g,a=>(1+a[1]-a[0])%10))

ในขณะที่ ES6 ใช้งานได้กับ Firefox เท่านั้นรหัสต่อไปนี้ใช้ได้กับเบราว์เซอร์สมัยใหม่ที่ 70 ไบต์:

alert(prompt().replace(/.. ?/g,function(a){return(1+a[1]-a[0])%10}))

1+ฉันรักคุณ
Neil

1
คำถามที่บอกว่าจะคิดการป้อนข้อมูลที่ถูกต้องเพื่อให้คุณสามารถใช้แทน...? /\d+ ?สามารถเว้นช่องว่างหลังการส่งคืนได้ นอกจากนี้เนื่องจากไม่ได้ระบุ I / O ที่เฉพาะเจาะจงคุณควรจะสามารถใช้ฟังก์ชั่นได้
เดนนิส

1
a-a[0]แทนที่จะ1+a[1]-a[0]ทำงานได้ดี
เดนนิส

2

Python 2 - 33 ไบต์

for i in input():print(i-i/10)%10

ยอมรับอินพุตผู้ใช้ที่คั่นด้วยจุลภาค เช่นการป้อนข้อมูล:

29,26, 31, 88

เอาท์พุท:

7
4
8
0

หากจำเป็นต้องใช้เอาต์พุตเพื่อจับคู่ตัวอย่างทั้งหมดจะยาวกว่ามาก 47 ไบต์:

print"%d"*4%tuple((i-i/10)%10 for i in input())

input()ไม่ทำงานในล่าม Python 2 ของฉัน
Soham Chowdhury

@SohamChowdhury คุณใช้เครื่องหมายจุลภาคหรือไม่
feersum

2
โอ้ไม่ฉันไม่ได้ มันใช้งานได้แล้ว ในบันทึกด้านข้างฉันคิดว่าคุณจำเป็นต้องใช้อินพุตที่คั่นด้วยช่องว่างตามข้อกำหนด
Soham Chowdhury

3
ฉันเห็นด้วยว่าการป้อนข้อมูลควรมีการ จำกัด พื้นที่
Rory McPerlroy

2

APL, 14

10|{--/⍎¨⍕⍵}¨⎕

คำอธิบาย
ใช้ข้อมูลจากหน้าจอ ค่าที่คั่นด้วยช่องว่างจะถูกแยกวิเคราะห์เป็นอาร์เรย์
{...}¨สำหรับแต่ละหมายเลขให้ป้อนเข้าสู่ฟังก์ชัน
⍎¨⍕⍵ใช้อาร์กิวเมนต์สร้างอาร์เรย์ของตัวเลข
--/คำนวณหน่วยลบด้วยหลักสิบ
10|mod 10


1
นี้อาจจะเป็น 14 ตัว แต่ก็เป็น 24 ไบต์
Ingo Bürk

@ IngoBürkcodegolf.stackexchange.com/questions/2078/
TwiNight

แต่สำหรับรหัสกอล์ฟเรานับใน UTF-8 ไม่ใช่ชุดอักขระพิเศษบางอย่าง นั่นเป็นเพียงช่องโหว่และสามารถถูกทำร้ายได้ง่ายมาก
Ingo Bürk

1
@ IngoBürkตามmeta.codegolf.stackexchange.com/a/961/6972คำตอบสามารถเข้ารหัสในการเข้ารหัสใด ๆ เว้นแต่ว่ารัฐ OP เป็นอย่างอื่น มีเพจรหัส IBM สำหรับอักขระ APL ซึ่งเป็นการแมปแบบไบต์เดียวซึ่งเป็นสิ่งที่ Dyalog ใช้ในการใช้งานก่อน Unicode 3.0 หากคุณยืนยันใน Unicode จะเกิดอะไรขึ้นถ้าฉันคิดค้นภาษาใหม่ที่ใช้อักขระที่ไม่ใช่ Unicode คุณจะนับจำนวนไบต์เป็นอย่างไร
TwiNight

ฉันสาบานได้ว่าค่าเริ่มต้นคือ UTF-8 14 ไบต์เป็นแล้ว
Ingo Bürk

2

J - 20 15

รูปแบบที่ไม่ใช่คำกริยา (เป็นคำสั่งแทนที่จะเป็นนิยามของฟังก์ชั่น) มีความยาว 5 ตัวอักษร

10|-~/|:10#.inv

รูปแบบคำกริยาซึ่งเป็นรถไฟที่ดี:

10|[:-~/[:|:10#.inv]

คำกริยานี้ใช้กับอินพุตตัวอย่าง:

   10|-~/|:10#.inv 57 23 99 45
2 1 0 1
   10|-~/|:10#.inv 25 78 63 15
3 1 7 4

rotd =: 10|[:-~/[:|:10#.inv] NB. verb form

   rotd 25 78 63 15
3 1 7 4
   rotd 57 23 99 45
2 1 0 1

2

Haskell 60 58

main=interact$show.map((\x->mod(x-x`div`10)10).read).words

ตัวเลขตัวอักษรเดียวซึ่งเป็นตัวซวยตัวจริงในสนามกอล์ฟ Haskell


2

Perl: 38 40

print abs($_-int$_/10)%10for split" ",<>

เอาท์พุท:

% perl code.pl
57 23 99 45
2101

25 78 63 15                                     
3174

1
1. ขีดล่างเป็นไวยากรณ์ของ markdown ดังนั้นโค้ดของคุณจึงเกิดความสับสนเล็กน้อย เพื่อป้องกันสิ่งนี้, เยื้องรหัสที่มีช่องว่างสี่ 2. absไม่จำเป็น x - x/10ไม่สามารถลบ 3. หากคุณใช้แฟล็ก-040pe(โดยปกติจะนับเป็น 5 ไบต์) เพื่อวนซ้ำอินพุตที่คั่นด้วยช่องว่างคุณสามารถย่อโค้ดของคุณให้เล็กลง$_=($_-int$_/10)%10ได้ 4. ถ้าคุณต้องการที่จะหลีกเลี่ยงธงบรรทัดคำสั่งคุณยังสามารถประหยัดไม่กี่ไบต์โดยการตั้งค่าและลบการเรียกร้องให้$/=$; split
เดนนิส

1

Ruby, 35 ไบต์

$*.map{|n|a,b=n.bytes;$><<(b-a)%10}

คำอธิบาย

อินพุตถูกใช้เป็นอาร์กิวเมนต์บรรทัดคำสั่ง String#bytesส่งคืน Array of Integers (รหัสอักขระ ASCII) เฉพาะความแตกต่างระหว่างรหัสตัวอักษรตัวสุดท้ายและตัวแรกเท่านั้นที่มีความสำคัญไม่ใช่จำนวนเต็ม



1

C ++ 118

int main()
{
int a,b,c;
for(int i=0; i<4; i++)
{
cin>>a;
b=a/10;
a=a%10;
c=a-b;
if(c<0)c+=10;
cout<<c;
}
}

1. ไม่แน่ใจเรื่องการคอมไพเลอร์อื่น ๆ แต่ต้อง GCC #include<iostream>และstd::ก่อนและcin cout2. a=a%10คุณไม่จำเป็นต้องมีเงื่อนไขถ้าคุณไม่ใช้ 3. คุณไม่จำเป็นต้องใช้ตัวแปรbและclinefeeds และ (พร้อมการดัดแปลงเล็กน้อย) วงเล็บเหลี่ยมล้อมรอบสำหรับลูป
เดนนิส

1
@SeanD: โปรดอย่าอนุมัติการแก้ไขที่แก้ไขรหัส ในกรณีนี้การแก้ไขทำให้คำตอบไม่ถูกต้อง นอกจากนี้ยังลบบรรทัดแรกซึ่งควรมีอยู่ในคำตอบทั้งหมด
เดนนิส

1
(CC @TeunPronk)
Dennis

@Dennis โดยปกติคำตอบในเว็บไซต์นี้จะไม่รวมบรรทัดตัวประมวลผลล่วงหน้า ฉันละเว้นบรรทัด#include<iostream>และusing namespace std;
bacchusbeale

ฉันรู้ว่ามักจะไม่รวมอยู่ในจำนวนไบต์ แต่ฉันคิดว่าพวกเขาควรจะอยู่ในคำตอบ
เดนนิส

1

PHP - 90 ตัวอักษร

คิดว่าฉันควรลองเล่นโค๊กแบบกอล์ฟนี่คือความพยายามครั้งแรกของฉัน - อาจจะเล่นกอล์ฟได้มากกว่านี้

<?php $a=array(57,23,99,45);foreach($a as$b){echo abs(substr($b,0,1)-substr($b,1,1)%10);}

58 ตัวอักษร (ความเอื้อเฟื้อของ Ismael Miguel)

for($i=0,$a=$_GET[n];$i<8;)echo abs($a[$i++]-$a[$i++]);

เข้าถึงไฟล์โดยใช้

file.php?n=57239945

ลองใช้รหัสนี้: <? for($i=0;$i<4;)echo abs($_GET[n][$i]%10);ซึ่งมีความยาว 44 ตัวอักษร file.php?n[]=xx&n[]=yy&n[]=xy&n[]=yxเข้าถึงได้จากเบราว์เซอร์ที่ใช้ (รหัสที่ยังไม่ทดลอง)
Ismael Miguel

ใช้ความคิดที่ดี$_GETแต่แสดง 57% 10 และฉันต้องการ (5-7)% 10
Rory McPerlroy

ลองอันนี้: <? for($i=0,$a=$_GET[n];$i<4;++$i)echo abs($a[$i][0]-$a[$i++][1]%10);. น่าเศร้าที่มีความยาว 65 ไบต์ (ลืมการ$iเพิ่มขึ้นของอันล่าสุด) หรือคุณสามารถลอง<? for($i=0;$i<8;)echo abs($_GET[n][$i++]-$_GET[n][$i++]%10);ใช้เบราว์เซอร์โดยใช้file.php?n[]=x&n[]=y&n[]=x&n[]=y&n[]=x&n[]=y&n[]=x&n[]=yความยาว 61 ไบต์
Ismael Miguel

ใช่คนที่สองทำงานได้ต้องทำเช่น$_GET['n']นั้น แก้ไขคำตอบของฉันแล้ว
Rory McPerlroy

ก็ไม่จำเป็นต้องใช้ มันเป็นเพียงการเตือน นั่นเป็นสิ่งที่ดีสำหรับเว็บไซต์นี้ <? for($i=0,$a=$_GET[n];$i<8;)echo abs($a[$i++]-$a[$i++]);แต่ลองนี้: %10จะไม่ได้ผลและเป็นหนึ่งในนี้ก็ดูดีกว่า file.php?n[]=xyxyxyxyนอกจากนี้คุณสามารถเข้าถึงได้โดยใช้ วิธีนี้มีความยาว 58 ไบต์
Ismael Miguel

0

Python 3, 60

for x in input().split():print(-eval('-'.join(x))%10,end='')

อินพุตและเอาต์พุตตรงตามที่ระบุแม้ว่าจะไม่พิมพ์บรรทัดใหม่ที่ต่อท้าย เทคนิคสองอย่างที่น่าสนใจที่นี่: 1) การแทนที่การโทรสองครั้งint()ด้วยการโทรเพียงครั้งเดียวeval()และ 2) การใช้join()เพื่อรับa-bแล้วปฏิเสธb-aตามที่ต้องการ โชคดีที่ตัวดำเนินการ modulo ของ Python ให้ค่าเป็นบวกแม้ว่าอาร์กิวเมนต์แรกจะเป็นค่าลบ!


ทำไม downvote นี้ มันใช้งานได้ดีอย่างสมบูรณ์แบบ (Btw, eval('-'.join(x))เคล็ดลับยอดเยี่ยม.)
flornquake

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