文字列の長さを追加する


51

チャレンジ:

s文字a- zA- Z0-の文字列を指定すると9、の長さsをそれ自体に追加し、長さの追加の文字をの全長の一部としてカウントしsます。

入力:

任意の長さの文字列(空にすることもできます)。

出力:

同じ文字列ですが、長さが末尾に追加されます。長さを表す文字も長さの一部としてカウントする必要があります。追加する有効な長さが複数ある場合は、可能な限り短いものを選択してください(例については、テストケースを参照してください)。

テストケース:

INPUT     -> OUTPUT       // Comment
aaa       -> aaa4
          -> 1            // Empty string
aaaaaaaa  -> aaaaaaaa9    // aaaaaaaa10 would also normally be valid, but violates using the smallest number rule mentioned above
aaaaaaaaa -> aaaaaaaaa11
a1        -> a13          // Input can contain numbers at the end of the string, you do not have to handle the fact that it looks like 13 rather than 3.

Longer test case(s):

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa101
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa102

ルール:

これはなので、バイト単位の最短コードが優先されます。標準的な抜け穴は禁止されています。提出はプログラム全体または関数である場合があり、結果をstdoutに出力するか、関数から変数として返すことができます。


入力に表示できる文字は何ですか?
マーティンエンダー

@MartinEnder英数字のみ、0-9およびAZ / az。そのため、最後に数字のある文字列を使用できます。テストケースを追加します。
ヨドル

回答:



18

JavaScript(ES6)、32バイト

f=(s,n=0)=>(s+n)[n]?f(s,n+1):s+n

使い方

f = (s, n = 0) =>   // given a string 's' and starting with n = 0:
  (s + n)[n] ?      // if the Nth character of (s + n) exists:
    f(s, n + 1)     //   try again with n + 1
  :                 // else
    s + n           //   return s + n

から始めてN=0、元の入力文字列との10進表現を連結した文字列のN番目の文字(0ベース)をテストしNます。Nこのキャラクターがなくなるまで増分します。

例:

N =  0 : abcdefghi0
         ^
N =  1 : abcdefghi1
          ^
N =  2 : abcdefghi2
           ^
...
N =  8 : abcdefghi8
                 ^
N =  9 : abcdefghi9
                  ^
N = 10 : abcdefghi10
                   ^
N = 11 : abcdefghi11    -> success
                    ^

テストケース


うわー、JSはこれよりもPythonよりもずっと簡潔です。
mbomb007

@Arnauld私はこれを回避できません。このコードがどのように機能するかを説明してもいいですか?
ゴーサム16

12

LaTeX、108/171

\newcounter{c}\def\s#1#2]{\stepcounter{c}\def\t{#2}\ifx\empty\t\arabic{c}\else#1\s#2]\fi}\def\q[#1]{\s#10]}

\q[] //1


おっと、私は以前にppcgでラテックスの答えを見たことがないと思います。
パジョン16

5

JavaScript(ES6)、37バイト

f=(s,t=s,u=s+t.length)=>t==u?t:f(s,u)
<input oninput=o.textContent=f(this.value)><pre id=o>


クリックするRun Code Snippetと、エラーメッセージが表示されます。私はJavascriptの知識がありません-ちょうどやってみました
プラサナ

@PrasannaはFirefoxで動作します。どのブラウザを使用していますか?
ニール

@Prasannaは最新のGoogle Chromeで動作します。IE11以前、Opera、またはES6をサポートしていないものを使用していませんか?
イスマエルミゲル

古い良いクロム(Version 48.0.2564.97)を使用しています。私もIEでこれを試してみます。私のクロムを更新することはできません-オフィスのセキュリティ問題
プラザンナ

5

C、67 65 61バイト

x;f(*v){printf("%d",(int)log10(x=-~printf(v))*-~(x%10>8)+x);}

ワンドボックス


1
ああ、そうです、printf'dすべきです...とにかく、短いCの解決策を持っていることを祝福します:D +1
cat

4

Lua 5.2、32バイト

a=arg[1]print(a..#a+#(''..#a+1))

ここで、変数aは入力文字列です。


3

Pyke、8バイト(旧バージョン

.f+liq)+

説明:

.f    )  -  first where (i++)
  +      -    input + i
   l     -    len(^)
    iq   -   ^ == i
       + - input + ^

ここで試してみてください!(新バージョン、9バイト)


それは、常に実際の出力は、警告や他のメッセージの中で:-)埋めどのように私を混乱させる
ルイス・Mendo

