Dize Uzunlukları Ekleme


51

Meydan okuma:

- , - , - skarakterleri üzerinde bir dize verildiğinde , kendisine uzunluğunu ekleyerek uzunluktaki ek karakterleri toplam uzunluğunun bir parçası olarak sayar .azAZ09ss

Giriş:

Sadece bir dizi keyfi uzunluk (boş olabilir).

Çıktı:

Aynı dize, ancak uzunluğu sonuna eklenmiş. Uzunluğu temsil eden karakterler de uzunluğun bir parçası olarak sayılmalıdır. Eklenecek birden fazla geçerli uzunluk olan durumlarda, mümkün olan en küçük olanı seçin (örnekler için test durumlarına bakın).

Test Durumları:

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

Kurallar:

Bu , bayt cinsinden en kısa kod kazanır. Standart boşluklar yasaktır. Gönderimler bütün bir program veya işlev olabilir ve sonucu stdout'a yazdırabilir veya bir işlevden bir değişken olarak geri döndürebilirsiniz.


Girişte hangi karakterler görünebilir?
Martin Ender,

@MartinEnder Yalnızca alfanümerik karakterler, 0-9 ve AZ / az. Yani evet, sonunda sayıları olan karakter dizileri olabilir. Biri için bir test davası ekleyeceğim.
Yodle

Yanıtlar:



18

JavaScript (ES6), 32 bayt

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

Nasıl çalışır

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

Başlangıçtan itibaren N=0, orijinal giriş dizgisinin birleştirilmesinden oluşan dizgenin Nth karakterini (0-tabanlı) ve ondalık gösterimini test ederiz N. NBu karakter artık varolmayana kadar artırıyoruz .

Örnek:

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

Test durumları


Vay canına, JS bunun için Python'dan daha zor.
mbomb007

@Buna kafamı bulamıyorum. Bu kodun nasıl çalıştığını açıklayabilir misiniz?
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


Vay, daha önce ppcg'de lateks bir cevap gördüğümü sanmıyorum.
pajonk

5

JavaScript (ES6), 37 bayt

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


Tıkladığımda Run Code Snippetbir hata mesajı görüyorum. Javascript bilgim yok - Sadece
deniyordum

@Prasanna Firefox'ta benim için çalışıyor; Hangi tarayıcıyı kullanıyorsunuz?
Neil,

@Prasanna en son Google Chrome'da çalışır. IE11 veya daha eski, Opera veya ES6'yı desteklemeyen herhangi bir şey kullanmadığınızdan emin misiniz?
Ismael Miguel

Eski bir iyi krom kullanıyorum ( Version 48.0.2564.97). Bunu IE ile de deneyeceğim. Kromumu güncelleyemiyorum - ofis güvenlik sorunları
Prasanna

5

C, 67 65 61 bayt

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

Wandbox


1
Ohh, evet, baskı yapmalıyım ... Her neyse, daha kısa C çözümüne sahip olduğun için tebrikler: D +1
kedi

4

Lua 5.2, 32 Bayt

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

Burada a değişkeni giriş dizgisidir.


3

Pyke, 8 bayt ( eski versiyon )

.f+liq)+

Açıklama:

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

Burada dene! (Yeni sürüm, 9 bayt)


Her zaman gerçek çıkış uyarı ve diğer mesajlar arasında :-) olduğunu gömülü beni nasıl karıştırır
Luis Mendo

2
Uyarıları otomatik olarak devre dışı bırakan kopya linkindeki web hatasını düzeltmek için gerçekten
Blue

3

Python 2, 54 48 46 bayt

Basit çözüm Özyineleme kısa sürdü.

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

Çevrimiçi deneyin


1
Ne yapabilirim düşünüyorum (s+`n`)[n:]için n<len(s+`n`).
xnor

3

Haskell, 46 bayt

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

Kullanım örneği: f "aaaaaaaa"-> "aaaaaaaa9".

Sadece 0 ile başlayan tüm sayıları deneyin ve uygun olanı seçin.


3

Mathematica, 57 bayt

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

Adsız işlev, bir karakter dizisini giriş olarak alarak bir dize döndürür. Olduğu gerçeğini ortaya kullanır agiriş uzunluğu, giriş da, sayı eklemek için aek olarak basamak sayısı ( a+ uzunluğu a) sadece yerine, abasamak artı sayısı a. Ne yazık ki, ~Max~1özel durum olmadan boş dizge girişi için doğru cevabı vermezdi .


3

Brachylog , 13 bayt

l<L$@:?rc.lL,

Çevrimiçi deneyin!

açıklama

Temel olarak problemin bir açıklaması. LGirdi ile birleştiğinde, birleştiği zaman o birleştiğin uzunluğu olanı bulana kadar girişin uzunluğundan daha büyük olan her değeri deneyecektir .

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 bayt

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

