番号の範囲を元に戻す


34

それが非常に簡単です、数与えられn、範囲を作成0しますn-1。実際、多くの言語がこの操作を組み込みとして提供しています。

次のCJamプログラムは整数を読み取り、そのような範囲を出力します(オンラインで試してみてください!):

ri,

セパレータなしで数値が出力されることに注意してください。

チャレンジ

あなたの仕事は、このプロセスを逆にすることです。範囲を表す文字列を指定すると、その範囲を生成するために使用される数値を返すプログラムを作成する必要があります。

仕様書

  • 番号は区切り文字なしで指定されます。
  • 文字列が有効な範囲を形成すると仮定できます。
  • 範囲に0または1ベースのインデックスを使用できます。
  • 正しい出力が32,767を超えることはないと想定できます(したがって、有効な入力の長さが152,725を超えることはありません)。
  • 正しい出力は常に正であると仮定することができます(したがって、0または負を処理する必要はありません)。

これはであるため、最短の競合する回答(バイト単位)が勝ちます。

テストケース

0インデックス付き:

0123 -> 4
0 -> 1
0123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 -> 101

1インデックス付き:

1234 -> 4
1 -> 1
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 -> 100

降順の範囲はありますか?負の数で動作する必要がありますか?
ダニエル

@ダニエルいいえ。言及するのを忘れました。追加されました。
エソランジングフルーツ

4
プログラムは本当に空の文字列を処理する必要がありますか?私たちがそれを無視できるようにすることは合理的だと思います。いくつかの答えは、その規則からまったく恩恵を受けません。
氏Xcoder

出力は、数値の文字列表現、つまり元の文字列から部分文字列として取得できますか?
user2390246

@ user2390246はい、大丈夫です。
エソランジングフルーツ

回答:



11

、5バイト

LCmLN

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

手紙だけ!

入力を文字列として受け取り、結果は1から始まります。

説明

LCmLN
  mLN    get the list of lengths of all positive naturals
 C       cut the input into slices of those lengths
L        get the length of the resulting list

8

05AB1E7 6バイト

1インデックス。

āηJsk>

オンラインでお試しください! またはテストスイートとして

説明

ā        # push range [1 ... len(input)]
 η       # compute prefixes of the range
  J      # join each prefix to a string
   sk    # get index of the input in the list of prefixes
     >   # increment

私は何か間違っていますか?これは0、入力に関係なく返されるようです:tio.run
シャギー

@Shaggy:単一引用符は入力の一部としてカウントされるためこのようにする必要があります。
エミグナ

ああ、05AB1Eの文字列入力は三重引用符で囲む必要がありますか?
シャギー

@Shaggy:入力に空の文字列または改行が必要な場合はい。それ以外の場合は、まったく引用する必要はありません。
エミグナ

[NÝJQ#]N私のアイデアでしたが、これはのために機能するため、これはより良いです""
魔法のタコUr

7

Java 8、66 59バイト

s->{int r=0;for(String c="";!c.equals(s);c+=r++);return r;}

0インデックス付き

@ PunPun1000のおかげで-7バイト。

入力が常に有効であると想定できるため、入力の長さを何らかの方法でチェックするだけでこれを短縮できると感じています。まだこれを理解しています。これを理解することはできず、おそらくJavaではバイト数が多すぎて有用ではありません(1インデックス付き入力の末尾の部分文字列を返す場合も同様です)。

説明:

ここで試してみてください。

s->{                 // Method with String parameter and integer return-type
  int r=0;           //  Result-integer
  for(String c="";   //  Check-String
      !c.equals(s);  //  Loop as long as the sum-String doesn't equal the input-String
    c+=r++           //   Append the number to the the Check-String,
                     //   and increase the Result-integer by 1
  );                 //  End of loop
  return r;          //  Return the result-integer
}                    // End of method

1
59バイト:TIO
PunPun1000

おそらく、1の数をカウントしたり、必要な部分文字列の長さを取得するために長さの対数を使用したりするような不合理なショートカットがあります。
JollyJoker

6

Brachylog9 7バイト

⟦kṫᵐc,Ẹ

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

0インデックス。

説明

ここでは、出力変数を介して入力を渡し、入力変数を介して結果にアクセスします。

⟦          The result is the input to a range…
 k         …with the last element removed…
  ṫᵐ       …which when all elements are casted to string…
    c      …and are then concatenated results in the input string
     ,Ẹ    (Append the empty string, this is necessary for it to work in the case where the 
             input is the empty string)


5

Japt、8バイト

Japtの関数メソッドを使い始めました。

0インデックス。入力を文字列、整数、または0または1要素を含む配列として受け取ることができます。

_o ´U}a

