การต่อท้ายความยาวสตริง


51

ท้าทาย:

กำหนดสตริงsตัวอักษรa- z, A- Z, 0- 9ผนวกความยาวของsตัวเองนับตัวอักษรเพิ่มเติม (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 หรือส่งคืนเป็นตัวแปรจากฟังก์ชัน


อักขระใดที่สามารถปรากฏในอินพุตได้
Martin Ender

@MartinEnder ตัวอักษรและตัวเลขเท่านั้น, 0-9 และ AZ / az ใช่คุณสามารถมีสตริงที่มีตัวเลขในตอนท้าย ฉันจะเพิ่มกรณีทดสอบสำหรับหนึ่งกรณี
Yodle

คำตอบ:



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เราจะทำการทดสอบตัวละครชับ (0-based) Nของสตริงที่ทำจากกำหนดการเดิมสายป้อนและแสดงทศนิยมของ เราเพิ่มขึ้นเรื่อย ๆNจนกระทั่งตัวละครนี้ไม่มีอยู่อีกต่อไป

ตัวอย่าง:

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

กรณีทดสอบ


ว้าวเจเอสเป็นคนที่เพ้อเจ้อมากกว่า Python
mbomb007

@Annauld ฉันไม่สามารถเข้าใจสิ่งนี้ได้ คุณต้องการอธิบายวิธีการทำงานของรหัสนี้หรือไม่?
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


โอ้โหฉันไม่คิดว่าฉันเคยเห็นคำตอบในหน้ายาง ppcg มาก่อน
pajonk

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

@rasanna เหมาะกับฉันใน Firefox; คุณใช้เบราว์เซอร์ใด
Neil

@Prasanna ทำงานบน Google Chrome ล่าสุด คุณแน่ใจหรือว่าไม่ได้ใช้ IE11 หรือเก่ากว่า Opera หรืออะไรก็ตามที่ไม่รองรับ ES6
Ismael Miguel

ฉันใช้โครเมียมคุณภาพดี ( Version 48.0.2564.97) ฉันจะลองกับ IE เช่นกัน ไม่สามารถอัปเดต chrome ของฉัน - ปัญหาด้านความปลอดภัยในสำนักงาน
Prasanna

5

C, 67 65 61 ไบต์

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

Wandbox


1
โอ้ใช่ฉันควรพิมพ์ได้ ... ยังไงก็ตามขอแสดงความยินดีที่มีวิธีแก้ปัญหา C ที่สั้นกว่า: D +1
cat


3

Pyke 8 ไบต์ ( เวอร์ชั่นเก่า )

.f+liq)+

คำอธิบาย:

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

ลองที่นี่! (เวอร์ชันใหม่ 9 ไบต์)


มันก็จะสร้างความสับสนให้ฉันวิธีฝังเอาท์พุทที่เกิดขึ้นจริงเป็นหนึ่งในคำเตือนหรือข้อความอื่น ๆ :-)
หลุยส์ Mendo

2
ฉันควรจะแก้ไขข้อผิดพลาดของเว็บในลิงค์คัดลอกที่ปิดใช้งานสวิตช์เตือนโดยอัตโนมัติ
Blue

3

Python 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) มากกว่าแค่บวกจำนวนของตัวเลขของa aน่าเสียดายที่มันไม่ได้ให้คำตอบที่ถูกต้องสำหรับอินพุตสตริงว่างโดยไม่มี~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 ไบต์

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

อินพุตจะต้องถูกยกเลิกโดย linefeed (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 ครั้งแรกของฉันและโปรแกรม BF ที่สองของฉัน ข้อเสนอแนะยินดี


1
มันไม่ถูกต้องแล้วมันจะต้องผ่านทุกกรณีทดสอบ
cat

ดังนั้นการรองรับความยาวสูงสุด 999 จะเพียงพอหรือไม่
Forcent Vintier

ข้อมูลจำเพาะระบุว่า "ความยาวตามอำเภอใจ" ซึ่งหมายถึง "ตราบเท่าที่ภาษาของคุณสามารถจัดการหรือไม่มีหน่วยความจำไม่
cat

ล่ามสมองที่คุณใช้มีเซลล์ 8 บิตดังนั้นตราบใดที่อัลกอริทึมของคุณทำงานกับสตริงที่มีความยาวตามอำเภอใจมันก็น่าจะดีถ้ามันล้มเหลวสำหรับสตริงที่มีความยาว256หรือสูงกว่า การส่ง C และ JavaScript จะล้มเหลวเมื่อสตริงยาวเกินไป
เดนนิส

ขอบคุณเดนนิสฉันจะแก้ไขการส่งตามนี้
Forcent Vintier


2

Ruby, 62 58 56 ไบต์

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

ผ่านการทดสอบirbแล้ว

อาจเป็นวิธีที่ดีกว่าในการทำสิ่งนี้ แต่นี่เป็นสิ่งแรกที่ฉันทำ ความช่วยเหลือใด ๆ ในการเล่นกอล์ฟจะได้รับการชื่นชม

แก้ไข:ฉันรู้ว่าการใช้วงเล็บมากเกินไป


คุณใช้lในที่เดียวเท่านั้น หากคุณ inline ว่าคุณจะประหยัด 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 ครั้ง ก่อนอื่นให้เพิ่มความยาวของข้อความต่อท้ายวินาทีเพื่อปรับความยาวเพื่อรวมจำนวนที่สามในกรณีที่การปรับเพิ่มตัวเลขเพิ่มเติมพิเศษ
Tom Viner


2

ทุบตี, 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))เป็นa=n.Length?
Laikoni

และยังลดลง-1จากint c=(a+1).ToString().Length-1และ+1จากการกลับมา?
Laikoni

1
รอสิ่งนี้จัดการกรณีทดสอบที่มีขนาดใหญ่ขึ้นอย่างถูกต้องหรือไม่? ดูเหมือนว่าจะส่งคืนaa...a100แทนที่จะaa...a101เป็นaกรณีทดสอบ99 ข้อ
Laikoni

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

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: แย่จัง!
Frédéric

1

Wolfram, 56

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

ได้รับl = StringLength[x]มันผนวกไปl + IntegerLength[l + IntegerLength[l]]x



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.