Penolong pekerjaan rumah sejarah

12

Melakukan sejarah membaca dan mencatat, saya tidak bisa tidak bosan menulis semua tanggal panjang ini –– 1784 adalah enam lift pensil! jǝǝz!

Seperti yang Anda lihat, saya –seperti kebanyakan poster penantang di situs ini –– malas ketika menulis sesuatu. Karena itu, saya meminta Anda untuk membantu saya mempersingkat beberapa kencan. Tentu saja, solusi Anda harus sesingkat mungkin karena tangan saya sudah lelah menulis mengetik kasus uji.

Bagaimana saya mempersingkat kencan?

Nah lucu kamu harus bertanya. Ini cukup sederhana:

  1. Ambil dua bilangan bulat sebagai input dalam urutan apa pun yang Anda inginkan ( (smallest, biggest)atau (biggest, smallest)).
  2. Ambil yang lebih besar dari dua angka, dan ambil hanya bagian yang tidak dalam jumlah yang lebih kecil.
    Misalnya, diberikan 2010, 2017, disingkat 2017menjadi -7karena 201_berada di keduanya di tempat digit yang sama.
  3. Cetak atau kembalikan nomor yang lebih kecil, diikuti dengan tanda hubung dan kemudian nomor yang lebih pendek.

Sebagai contoh:

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
Daniel
sumber
4
1914-18atau 1914-8?
Anders Kaseorg
3
600, 6000 -> 600-6000?
Qwertiy
1
@ Jonathan Allan, ya itu benar. Input hanya bilangan bulat negatif
Daniel
1
@ Qwertiy, memang.
Daniel
2
1914-8adalah WWI. Sekarang berikan browniesku!
Erik the Outgolfer

Jawaban:

4

Jelly ,  17  16 byte

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

Program lengkap yang mencatat daftar tahun from, todan mencetak hasilnya.

Cobalah online! atau lihat test suite .

Bagaimana?

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
Jonathan Allan
sumber
Pada awalnya saya pikir saya mengungguli ini ... lalu sialan [600, 6000]muncul. Dan sepertinya ini telah diremehkan.
Erik the Outgolfer
3

Javascript ES6, 59 57 karakter

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

Uji:

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

Qwertiy
sumber
Coba saja (x+'-'+y)?
tsh
f (180, 1600) ->?
tsh
1
Gunakan currying ( x=>y=>) untuk menyimpan byte.
TheLethalCoder
1

Dyalog APL, 29 byte

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

Cobalah online!

Bagaimana?

⍺,'-' - tahun pertama + , -

    =x←⍕⍵ - bandingkan tahun kedua yang diformat

    ((-⍴x)↑⍕⍺) - ke tahun pertama yang dipenuhi ruang dari kiri

    ⌈\~ - Meniadakan hasil dan menandai semua 1 setelah yang pertama

x/⍨ - ambil tahun kedua di semua posisi yang ditandai

Uriel
sumber
1

Retina , 34 byte

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

Cobalah online! Tautan termasuk kasus uji. Grup balancing dan batas kata memastikan bahwa kedua angka memiliki panjang yang sama sebelum awalan dicocokkan. Jika tidak, maka batas kata cocok dengan di awal tahun kedua, jadi yang terjadi hanyalah koma berubah menjadi tanda hubung.

Neil
sumber
1

Python 2 , 102 byte

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

Cobalah online!

Saya merasa harus ada cara yang lebih baik untuk melakukan ini karena tampaknya sangat bertele-tele. Penyalahgunaan ekstrim dari evaluasi `` variabel untuk ini berfungsi karena kami tidak dapat mengambil string sebagai input.

Arnold Palmer
sumber
a = 100, b = 199 menghasilkan "100-199" bukan "100-99".
Chas Brown
@ ChasBrown Dang, kau benar. Saya memutar kembali kode saya ke iterasi sebelumnya, yang menangani kasus ini.
Arnold Palmer
0

Python 2, 127 byte

Saya masih baru dalam hal ini, jadi saya tidak tahu apakah boleh menempatkan jawaban lain dalam bahasa yang sama. Karena saya tidak dapat mengomentari kiriman orang lain, namun saya mengambil risiko di sini.

  • Apakah diizinkan mengubah input dari Integer ke String? Karena itu akan menyelamatkan saya sekitar 10 byte.
  • Jawaban Arnlod Parmers memiliki kesalahan pada 1989, 1991. (selama ini saya memposting ini). Terima kasih untuk trik evaluasi `` tho (itu menyelamatkan saya satu byte)!
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

Cobalah online!

Apa yang saya lakukan adalah, saya membandingkan setiap digit dari kedua kali dan jika yang lebih besar bervariasi saya mencetak angka yang lebih kecil ditambah sisanya yang lebih besar.

Jika seseorang bisa membantu saya bermain golf di baris ketiga saya akan menghemat seperti 30+ byte. Saya hanya menerapkannya untuk menangani kasus 600.6000 di mana angka-angkanya sama tetapi tidak sama panjangnya.

Simon
sumber
Ya, tidak apa-apa untuk menjawab pertanyaan yang sama dalam berbagai bahasa, dan Anda diizinkan untuk mengambil input sebagai String.
geokavel
0

Haskell , 143 byte

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)

Cobalah online!

smallest biggest input (bilangan bulat).

if length x<length y then yberarti bahwa jika xmemiliki digit lebih sedikit dari itu ymaka bagian yang umum tidak berlaku. Selain itu, kami menyimpan digit dari ydigit berbeda pertama.

jferard
sumber
0

Python 2 , 89 88 byte

lambda a,b:`a`+'-'+`b`[map(lambda c,d:(len(`a`)==len(`b`))*(c==d),`a`,`b*10`).index(0):]

Cobalah online!

Chas Brown
sumber
0

Gangguan Umum, 120 byte

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

Cobalah online!

Terkecil, Terbesar.

Tidak Disatukan:

(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
Renzo
sumber
0

C ++, 285 271 byte

-14 byte berkat 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);}

Kode untuk pengujian:

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';
}
HatsuPointerKun
sumber
Anda dapat menyimpan beberapa byte dengan using namespace std;dan menghapus Tmakro.
Zacharý