試して


説明

stringの暗黙的な入力U

_     }a

>=0の関数を介して渡されたときにtrueを返す最初の整数を取得します。

o

0現在の整数より1少ない整数の配列を生成します...

¬

文字列に結合します...

¥U

その文字列がと等しいかどうかをチェックしますU

結果の整数の暗黙的な出力。


代替、8バイト

ÊÇo ¬ÃbU

試して


4

、13バイト

I⌕E⁺ψθ⪫EκIλωθ

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

          λ     Inner map variable (μ inner map index also works)
         I      Cast to string
        κ       Outer map index
       E        Map over implicit range
      ⪫    ω    Join result
     θ          Input string
   ⁺ψ           Plus an extra character
  E             Map over each character
 ⌕          θ   Find the index of the original string
I               Cast from integer to string
                Implicit print

4

Haskell、40 37バイト

f s=[n|n<-[0..],(show=<<[0..n])>s]!!0

ゼロベースの範囲を逆にする関数。

3バイトを節約してくれたLaikoniに感謝します!

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


1
リスト内包付きの37バイト:f s=[n|n<-[0..],(show=<<[0..n])>s]!!0
ライコニ

1
それに言及するために、2番目のパターンガードを使用してバイトを保存できます|m<-n+1=s!m
ライコニ


2

JavaScript(ES6)、32 31バイト

Challenger5のおかげで1バイト節約

f=(s,r=n='')=>r<s?f(s,r+n++):+n

テストケース


1
繰り返しますが、文字列を辞書式に比較できますか?
エソランジングフルーツ

私はカレーを提案するつもりでしたが、それはもはやコンセンサスではないようです:
Shaggy


1
@EriktheOutgolfer標準のカリー化は問題ありませんが、Shaggyは、などの呼び出しを必要とするこの特別な形式のカリー化を指しf(payload_param)()ていましたf(payload_param)(some_constant)。(ちなみに、私は両方を必要とするので、この特定のケースでうまくいくことはよく分からないrし、n初期化する。)
アルノー

2

Mathematica、46バイト

