Помічник домашнього завдання з історії


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це Перша світова війна. Тепер дайте мені мої брауні!
Ерік Аутгольфер

Відповіді:



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]з'явився чорт . І, схоже, це було недооцінене.
Ерік Аутгольфер

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

Діалог 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`)]

Спробуйте в Інтернеті!

Я відчуваю, що повинен бути кращий спосіб зробити це, оскільки це здається багатослівним. Надзвичайно зловживання `` оцінкою змінних для цього працює, оскільки ми не можемо брати рядки як вхідні дані.


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

Лист звичайний, 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))))))

Спробуйте в Інтернеті!

Найменший, найбільший.

Безголівки:

(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 байт завдяки Захарі

#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ý
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.