ประวัติผู้ช่วยทำการบ้าน


12

การอ่านประวัติและจดบันทึกของฉันฉันอดไม่ได้ที่จะเขียนวันที่ยาว ๆ เหล่านี้ทั้งหมด –– 1784 คือการยกดินสอทั้งหกตัว! jǝǝz!

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

ฉันจะร่นวันได้อย่างไร

ตลกดีที่คุณควรถาม มันค่อนข้างง่าย:

  1. ใช้จำนวนเต็มสองจำนวนเป็นอินพุตตามลำดับที่คุณต้องการ ( (smallest, biggest)หรือ(biggest, smallest))
  2. ใช้จำนวนที่มากขึ้นของทั้งสองและใช้เฉพาะส่วนที่ไม่ได้อยู่ในจำนวนที่น้อยกว่า
    ตัวอย่างเช่นที่กำหนดให้2010, 2017ย่อ2017ให้สั้นลง-7เนื่องจาก201_เป็นทั้งที่ตำแหน่งหลักเดียวกัน
  3. พิมพ์หรือคืนค่าจำนวนที่น้อยกว่าตามด้วยเครื่องหมายขีดจากนั้นจำนวนที่สั้นกว่านั้น

ตัวอย่างเช่น:

Bonus brownies for you if you figure out these dates' significance :)
1505, 1516 -> 1505-16
1989, 1991 -> 1989-91
1914, 1918 -> 1914-8
1833, 1871 -> 1833-71
1000, 2000 -> 1000-2000
1776, 2017 -> 1776-2017
2016, 2016 -> 2016-