Array[""<>ToString/@Range@#&,2^15]~Position~#&

1インデックス付き

入力

["12345678910"]


2

ルビー51 50 46バイト

->n{(0..4e4).map{|x|(1..x).to_a.join}.index n}

(これは私の初めてのRubyプログラムですので、さらに簡単にゴルフできるはずです)

@Nnnesのおかげで-4バイト


1
最後の括弧のセットは必要ありません:.index(gets)=> .index gets。の4e4代わりに使用できますが8**5、これにより実行がさらに遅くなります。Rubyの回答に匿名のラムダを使用すると、通常は問題なく、多くの場合数バイトを節約できます。オンラインで試してみてください。(タイムアウトしないように制限を100に変更しました。)
Nnnes

2

Python 2、43バイト

f=lambda s,i=1,r='':r<s and-~f(s,i+1,r+`i`)

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


Python 2、43バイト

f=lambda s,i=1:s>''and-~f(s[len(`i`):],i+1)

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


Python、46バイト

lambda s:s[-sum(i*'0'in s for i in range(5)):]

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

別の戦略。0sのの最大実行の長さに等しい数の文字を末尾から取得します。


Python、46バイト

f=lambda s,c=0:c*'0'in s and f(s,c+1)or s[-c:]

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

上記の再帰バージョン。


あなたの「異なる戦略」(非常に賢い、ところで)は、チャレンジの声明で要求されるように、0から始まる範囲に対して機能しますか?内側のビットを... i*'0'in s[1:] for ...そのようなものに変更すべきですか?
ルカシティ

@LucaCiti 1から始まる範囲で機能しますが、チャレンジによって選択することができます。
-xnor

確かに、あなたは正しいです。最初の説明だけを見て、1ベースの範囲を許可する部分を見逃しました。
ルカシティ

2

R、47バイト

n=nchar(scan(,""));which(cumsum(nchar(1:n))==n)

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

1インデックス付き


3
"if"代わりに使用ifelse
ジュゼッペ

いい視点ね!しかし、OPは今...私は完全にそのビットを取り除くことができるように、0の場合に対処するための要件を削除しました
user2390246

1
nchar数字に期待されるように機能するため、入力を数字として受け取ることができます。ただし、出力の印刷を処理する必要があります。これは、完全なプログラムとして実行すると出力が印刷されないためです。
JAD

1
n=nchar(scan());cat(which(cumsum(nchar(1:n))==n))
JAD

2

APL(Dyalog)17 11バイト

ngnのおかげで-6バイト。

{,\⍕¨⍳≢⍵}⍳⊂

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

⍳⊂ 見つけɩで引数全体のNDEXを

{} この匿名関数の結果:

 引数の長さ

untilそれまでは

⍕¨ それぞれフォーマット(文字列化)

,\ それらの累積連結


ああ、私はちょうどいい長さから抜け出すことができるのを忘れていました、素晴らしい仕事。
ザカリー

{,\⍕¨⍳≢⍵}⍳⊂(11文字)
ngn

@ngnばかです。もちろん!
アダム

2

Perl 5、19バイト

18バイトコード+の1 -p

$i++while s/$i\B//

1ベースのインデックスを使用します。@ nwellnhofはるかに優れたアプローチのおかげで、-7バイト!

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

説明

$\print各ステートメントの後に自動的に追加される特別な変数であるため、これを使用して数値を格納することで、目的の出力を含めるために更新する必要がありません$_-pフラグの機能の一部として自動的に出力されます)。次に、入力がで始まる間に、入力$\redoプログラムを削除します$\。プログラムは再び増加して置き換えます。文字列の先頭で番号が見つからなくなったら、完了です!最後$\に、範囲内の最後の数値になるようにデクリメントします。


何について$i++while s/$i\B//(18 + 1バイト)?
nwellnhof

@nwellnhofそれははるかに良いです!答えを最初に0から始めたので、もっと複雑なルートを始めたと思います...ありがとうございます!
ドムヘイスティングス



1

CJam、13バイト

q:Q,),{,sQ=}#

非常に多くのコンマ...

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

説明

q:Q            Read the input and store it in Q
   ,           Get its length
    ),         Get the range 0..n
      {,sQ=}#  Find the index of the first number in the range to satisfy this block:
       ,        Get the range 0..(number)-1
        s       Stringify it
         Q=     Check if it equals the input

1

Perl 6の 30の28  27バイト

{first :k,*eq$_,[\~] '',0...*}

試して

{[\~]('',0...*).first($_):k}

試して

{first :k,$_,[\~] '',0...*}

試して

拡張:

{  # bare block lambda with implicit parameter 「$_」

  first       # find the first one
  :k,         # return the index into the Seq instead of what matched
  $_          # that matches the input

  # from the following

  [\~]        # triangle reduce using &infix:«~» (string concatenation)

              # a Seq
    '',       #   that starts with an empty Str
    0         #   then a 0
    ...       #   generate values
    *         #   indefinitely
}

'',0...*値の無限のシーケンスを生成します''0123...

[\~] '',0...* 可能なすべての入力の無限シーケンスを生成します

""
"0"
"01"
"012"
"0123"
...

無効な入力を与えた場合、このコードは停止しないことに注意してください。



1

CJam、14 12 11バイト

q,_){,s,}%#

オンラインで試す

q,   e# Get length of input string
_)   e# Duplicate length, increment by 1
{    e# Generate array by mapping [0,1,2,...,length] using the following function: 
,    e# Generate range [0,x] (x is the int we're mapping)
s    e# Convert range to string (e.g [0,1,2,3] => "0123"
,    e# Get the length of that string
}%   e# Map the int to the length of it's range string
#    e# Return the index of the length of the input string in the generated array

1

Dyvil42 38バイト

s=>"".{var r=0;while($0!=s)$0++=r++;r}

