Menambahkan Panjang String


51

Tantangan:

Diberikan string spada karakter a- z, A- Z, 0- 9, tambahkan panjangnya ssendiri, dengan menghitung karakter tambahan dalam panjangnya sebagai bagian dari panjang total s.

Memasukkan:

Hanya seutas panjang acak (bisa kosong).

Keluaran:

String yang sama, tetapi dengan panjangnya ditambahkan sampai akhir. Karakter yang mewakili panjang juga harus dihitung sebagai bagian dari panjang. Dalam kasus di mana ada beberapa panjang yang valid untuk ditambahkan, pilih yang terkecil yang mungkin (lihat kasus uji untuk contoh).

Kasus uji:

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

Aturan:

Ini adalah , jadi kode terpendek dalam byte menang. Celah standar dilarang. Kiriman dapat berupa seluruh program atau fungsi, dan Anda dapat mencetak hasilnya ke stdout atau mengembalikannya sebagai variabel dari suatu fungsi.


Karakter apa yang dapat muncul di input?
Martin Ender

@MartinEnder Hanya karakter alfanumerik, 0-9 dan AZ / az. Jadi ya, Anda dapat memiliki string dengan angka di bagian akhir. Saya akan menambahkan test case untuk satu.
Yodle

Jawaban:



18

JavaScript (ES6), 32 byte

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

Bagaimana itu bekerja

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

Dimulai dengan N=0, kami menguji karakter ke-N (berbasis-0) dari string yang dibuat dari rangkaian string input asli dan representasi desimal dari N. Kami bertambah Nhingga karakter ini tidak ada lagi.

Contoh:

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

Uji kasus


Wow, JS jauh lebih sulit daripada Python untuk ini.
mbomb007

@Arnauld Saya tidak bisa melupakan ini. Apakah Anda keberatan menjelaskan cara kerja kode ini?
Gowtham

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


Wah, saya tidak berpikir saya pernah melihat jawaban lateks pada ppcg sebelumnya.
pajonk

5

JavaScript (ES6), 37 byte

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


Ketika saya mengklik Run Code Snippetsaya bisa melihat pesan kesalahan. Saya tidak memiliki pengetahuan tentang Javascript - Saya baru saja mencoba
Prasanna

@ Prasanna Bekerja untuk saya di Firefox; browser mana yang kamu gunakan?
Neil

@ Prasanna Bekerja di Google Chrome terbaru. Apakah Anda yakin tidak menggunakan IE11 atau lebih lama, Opera atau apa pun yang tidak mendukung ES6?
Ismael Miguel

Saya menggunakan chrome lama yang baik ( Version 48.0.2564.97). Saya akan coba ini dengan IE juga. Tidak dapat memperbarui chrome - masalah keamanan kantor
Prasanna

5

C, 67 65 61 byte

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

Wandbox


1
Ohh, ya, saya harus printf'd ... Omong-omong, selamat atas solusi C yang lebih pendek: D +1
cat

4

Lua 5.2, 32 Bytes

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

Di mana variabel a adalah string input.


3

Pyke, 8 byte ( versi lama )

.f+liq)+

Penjelasan:

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

Coba di sini! (Versi baru, 9 byte)


Itu selalu membingungkan saya bagaimana terkuburnya hasil aktual di antara peringatan atau pesan lain :-)
Luis Mendo

2
Saya harus benar-benar memperbaiki bug web di tautan salin yang secara otomatis menonaktifkan sakelar peringatan
Blue

3

Python 2, 54 48 46 byte

Solusi sederhana. Rekursi menjadi lebih pendek.

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

Cobalah online


1
Saya pikir Anda bisa melakukan (s+`n`)[n:]untuk n<len(s+`n`).
xnor

3

Haskell, 46 byte

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

Contoh penggunaan: f "aaaaaaaa"-> "aaaaaaaa9".

Cukup coba semua angka dimulai dengan 0 dan ambil yang pertama sesuai.


3

Mathematica, 57 byte

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

Fungsi tanpa nama mengambil array karakter sebagai input dan mengembalikan string. Menggunakan fakta bahwa jika aadalah panjang input, maka jumlah untuk menambahkan input aditambah jumlah digit dalam ( a+ panjang a), bukan hanya aditambah jumlah digit a. Sayangnya itu tidak akan memberikan jawaban yang benar untuk input string kosong tanpa ~Max~1case khusus.


3

Brachylog , 13 byte

l<L$@:?rc.lL,

Cobalah online!

Penjelasan

Pada dasarnya deskripsi masalah. Ini akan mencoba setiap nilai Llebih besar dari panjang input sampai menemukan satu yang, ketika digabungkan ke input, adalah panjang dari gabungan tersebut.

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 byte

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

Input harus diakhiri oleh linefeed (LF). Hanya berfungsi untuk input dengan panjang kurang dari 256 (termasuk LF).

Cobalah online!

Penjelasan

# 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
>>++++++++++<<[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]>>[-]>>>++++++++++<[->-[>+>>]>[+[-
<+>]>+>>]<<<<<]>[-]>>[>++++++[-<++++++++>]<.<<+>+>[-]]<[<[->-<]++++++[->++++++++
<]>.[-]]<<++++++[-<++++++++>]<.[-]<<[-<+>]

