Pomocnik w odrabianiu lekcji historii

12

Czytając historię i robiąc notatki, nie mogę się zmęczyć pisaniem długich dat - 1784 to sześć całych ołówków! jǝǝz!

Jak widać, ja - lubię większość plakatów z wyzwaniami na tej stronie - jestem leniwy, jeśli chodzi o pisanie. Dlatego proszę o pomoc w skróceniu niektórych dat. Oczywiście twoje rozwiązanie musi być tak krótkie, jak to możliwe, ponieważ moja ręka jest już zmęczona pisaniem wpisywania przypadków testowych.

Jak skrócić randkę?

Zabawne, że powinieneś zapytać. To dość proste:

  1. Weź dwie liczby całkowite jako dane wejściowe w dowolnej kolejności ( (smallest, biggest)lub (biggest, smallest)).
  2. Weź większą z dwóch liczb i weź tylko część, której nie ma w mniejszej liczbie.
    Na przykład, podając 2010, 2017, skróć 2017do, -7ponieważ 201_jest w obu w tych samych cyfrach.
  3. Wydrukuj lub zwróć mniejszą liczbę, następnie myślnik, a następnie skróconą większą liczbę.

Na przykład:

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
źródło
4
1914-18czy 1914-8?
Anders Kaseorg
3
600, 6000 -> 600-6000?
Qwertiy
1
@JonathanAllan, tak to prawda. Dane wejściowe to tylko nieujemne liczby całkowite
Daniel
1
@ Qwertiy, rzeczywiście.
Daniel
2
1914-8jest I wojna światowa. Teraz daj mi ciasteczka!
Erik the Outgolfer,

Odpowiedzi:

4

Galaretka ,  17  16 bajtów

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

Pełny program z listą lat from, toi wydrukowaniem wyniku.

Wypróbuj online! lub zobacz pakiet testowy .

W jaki sposób?

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
źródło
Na początku myślałem, że to wyolbrzymiłem ... a potem do cholery [600, 6000]. I wydaje się, że zostało to niedocenione.
Erik the Outgolfer,
3

JavaScript ES6, 59 57 znaków

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

Test:

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
źródło
Po prostu spróbuj (x+'-'+y)?
tsh
f (180, 1600) ->?
tsh
1
Użyj currying ( x=>y=>), aby zapisać bajt.
TheLethalCoder
1

Dyalog APL, 29 bajtów

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

Wypróbuj online!

W jaki sposób?

⍺,'-' - pierwszy rok + , -

    =x←⍕⍵ - porównaj sformatowany drugi rok

    ((-⍴x)↑⍕⍺) - do pierwszego roku wypełnione odstępami od lewej

    ⌈\~ - zaneguj wynik i zaznacz wszystkie 1 po pierwszym

x/⍨ - weź drugi rok na wszystkich zaznaczonych pozycjach

Uriel
źródło
1

Retina , 34 bajty

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

Wypróbuj online! Link zawiera przypadki testowe. Grupa równoważąca i granica słowa zapewniają, że obie liczby są tej samej długości przed dopasowaniem prefiksu. Jeśli nie, granica słów pasuje do początku drugiego roku, więc wszystko, co się dzieje, to przecinek, który zmienia się w myślnik.

Neil
źródło
1

Python 2 , 102 bajty

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

Wypróbuj online!

Wydaje mi się, że musi istnieć lepszy sposób, aby to zrobić, ponieważ wydaje się to bardzo gadatliwe. Ekstremalne nadużywanie `` oceny zmiennych, aby to zadziałało, ponieważ nie możemy brać ciągów jako danych wejściowych.

Arnold Palmer
źródło
a = 100, b = 199 zwraca „100–199” zamiast „100–99”.
Chas Brown
@ChasBrown Dang, masz rację. Wycofałem swój kod do poprzedniej iteracji, która zajmuje się tą sprawą.
Arnold Palmer
0

Python 2, 127 bajtów

Nadal jestem w tym nowy, więc nie wiem, czy można wstawić inną odpowiedź w tym samym języku. Ponieważ nie mogę jeszcze komentować postów innych ludzi, ryzykuję tutaj.

  • Czy wolno zmieniać dane wejściowe z Integer na String? Bo to zaoszczędziłoby mi około 10 bajtów.
  • Odpowiedź Arnloda Parmersa ma błąd w 1989, 1991. (w czasie, gdy to piszę). Dziękuję ci za `` sztuczkę ewaluacyjną, która (uratowała mi bajt)!
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

Wypróbuj online!

Robię to, porównując każdą cyfrę z obu czasów i jeśli większa jest inna, drukuję mniejszą liczbę plus resztę większej.

Gdyby ktoś mógł mi pomóc zagrać w trzecią linię, zaoszczędziłbym ponad 30 bajtów. Zaimplementowałem go tylko do obsługi przypadku 600,6000, gdzie cyfry są równe, ale nie tej samej długości.

Szymon
źródło
Tak, można odpowiedzieć na to samo pytanie w wielu językach, a dane wejściowe można traktować jako ciąg znaków.
geokavel
0

Haskell , 143 bajty

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)

Wypróbuj online!

smallest biggest input (liczby całkowite).

if length x<length y then yoznacza, że ​​jeśli xma mniej cyfr niż ywtedy wspólna część jest nieważna. W przeciwnym razie przechowujemy cyfry yod pierwszej innej cyfry.

Jferard
źródło
0

Common Lisp, 120 bajtów

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

Wypróbuj online!

Najmniejszy, największy.

Nie golfowany:

(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
źródło
0

C ++, 285 271 bajtów

-14 bajtów dzięki Zacharýowi

#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);}

Kod do testowania:

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
źródło
Możesz zapisać kilka bajtów, using namespace std;usuwając Tmakro.
Zacharý