История домашнее задание помощник

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?
Андерс Касеорг
3
600, 6000 -> 600-6000?
Qwertiy
1
@JonathanAllan, да, все верно.
Даниил
1
@ Qwertiy, действительно.
Даниэль
2
1914-8это первая мировая война Теперь дай мне мои пирожные!
Эрик 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
Джонатан Аллан
источник
Сначала я думал, что перехитрил это ... потом [600, 6000]появился черт . И, кажется, это было недооценено.
Эрик 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))

Qwertiy
источник
Просто попробовать (x+'-'+y)?
TSH
f (180, 1600) ->?
TSH
1
Используйте curry ( x=>y=>), чтобы сохранить байт.
TheLethalCoder
1

Дьялог АПЛ, 29 байт

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

Попробуйте онлайн!

Как?

⍺,'-' - первый год + , -

    =x←⍕⍵ - сравнить второй год в формате

    ((-⍴x)↑⍕⍺) - до первого года, дополненного пробелами слева

    ⌈\~ - отменить результат и отметить все 1 после первого

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

Попробуйте онлайн!

Я чувствую, что должен быть лучший способ сделать это, так как это кажется действительно многословным. Чрезвычайное злоупотребление `` оценкой переменных для этого работает, так как мы не можем принимать строки в качестве входных данных.

Арнольд Палмер
источник
a = 100, b = 199 возвращает «100-199» вместо «100-99».
Час Браун
@ChasBrown Dang, ты прав. Я откатил свой код до предыдущей итерации, которая занимается этим делом.
Арнольд Палмер
0

Python 2, 127 байт

Я все еще новичок в этом, поэтому я не знаю, можно ли разместить другой ответ на том же языке. Поскольку я не могу комментировать посты других людей, я рискую здесь.

  • Разрешено ли изменять ввод с Integer на String? Потому что это спасло бы меня около 10 байтов.
  • Ответ Арнлода Пармерса был ошибочным в 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, где цифры равны, но не одинаковой длины.

Саймон
источник
Да, это нормально, чтобы ответить на один и тот же вопрос на нескольких языках, и вы можете принять ввод как String.
геокавель
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от первой другой цифры.

jferard
источник
0

Common 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
Renzo
источник
0

С ++, 285 271 байт

-14 байт благодаря Захари

#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';
}
HatsuPointerKun
источник
Вы можете сохранить несколько байтов, using namespace std;удалив Tмакрос.
Захари