Catatan: Saya menggunakan kode dari jawaban SO ini untuk mengonversi panjang menjadi keluaran ascii; Saya harap ini dapat diterima di PPCG. Ini adalah pengiriman Codegolf pertama saya, dan program BF kedua saya. Umpan balik disambut.


1
Ini tidak valid, maka harus melewati semua test case
cat

Jadi mendukung panjang hingga 999 akan cukup?
Forcent Vintier

Spesifikasi tersebut mengatakan "panjang arbitrer" yang berarti "selama bahasa Anda mampu menangani atau tanpa kehabisan memori"
cat

Juru bahasa brainfuck yang Anda gunakan memiliki sel 8-bit, jadi selama algoritme Anda berfungsi untuk string dengan panjang sewenang-wenang, itu akan baik-baik saja jika gagal untuk string dengan panjang 256 atau lebih tinggi. Pengiriman C dan JavaScript juga akan gagal begitu string terlalu panjang.
Dennis

Terima kasih Dennis, saya akan memodifikasi kiriman saya
Forcent Vintier


2

Ruby, 62 58 56 byte

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

Diuji dalam irb.

Mungkin ada cara yang lebih baik untuk melakukan ini, tetapi ini adalah hal pertama yang saya pikirkan. Bantuan apa pun dalam bermain golf akan dihargai.

sunting: Saya menyadari bahwa penggunaan tanda kurung saya berlebihan.


Anda hanya menggunakannya ldi satu tempat. Jika Anda sebaris itu, Anda akan menghemat 3 byte l=;. Tetapi solusi Anda masih akan lebih lama dari milik saya;)
DepressedDaniel

2

Perl 6 ,  46  35 byte

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

Cobalah

Diperluas:

{   # 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

05AB1E , 11 byte

[¹¾JDg¾Q#¼\

Bruteforce cukup mudah:

            Implicit i = 0
[           while true
 ¹¾J        Concatenate input and i -> str
    Dg¾Q#   Break if length(str) == i
         ¼\ Else, i += 1

Cobalah online!


2

Python, 39 byte

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

Bentuk lagi:

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

Iteratif dalam Python 2 (41 byte):

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

Dimulai dengan xsebagai string input a, terapkan transformasi x -> a + str(len(x))tiga kali. Saya masih tidak jelas mengapa tiga aplikasi diperlukan untuk selalu mencapai titik tetap.


Kenapa 3 kali? Pertama untuk menambahkan panjang teks, kedua untuk menyesuaikan panjang untuk memasukkan nomor, ketiga jika penyesuaian menambahkan angka ekstra.
Tom Viner


2

bash, 47 byte

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

Simpan ini sebagai skrip, dan berikan string input sebagai argumen.

Ini adalah implementasi brute force: coba setiap angka secara bergantian sampai Anda menemukan yang berfungsi.


2

> <> (Ikan) 35 byte

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

Mengambil input ke stack, periksa panjangnya terhadap nilai 9,99.999 ... dan jika panjangnya lebih besar dari tambah 1 ke panjang stack.


2

Haskell , 61 60 byte

e=length
l%n|s<-show$l+1,n>e s=s|m<-n+1=(l+1)%m
c s=s++e s%2

Cobalah online!

Solusi rekursif. Pemakaian:

Prelude> c "aaaaaaaaa"
"aaaaaaaaa11"

1

C #, 77 byte

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

1
Saya tidak sekarang C #, tapi tidak bisa Anda gunakan return(n+(a+1+c))sebagai a=n.Length?
Laikoni

Dan juga menjatuhkan -1dari int c=(a+1).ToString().Length-1dan +1dari pengembalian?
Laikoni

1
Tunggu, apakah ini menangani kasus uji yang lebih besar dengan benar? Sepertinya mengembalikan aa...a100bukan aa...a101untuk 99 akasus uji.
Laikoni

1

MATL , 11 byte

`G@Vhtn@>]&

Cobalah online! Atau verifikasi semua kasus uji .

`      % 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 byte (program)

Ruby, 49 byte (fungsi)

Program (baris baru terakhir tidak diperlukan dan karenanya tidak disimpan):

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

Fungsi (baris baru terakhir dicetak):

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

1

Faktor, 55 byte

Ini jalan-jalan di taman! Saya memikirkan hal ini segera setelah saya membaca pertanyaan itu.

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

1

Clojure, 72 byte

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

1

R, 49 byte

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

Solusi yang sangat mudah.


Ini tidak bekerja untuk saya: Read 1 item Error in nchar(x + 1) : object 'x' not found. Saya menemukan bahwa (t<-nchar(a))+...itu berhasil.
JAD

@JarkoDubbeldam: Badaku!
Frédéric

1

Wolfram, 56

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

Mengingat l = StringLength[x]itu ditambahkan l + IntegerLength[l + IntegerLength[l]]ke x.



1

ForceLang, 83 byte

set s io.readln()
label 1
set n 1+n
set t s+n
if t.len=n
 io.write t
 exit()
goto 1
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.