2
私は実際に自動的に警告を切り替える無効コピーリンクでウェブバグを修正するの周りを取得する必要
ブルー

3

パイソン2、54の 48 46バイト

シンプルなソリューション。再帰は短くなりました。

f=lambda s,n=0:f(s,n+1)if(s+`n`)[n:]else s+`n`

オンラインで試す


1
私はあなたが行うことができると思う(s+`n`)[n:]のためにn<len(s+`n`)
xnor

3

Haskell、46バイト

f s=[l|i<-[0..],l<-[s++show i],length l==i]!!0

使用例:f "aaaaaaaa"- > "aaaaaaaa9"

0で始まるすべての数字を試して、適合する最初の数字を取得します。


3

Mathematica、57バイト

#<>ToString[(a=Length@#)+(i=IntegerLength)[a+i@a]~Max~1]&

入力として文字の配列を取り、文字列を返す名前のない関数。aが入力の長さである場合、入力に追加する数値は、の桁数だけではなくa、(a+の長さa)の桁数に加算されるという事実を使用します。残念ながら、特別な場合を除いて、空文字列の入力に対して正しい答えを出すことはできません。aa~Max~1


3

Brachylog、13バイト

l<L$@:?rc.lL,

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

説明

基本的に問題の説明。L入力に連結されたときにその連結の長さである値が見つかるまで、入力の長さより大きいすべての値を試行します。

l<L              length(Input) < L
  L$@            Convert L to a string
     :?rc.       The Output is the concatenation of the Input with L as string
         .lL,    The length of the Output is L itself

3

Brainfuck、258バイト

,>+<----------[++++++++++>+[>+<-],----------]<[<]>[.>]>>>++++++++++<<[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]>>[-]>>>++++++++++<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>[-]>>[>++++++[-<++++++++>]<.<<+>+>[-]]<[<[->-<]++++++[->++++++++<]>.[-]]<<++++++[-<++++++++>]<.[-]<<[-<+>]

入力は改行(LF)で終了する必要があります。長さが256より小さい入力(LFを含む)でのみ機能します。

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

説明

# read first char and add one to cell #1
# the cell after the input will contain the length
,>+<
# subtract 10 to check for LF
----------
# while the input is not 10 (LF)
[
# restore the input to its original value
++++++++++
# add one to the length
>+
# cut and paste the length to the next cell, then read the input
[>+<-],
# subtract 10 to check for LF
----------
]
# for input abc, the tape here would be: a b c *0* 4
# rewind to the beginning of the input
<[<]>
# print the input string
[.>]>
# convert the length to ascii chars and output them
>>++++++++++<<[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]>>[-]>>>++++++++++<[->-[>+>>]>[+[-
<+>]>+>>]<<<<<]>[-]>>[>++++++[-<++++++++>]<.<<+>+>[-]]<[<[->-<]++++++[->++++++++
<]>.[-]]<<++++++[-<++++++++>]<.[-]<<[-<+>]

注:このSO回答のコードを使用して、長さをASCII出力に変換しました。これがPPCGで受け入れられることを願っています。これは私の最初のCodegolf提出物であり、私の2番目のBFプログラムです。フィードバックを歓迎します。


1
これは有効ではありません。すべてのテストケースに合格する必要があります
cat

したがって、最大999までの長さをサポートすれば十分でしょうか?
フォーセントヴィンティア

スペックは、「長い間あなたの言語を扱うか、メモリ不足のない可能な限り」手段「任意の長さ」と言う

使用しているBrainfuckインタープリターには8ビットセルがあります。したがって、アルゴリズムが任意の長さの文字列に対して機能する限り、長さが256以上の文字列に対して失敗しても問題ありません。文字列が長くなりすぎると、CおよびJavaScriptの送信も失敗します。
デニス

あなたのデニスありがとう、私はそれに応じて私の提出を変更します
Forcent Vintier


2

ルビー、62 58 56バイト

s=gets.chomp;p s+"#{(s+"#{(s+"#{s.size}").size}").size}"

でテスト済みirb

おそらくこれを行うためのより良い方法がありますが、これが最初に思いついたものでした。ゴルフの助けをいただければ幸いです。

編集:括弧の使用が多すぎることに気づきました。


l1つの場所でのみ使用します。インライン化すると、3バイト節約されますl=;。しかし、あなたの解決策は私の解決策よりも長くなります;)
DepressedDaniel

