巻尺ストリング


15

動機:時には、あなたが文字列のどこにいるかを知る必要があります。文字列の任意の部分を見て、できる限り正確にどこにいるかを知りたいと思うでしょう。

課題:指定された長さの巻尺文字列を出力するプログラムを作成します。巻尺文字列の自己は、その長さはそれほど遠くできるだけ頻繁に、それは自身の長さだ沿って説明します。

ルール

  1. プログラムは、テープメジャー文字列の合計長に対して、1つの正の整数パラメーターを取る必要があります
  2. 出力の桁の各連続した文字列の場合は、これらの数字は正確にこれまでの出力の長さを報告しなければなりません- 包括的
    1. 長さは、文字列の先頭から各番号の末尾まで測定されます
  3. 文字列にはできるだけ多くの長さの数字を含める必要があります
  4. あいまいさを避けてください。セパレータ/デリミタを使用して、数字が並置されるのを防ぐことができます12
  5. 文字列は、末尾のセパレータなしで、常に正確にその全長を報告する必要があります
  6. 長さを正確に保つために複数のセパレータが必要になる場合があります。たとえば、長さ4の巻尺文字列の例を次に示します。 1--4

非規範的/網羅的な例:

  • 長さ1の巻尺文字列: 1
  • 長さ2の巻尺 -2
  • 長さ3の巻尺文字列: 1-3
  • 長さ4の巻尺文字列:1--4または-2-4(両方のレポートの長さを可能な限り頻繁に、つまり2回、正しい合計長で終わる)
  • 長さ10の巻尺文字列: 1-3-5-7-10
  • 長さ11の巻尺文字列:1-3-5-7--11or 1-3-5--8-11or 1-3--6-8-11or 1--4-6-8-11or -2-4-6-8-11(すべてできるだけ多くの長さ番号を持ち、文字列の合計の長さで終了します)

したがって、文字列のすべての数字は別の数字に隣接せず、文字列は完全にダッシュ-で構成されており、文字列にできるだけ多くの長さマークを付ける必要がありますか?
Rɪᴋᴇʀ

0ベースのインデックスを使用できますか?
Rɪᴋᴇʀ

@EasterlyIrkルール3は、できるだけ多くの数字を文字列に収める必要があります。
ポストロックガーフハンター


@EasterlyIrkでは、すべてのダッシュを使用することはできません。すべてのダッシュを使用すると、モチベーションを満たすことができず、ルール3および5に違反します。インデックスはありません。ちょうど長さ。いいえ、長さ1の巻尺文字列はにできません0
トム・ビナー

回答:


12

Python、50 48 47 46バイト

f=lambda x:x*"1"if x<2else f(x-len(`-x`))+`-x`

説明

非常に単純な再帰ラムダソリューション

基本ケースは1と0です。これらは "1"*x-xwith の文字列を取得し、lessで`-x`関数を呼び出した結果の先頭に追加しlen(`-x`)ます。


1
文字列化してバイトを節約できます-xか?
マーティンエンダー

@MartinEnderわかりました。ヒントをありがとう!私はそれを以前に気づかなかったことにちょっと馬鹿だと感じます。
ポストロックガーフハンター

5

Mathematica、67 57バイト

10バイトを投棄してくれたMartin Enderに感謝します!

""["1"][[#]]/._@__:>#0[#-1-IntegerLength@#]<>ToString@-#&

名前のない関数は、負でない整数引数を取り、文字列を返します。かなり明らかな再帰アルゴリズム:文字列がa "-"で始まる入力番号で終わることを確認してから、を使用して関数を再度呼び出します#0

ただし、アルゴリズムの実装にはゴルフの楽しみがあります。""["1"][[#]]を示す# th番目の引数をます""["1"]。0番目の引数は先頭""で、1番目の引数は目に見える"1"であり、再帰の基本ケースを提供します。場合は#1を超えると、""["1"][[#]]エラーメッセージをスローし、未評価関数として残ります。しかし、それ/._@__:>は未評価の関数を取り、それを次に来る式に変換するルールです。これは、元の関数の再帰呼び出しです。

元の提出:

If[#<2,""["1"][[#]],#0[#-1-IntegerLength@#]<>"-"<>IntegerString@#]&

2
""["1"][[#]]/._@__:>#0[#-1-IntegerLength@#]<>ToString@-#&回避することによって1バイト節約If回避することによって、バイトのバンチIntegerStringとは"-"<>
マーティンエンダー

1
Omg、_@__邪悪な魔法
グレッグマーティン

3

JavaScript(ES6)、49バイト

f=(n,s='',t=''+-n)=>n>1?f(n-t.length,t+s):n?n+s:s
<input type=number oninput=o.value=f(this.value)><br><textarea id=o></textarea>


1
定義する必要があると思うf
トム・ビナー

@TomViner私はいつもそうしています。(少なくとも、正しいバイトカウントがありました。)
ニール


1

Perl 6、43バイト

{[R~](-$_,{$_+.comb}...^*>-1).&{S/^\-1/1/}}

説明:

{                                         }  # A lambda.
                    ...                      # Generate a sequence...
      -$_                                    #   starting from the negated lambda argument,
         ,{        }                         #   continuing iteratively using the formula:
           $_+.comb                          #     Last element plus length of last element.
                        *>-1                 #   until we hit 0 or higher,
                       ^                         end-point not inclusive.
 [R~](                      )                # Reverse and concatenate the number sequence.
                             .&{         }   # Apply to this the transformation:
                                S/^\-1/1/    #   Remove the sign from a leading "-1".

したがって、たとえば入力10の場合、シーケンスが生成され、(-10, -7, -5, -3, -1)そこから文字列が生成され、-1-3-5-7-10そこから最終的な文字列が生成されます1-3-5-7-10

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

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