歴史宿題ヘルパー


12

歴史を読んだりメモをとったりするので、これらの長い日付をすべて書くことにうんざりするしかありません。うん!

ご覧のとおり、私は–このサイトのほとんどのチャレンジポスターと同じように–ものを書くことに関しては怠け者です。したがって、いくつかの日付を短くしてください。私の手はすでに疲れているのでもちろん、あなたのソリューションは、できるだけ短くしなければなりません書き込みテストケース外にタイピングを。

日付を短くするにはどうすればよいですか?

おもしろいですね とても簡単です:

  1. 任意の順序((smallest, biggest)または(biggest, smallest))で入力として2つの整数を受け取ります。
  2. 2つの数値のうち大きい方を使用し、小さい方ではない部分のみを使用します。
    たとえば、が与えられた場合、両方が同じ桁位置にあるため2010, 2017、に短縮さ2017れます。-7201_
  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
@ジョナサンアラン、はいそうです。入力は非負の整数のみです
ダニエル

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
カリー化(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

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-99」ではなく「100-199」を返します。
チャスブラウン

@ChasBrown Dang、あなたは正しい。このケースを処理する前の反復にコードをロールバックしました。
アーノルドパーマー

0

Python 2、127バイト

私はまだこれに慣れていないので、同じ言語で別の答えを出してもいいかどうかわかりません。他の人の投稿にはコメントできないので、ここでチャンスをつかみます。

  • 入力を整数から文字列に変更することはできますか?それにより、約10バイト節約できます。
  • Arnlod Parmersの回答は、1989年、1991年に誤りがあります(これを投稿している間)。thoの評価トリックthoをありがとう(バイトを節約してくれました)!
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

オンラインでお試しください!

私がしていることは、両方の時間の各数字を比較し、大きな数字が変化する場合、小さな数字に大きな数字の残りを加えて印刷することです。

誰かが3行目でゴルフを手伝ってくれるなら、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

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

オンラインでお試しください!

最小、最大。

ゴルフをしていない:

(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
ザカリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.