역사 숙제 도우미


12

나의 역사 읽기와 필기를 할 때, 나는이 모든 긴 날짜를 쓰는 데 지칠 수는 없습니다. – 1784는 6 개의 전체 연필 리프트입니다! 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
@JonathanAllan, 그렇습니다. 입력은 음이 아닌 정수입니다
Daniel

1
@Qwertiy, 정말로.
Daniel

2
1914-8WWI입니다. 이제 내 브라우니를 줘!
Outgolfer Erik

답변:



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 Erik

3

자바 스크립트 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
카레 ( x=>y=>)를 사용하여 바이트를 저장하십시오.
TheLethalCoder

1

Dyalog APL, 29 바이트

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

온라인으로 사용해보십시오!

어떻게?

⍺,'-' -첫해 + , -

    =x←⍕⍵ -2 년차 형식 비교

    ((-⍴x)↑⍕⍺) -왼쪽에서 공백으로 채워진 첫해

    ⌈\~ -결과를 부정하고 첫 번째 후 모두 1로 표시하십시오.

x/⍨ -표시된 모든 위치에서 2 년차


1

망막 , 34 바이트

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

온라인으로 사용해보십시오! 링크에는 테스트 사례가 포함됩니다. 밸런싱 그룹과 단어 경계는 접두사를 일치시키기 전에 두 숫자의 길이가 동일하도록합니다. 그렇지 않은 경우 단어 경계는 2 년 초에 일치하므로 쉼표가 대시로 변경됩니다.


1

파이썬 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-99"대신 "100-199"를 반환합니다.
Chas Brown

@ChasBrown Dang, 당신이 맞아요. 코드를 이전 반복으로 롤백했습니다.이 경우를 처리합니다.
Arnold Palmer

0

파이썬 2, 127 바이트

나는 아직도 이것에 익숙하지 않기 때문에 같은 언어로 다른 대답을하는 것이 괜찮은 지 모르겠습니다. 다른 사람들의 게시물에 댓글을 달 수 없기 때문에 여기서 기회를 얻었습니다.

  • 입력을 정수에서 문자열로 변경할 수 있습니까? 그 결과 약 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

하스켈 , 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 yx숫자보다 적은 자릿수가 있으면 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 바이트

Zacharý 덕분에 -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ý
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.