Giriş, bir satır beslemesi (LF) ile sonlandırılmalıdır. Yalnızca uzunluğu 256'dan küçük olan girişler için çalışır (LF dahil).

Çevrimiçi deneyin!

açıklama

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

Not: Uzunluğu ascii çıktısına dönüştürmek için bu SO cevabındaki kodu kullandım ; Umarım bu PPCG'de kabul edilebilir. Bu benim ilk Codegolf sunumum ve ikinci BF programım. Geri bildirim bekliyoruz.


1
Bu geçerli değil, o zaman tüm test durumlarını geçmeli
kedi

Yani 999'a kadar bir uzunluğu desteklemek yeterli olur mu?
For Vintier

Spesifikasyonda "dil uzunluğunu kullanabildiği veya hafızasının
cat

Kullandığınız brainfuck yorumlayıcısında 8 bitlik hücreler bulunur, bu nedenle algoritmanız keyfi uzunluktaki dizeler için çalıştığı sürece , uzunluğu 256 veya daha yüksek dizeler için başarısız olursa iyi olmalıdır . Dizeler çok uzadığında C ve JavaScript gönderimleri de başarısız olur.
Dennis,

Teşekkür ederim Dennis, gönderimimi buna göre değiştireceğim
Forcent Vintier


2

Ruby, 62 58 56 bayt

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

Test edildi irb.

Muhtemelen bunu yapmanın daha iyi bir yolu var, ama bu benim ilk geldiğim şeydi. Golf oynamadaki herhangi bir yardım sizin için çok değerlidir.

düzenleme: Parantez kullanımımın aşırı olduğunu anladım.


Sadece lbir yerde kullanırsın. Satır içi yaparsanız, 3 bayt kaydedersiniz l=;. Ancak çözümün hala benimkinden daha uzun olacak;)
DepressedDaniel

2

Perl 6 ,  46  35 bayt

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

Dene

Expanded:

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

[¹¾JDg¾Q#¼\

Oldukça basit bruteforce:

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

Çevrimiçi deneyin!


2

Python, 39 bayt

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

Daha uzun form:

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

Yinelemeli olarak Python 2 (41 bayt):

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

xGiriş dizesi ile başlayarak a, dönüşümü x -> a + str(len(x))üç kez uygular . Her zaman sabit noktaya ulaşmak için neden üç uygulamaya ihtiyaç duyulduğunu hala anlamadım.


Neden 3 kez? Önce metnin uzunluğunu eklemek, ikincisi sayıyı içerecek olan uzunluğu ayarlamak için, üçüncü ayar ek bir rakam eklemek durumunda.
Tom Viner


2

bash, 47 bayt

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

Bunu bir komut dosyası olarak kaydedin ve giriş dizesini bir argüman olarak iletin.

Bu bir kaba kuvvet uygulamasıdır: işe yarayan bir tane bulana kadar sırayla her sayıyı deneyin.


2

> <> (Balık) 35 bayt

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

Yığına girdi alır, uzunluğu 9.99.999 ... değerlerine göre kontrol eder ve uzunluk yığın boyuna 1 eklemekten büyükse.



1

C #, 77 bayt

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

1
Ben şimdi C # kullanmıyorum, ama return(n+(a+1+c))olarak kullanamaz a=n.Lengthmısın?
Laikoni

Ve ayrıca damla -1gelen int c=(a+1).ToString().Length-1ve +1getiri gelen?
Laikoni

1
Bekle, bu daha büyük test durumlarını doğru ele alıyor mu? 99 test durumu aa...a100yerine geri dönüyor gibi görünüyor . aa...a101a
Laikoni

1

MATL , 11 bayt

`G@Vhtn@>]&

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

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

Ruby, 49 bayt (işlev)

Program (son yeni satır gerekli değildir ve dolayısıyla puanlandırılmaz):

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

İşlev (son satır yeni)

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

1

Faktör, 55 bayt

Parkta yürüyüş var! Soruyu okuduktan hemen sonra kafamda bununla geldim.

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

1

Clojure, 72 bayt

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

1

R, 49 bayt

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

Oldukça basit bir çözüm.


Bu benim için çalışmıyor: Read 1 item Error in nchar(x + 1) : object 'x' not found. Bunun (t<-nchar(a))+...işe yaradığını buldum .
JAD

@JarkoDubbeldam: Benim fena!
Frederic

1

Wolfram, 56

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

Verilen l = StringLength[x]bu ekler l + IntegerLength[l + IntegerLength[l]]için x.



1

ForceLang, 83 bayt

set s io.readln()
label 1
set n 1+n
set t s+n
if t.len=n
 io.write t
 exit()
goto 1
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.