このJavaの回答と同じアルゴリズムです。ただし、Dyvilの構文の特殊性を(ab)使用します。

説明:

s=>          // starts a lambda expression with one parameter
"".{         // begins a brace access expression, the value before the '.'
             // is available within the braces as a variable named '$0'
var r=0;     // variable with inferred type int
while($0!=s) // while the accumulator $0 does not (structurally) equal s
$0++=r++     // concatenate $0 and the String representation of r,
             // then store the result in $0 and increment r by 1
;            // end of while
r}           // return r as the result of the lambda

  • 4アキュムレーターの変数の代わりにブレースアクセス式を使用して保存されたバイト

クールな言葉!!
ロバートフレイザー

0

MATL、14バイト

`@q:VXzGX=~}@q

1インデックス。

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

説明

`       % Do...while
  @     %   Push iteration index (1-based), k
  q     %   Subtract 1: gives k-1
  :     %   Range: [1 2 ... k-1]. Will be empty for k=1
  V     %   Convert to string
  Xz    %   Remove spaces
  G     %   Push input
  X=    %   Are the two strings equal?
  ~     %   Negate. This is the loop condition. If true: next iteration
}       % Finally (execute at the end of the loop)
  @     %   Push k
  q     %   Subtract 1: gives k-1. This is the solution
        % End (implicit). Display (implicit)

1
待って、チャコールはMATLを破ったの?
ニール

0

C#、72バイト


データ

  • 入力 String i解読されるint配列
  • 出力 Int32配列の作成に使用される番号

ゴルフ

(string i)=>{int c,p=c=0;for(;p<i.Length;c++)p+=(c+"").Length;return c;}

非ゴルフ

( string i ) => {
    int
        c,
        p = c = 0;

    for( ; p < i.Length; c++ )
        p += ( c + "" ).Length;

    return c;
}

読みやすい

// Takes the string with the int array
( string i ) => {
    int
        c,         // Counter, it will count how many ints the array has.
        p = c = 0; // Padding, it will help jumping from int to int on the string.

    // Start counting. If 'i' is empty, the 'c' will be 0.
    for( ; p < i.Length; c++ )

        // Increase the number of digits with the length of 'c'.
        p += ( c + "" ).Length;

    // Return the counter.
    return c;
}

完全なコード

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestBench {
    public static class Program {
        private static Func<String, Int32> f = ( string i ) => {
            int
                c,
                p = c = 0;

            for( ; p < i.Length; c++ )
                p += ( c + "" ).Length;

            return c;
        };

        static void Main( string[] args ) {
            List<String>
                testCases = new List<String>() {
                    "0123",
                    "0",
                    "",
                    "0123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100",
                };

            foreach(String testCase in testCases) {
                Console.WriteLine($" Input: {testCase}\nOutput: {f(testCase)}\n");
            }

            Console.ReadLine();
        }
    }
}

リリース

  • v1.0の - 72 bytes-初期ソリューション。

ノート

  • なし

1
i=>{int c,p=c=0;for(;p<i.Length;)p+=(c+++"").Length;return c;}62バイト
-TheLethalCoder


0

アセト27 25バイト

1ベースのインデックス。

;L[¥
`=]z
MLdI<
r!`;   p

私たちは、r入力をEADとM、それをemorize(直接L、我々はそれを否定、再びそれをOAD)(!;だけ空の文字列のためtruthy値につながります)。この値が真実(`)の場合、最後(;)にジャンプしp、暗黙のゼロをリントします。

それ以外の場合は、現在のスタック値(最初はゼロ)をインクリメントし、それを複製し、スタック内の1つのコピーを右側に移動しながら、そこに移動します(Id])。次に、減少する範囲を構築し(z)、文字列としてスタックを結合し(¥)、元のスタックの値(および私たち)を再び移動します([)。我々L、我々が以前に記憶した値(入力)をOADと、この文字列と比較します。等しい場合、最後に再びジャンプし、現在の「カウンター」値(=`;)を出力します。

それ以外の場合、ヒルベルト曲線が最終的<にIPを上に置きI、カウンターをインクリメントし、再度テストするまで、多くの空きスペースが走査されます。



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