2

Perl 6の 46の  35バイト

{$_~(.chars,*.chars+.chars...{$^a==$^b})[*-1]}
{$_~(.chars,*.chars+.chars...*)[2]}

それを試してみてください

拡張:

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

  $_  # the input

  ~   # concatenated with

  (  # sequence generator

    .chars,  # the number of chars in 「$_」 (seed the generator)


    *\      # Whatever lambda input (represents previous value)
    .chars  # number of chars in that
    +       # plus
    .chars  # the number of chars in 「$_」


    ...     # keep doing that until

    *       # indefinitely

  )[2] # get the value at index 2 of the sequence
}


2

Python、39バイト

lambda a:eval('a+str(len('*3+'a))))))')

長い形式:

lambda a:a+str(len(a+str(len(a+str(len(a))))))

Python 2で繰り返し(41バイト):

x=a=input();exec"x=a+`len(x)`;"*3;print x

x入力文字列として開始して、a変換をx -> a + str(len(x))3回適用します。常に固定小数点に到達するために3つのアプリケーションが必要な理由はまだわかりません。


なぜ3回ですか?最初にテキストの長さを追加し、2番目に番号を含めるように長さを調整し、3番目に調整により余分な数字が追加された場合。
トム・ビナー


2

bash、47バイト

 for((n=-1;${#s} != $n;));{ s=$1$[++n];};echo $s

これをスクリプトとして保存し、入力文字列を引数として渡します。

それはブルートフォース実装です。動作する番号が見つかるまで、各番号を順番に試します。


2

> <>(魚)35バイト

i:1+?!v:o
ln;v9l<  >
*9+>:&)?!^1l&a

入力をスタックに取り込み、9,99,999 ...の値に対して長さをチェックし、長さがスタック長に1を加算するよりも大きい場合。



1

C#、77バイト

n=>{int a=n.Length;int c=(a+1).ToString().Length-1;return(n+(n.Length+1+c));}

1
今はC#を使用しreturn(n+(a+1+c))ていませんが、as を使用できませんa=n.Length
ライコニ

そしてまた、ドロップ-1からint c=(a+1).ToString().Length-1+1リターンから?
ライコニ

1
待ってください、これはより大きなテストケースを正しく処理しますか?99 テストケースのaa...a100代わりに戻るように見えます。aa...a101a
ライコニ

1

MATL、11バイト

`G@Vhtn@>]&

オンラインでお試しください!または、すべてのテストケースを確認します

`      % Do...while
  G    %   Push input
  @    %   Push iteration index (1-based)
  V    %   Convert number to string
  h    %   Concatenate horizontally
  t    %   Duplicate
  n    %   Get length of concatenated string
  @    %   Push iteration index
  >    %   True if length of concatenated string exceeds iteration index
]      % End. Run next iteration if top of stack is true; else exit loop
&      % Specifiy that next function (implicit display) takes only one input
       % Implicitly display top of the stack. This is the concatenated string
       % that had a length equal to the iteration index

1

Ruby、51バイト(プログラム)

Ruby、49バイト(関数)

プログラム(最後の改行は必要ないため、スコア付けされません):

x=gets.strip
i=0
i+=1 until(y=x+i.to_s).size==i
p y

機能(最後の改行がスコアリングされます):

def f x
i=0
i+=1 until(y=x+i.to_s).size==i
y
end

1

ファクター、55バイト

公園を散歩します!質問を読んだ途端、これを頭の中で思いつきました。

[ dup length dup log10 ⌈ + >integer 10 >base append ]

1

Clojure、72バイト

(defn f([s](f s 1))([s n](if(=(count(str s n))n)(str s n)(f s(inc n)))))

1

R、49バイト

cat(a<-scan(,""),(t<-nchar(a))+nchar(t+1),sep='')

非常に簡単なソリューション。


これは私には機能しません:Read 1 item Error in nchar(x + 1) : object 'x' not found。私はそれ(t<-nchar(a))+...がうまくいったことがわかりました。
JAD

@JarkoDubbeldam:私の悪い!
フレデリック

1

Wolfram、56歳

#<>ToString@Nest[l+IntegerLength@#&,l=StringLength@#,2]&

l = StringLength[x]それがに追加さl + IntegerLength[l + IntegerLength[l]]れると仮定しxます。



1

ForceLang、83バイト

set s io.readln()
label 1
set n 1+n
set t s+n
if t.len=n
 io.write t
 exit()
goto 1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.