历史作业助手


12

在阅读历史记录和做笔记时,我不禁厌倦了写下所有这些漫长的日子– 1784年是整个六个铅笔升降机!ǝǝ!

如您所见,我(就像该网站上的大多数挑战性海报一样)在写作方面很懒惰。因此,请您帮助我缩短一些日期。当然,您的解决方案必须尽可能地短,因为我的手已经很难写出键入测试用例的内容。

如何缩短日期?

好有趣,你应该问。这很简单:

  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,是的,没错。输入仅是非负整数
Daniel

1
@Qwertiy,的确如此。
丹尼尔(Daniel)

2
1914-8是第一次世界大战。现在给我我的巧克力蛋糕!
暴民埃里克(Erik the Outgolfer)'17年

Answers:



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]出现了。看来这已经被推翻了。
暴民埃里克(Erik the Outgolfer)'17年

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

Dyalog APL,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”。
Chas Brown

@ChasBrown Dang,您是对的。我将代码回滚到上一个迭代,这将处理这种情况。
阿诺德·帕尔默

0

Python 2,127字节

我对此还很陌生,所以我不知道是否可以用相同的语言给出另一个答案。由于我无法在其他人的帖子上发表评论,因此我在这里碰碰运气。

  • 是否可以将输入从Integer更改为String?原因将为我节省大约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

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

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

在线尝试!

最小,最大。

取消高尔夫:

(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个字节,感谢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);}

测试代码:

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宏来节省一些字节。
扎卡里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.