These dates lack significance :(
1234567890, 1234567891 -> 1234567890-1
600, 1600 -> 600-1600
1235, 1424 -> 1235-424
600, 6000 -> 600-6000

4
1914-18หรือ1914-8?
Anders Kaseorg

3
600, 6000 -> 600-6000?
Qwertiy

1
@JanathanAllan ใช่ถูกต้อง อินพุตเป็นจำนวนเต็มที่ไม่ใช่ค่าลบ
Daniel

1
@Qertert แน่นอน
แดเนียล

2
1914-8คือ WWI ตอนนี้ลองบราวนี่ของฉัน!
Erik the Outgolfer

คำตอบ:



4

เยลลี่ ,  17  16 ไบต์

DUµn/TṪṁ@Ṫ,j”-FṚ

โปรแกรมเต็มรูปแบบรับรายการปีfrom, toและพิมพ์ผลลัพธ์

ลองออนไลน์! หรือดูชุดทดสอบ

อย่างไร?

DUµn/TṪṁ@Ṫ,j”-FṚ - Main link: list of years [from, to]    e.g [1833,1871]
D                - convert to decimals                        [[1,8,3,3],[1,8,7,1]]
 U               - upend (to cater for differing lengths)     [[3,3,8,1],[1,7,8,1]]
  µ              - monadic chain separation, call that V
    /            - reduce V with:
   n             -   not equal?                               [1,1,0,0]
     T           - truthy indices                             [1, 2]
      Ṫ          - tail                                       2
         Ṫ       - tail V (pop from & modify V)               [1,7,8,1]
       ṁ@        - mould (swap @rguments) V like that length  [1,7]
          ,      - pair that with (the modified) V            [[1,7],[[3,3,8,1]]
            ”-   - literal '-' character
           j     - join                                       [1,7,'-',[3,3,8,1]]
              F  - flatten                                    [1,7,'-',3,3,8,1]
               Ṛ - reverse                                    [1,8,3,3,'-',7,1]
                 - implicit print                             1833-71

ตอนแรกผมคิดว่าผม outgolfed นี้ ... แล้วแช่ง[600, 6000]ปรากฏ และดูเหมือนว่าสิ่งนี้ยังไม่ได้รับการยืนยัน
Erik the Outgolfer

3

Javascript ES6, 59 57 ตัวอักษร

(x,y)=>(x+'-'+y).replace(x*10>y?/^((.*).*-)\2/:/()/,"$1")

ทดสอบ:

f=(x,y)=>(x+'-'+y).replace(x*10>y?/^((.*).*-)\2/:/()/,"$1")

console.log(`1505, 1516 -> 1505-16
1989, 1991 -> 1989-91
1914, 1918 -> 1914-8
1833, 1871 -> 1833-71
1000, 2000 -> 1000-2000
1776, 2017 -> 1776-2017
2016, 2016 -> 2016-
1234567890, 1234567891 -> 1234567890-1
600, 1600 -> 600-1600
1235, 1424 -> 1235-424`.split`
`.map(t => t.match(/(\d+), (\d+) -> (.*)/)).every(([m,x,y,key]) => f(x,y)===key || console.log(x,y,key,f(x,y))))
console.log(f(600,6000))


เพียงแค่ลอง(x+'-'+y)?
tsh

f (180, 1600) ->?
tsh

1
ใช้ currying ( x=>y=>) เพื่อบันทึกไบต์
TheLethalCoder

1

Dyalog APL ขนาด 29 ไบต์

{⍺,'-',x/⍨⌈\~((-⍴x)↑⍕⍺)=x←⍕⍵}

ลองออนไลน์!

อย่างไร?

⍺,'-' - ปีแรก + , -

    =x←⍕⍵ - เปรียบเทียบปีที่สองที่จัดรูปแบบ

    ((-⍴x)↑⍕⍺) - ถึงปีแรกที่มีช่องว่างจากซ้าย

    ⌈\~ - ลบล้างผลลัพธ์และทำเครื่องหมาย 1s ทั้งหมดหลังจากครั้งแรก

x/⍨ - ใช้ปีที่สองในตำแหน่งที่ทำเครื่องหมายไว้ทั้งหมด


1

เรติน่า 34 ไบต์

(.*)((.)*),\1((?<-3>.)*)\b
$1$2-$4

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


1

Python 2 , 102 ไบต์

lambda s,n:`s`+'-'+[[`n`[i:]for i in range(len(`s`)+1)if `n`[:i]==`s`[:i]][-1],`n`][len(`n`)>len(`s`)]

ลองออนไลน์!

ฉันรู้สึกว่าจะต้องมีวิธีที่ดีกว่าในการทำเช่นนี้เพราะดูเหมือนว่า verbose จริงๆ การใช้การประเมินตัวแปรในทางที่ผิดอย่างมากนี้ใช้งานได้เนื่องจากเราไม่สามารถใช้สตริงเป็นอินพุตได้


a = 100, b = 199 ส่งคืน "100-199" แทน "100-99"
Chas Brown

@ChasBrown Dang คุณพูดถูก ฉันย้อนกลับรหัสของฉันไปที่การทำซ้ำก่อนหน้านี้ซึ่งดูแลกรณีนี้
Arnold Palmer

0

Python 2, 127 ไบต์

ฉันยังใหม่กับเรื่องนี้ดังนั้นฉันจึงไม่รู้ว่าจะตอบคำถามอื่นในภาษาเดียวกันได้หรือไม่ เนื่องจากฉันไม่สามารถแสดงความคิดเห็นในโพสต์ของคนอื่น ๆ ฉันจึงใช้โอกาสนี้

  • อนุญาตให้เปลี่ยนอินพุตจากจำนวนเต็มเป็น String หรือไม่ สาเหตุที่จะช่วยฉันประมาณ 10 ไบต์
  • คำตอบของ Arnlod Parmers มีข้อผิดพลาดในปี 1989, 1991 (ระหว่างที่ฉันโพสต์ข้อความนี้) ขอบคุณสำหรับสิ่งที่ `` เคล็ดลับการประเมินผลท่อ (มันช่วยฉันเป็นไบต์)!
def f(s,b):
 s=`s`+'-'
 if len(`b`)>=len(s):return s+`b`
 for i in range(len(`b`)):
    if s[i]!=`b`[i]:return s+`b`[i:]
 return s

ลองออนไลน์!

สิ่งที่ฉันทำคือฉันเปรียบเทียบแต่ละหลักเดียวจากทั้งสองครั้งและหากตัวเลขที่ใหญ่กว่านั้นแตกต่างกันไปฉันพิมพ์จำนวนที่น้อยลงบวกส่วนที่เหลือของตัวเลขที่ใหญ่กว่า

ถ้ามีคนช่วยฉันตีกอล์ฟในบรรทัดที่สามฉันจะประหยัดได้มากกว่า 30 ไบต์ ฉันใช้มันเพื่อจัดการกับกรณีของ 600,6000 ที่ตัวเลขมีค่าเท่ากัน แต่ไม่ยาวเท่ากัน


ใช่มันก็โอเคที่จะตอบคำถามเดียวกันในหลายภาษาและคุณได้รับอนุญาตให้ป้อนเป็นสตริง
geokavel

0

Haskell , 143 ไบต์

g x y=h(show x)(show y)
h x y=x++"-"++if length x<length y then y else foldl(\a(c,d)->if a==[]then if c==d then[]else[d]else a++[d])[](zip x y)

ลองออนไลน์!

smallest biggest อินพุต (จำนวนเต็ม)

if length x<length y then yหมายความว่าหากxมีตัวเลขน้อยกว่าyส่วนทั่วไปจะเป็นโมฆะ อื่นเราเก็บตัวเลขของyจากตัวเลขที่แตกต่างกันแรก



0

Lisp ทั่วไป, 120 ไบต์

(lambda(s b &aux(d(#1=format()"~a"b)))(#1#()"~a-~a"s(if(<=(* s 10)b)b(subseq d(or(mismatch d(#1#()"~a"s))(length d))))))

ลองออนไลน์!

เล็กที่สุดที่ใหญ่ที่สุด

Ungolfed:

(defun f(s b &aux (d (format () "~a" b)))   ; s and b parameters, d string from s
  (format () "~a-~a" s                     ; print first number, then -, then abbreviation
      (if (<= (* s 10) b)                  ; if b is too large do not abbreviate
          b
          (subseq d (or (mismatch d (format () "~a" s)) ; else find first mismatch
                        (length d))))))    ; then extract the last part from mismatch
                                           ; or nothing if they are equal

0

C ++, 285 271 ไบต์

-14 ไบต์ขอบคุณZacharý

#include<iostream>
#include<string>
#define S s.size()
#define R r.size()
using namespace std;void h(int a,int b){auto r=to_string(a),s=to_string(b);if(R>S)s=string(R-S,' ')+s;if(S>R)r=string(S-R,' ')+r;int i=0;for(;i<R;++i)if(r[i]!=s[i])break;cout<<a<<'-'<<s.substr(i);}

รหัสสำหรับการทดสอบ:

std::vector<std::pair<int, int>> test = {
    {1505,1516},
    {1989,1991}, //End of the cold war
    {1914,1918}, //First world war start and end
    {1833,1871},
    {1000,2000}, //2000 = Y2K bug, 1000 is... well... Y1K bug ? :)
    {1776,2017}, //US constitution signed the 4th july, French elections & year of the C++ 17 standard
    {2016,2016}, //US elections
    {1234567890,1234567891},
    {600,1600},
    {1235,1424},
    {600,6000}
};

for (auto&a : test) {
    h(a.first, a.second);
    std::cout << '\n';
}

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