รับสำเนาของคุณด้วยกัน


24

ใน 4chan เกมยอดนิยมจะได้รับ โพสต์ทุกรายการในไซต์จะได้รับ ID โพสต์ตามลำดับ เนื่องจากคุณไม่สามารถมีอิทธิพลหรือกำหนดพวกเขาคนพยายามที่จะเดา (อย่างน้อยส่วนหนึ่ง) หมายเลขโพสต์ของตัวเองโดยปกติแล้วจะเป็นตัวเลขสองสามตัวแรก เกมอีกเวอร์ชั่นหนึ่งเรียกว่า dubs และเป้าหมายคือเพื่อให้ได้ตัวเลขที่ซ้ำกันในตอนท้ายของตัวเลข (เช่น 1234555)

งานของคุณถ้าคุณต้องการที่จะยอมรับมันคือการเขียนโปรแกรมที่ใช้รหัสโพสต์เป็นอินพุต (จำนวนเต็มมาตรฐานคุณสามารถสมมติว่าต่ำกว่า 2 ^ 32) และส่งกลับจำนวนหลักซ้ำที่ส่วนท้าย

กฎระเบียบ

  • ช่องโหว่มาตรฐานจะไม่ได้รับอนุญาต
  • โปรแกรมสามารถใช้เป็นฟังก์ชั่น, โปรแกรมเต็มรูปแบบ, คำสั่ง REPL, ใช้งานได้จริงตราบใดที่ไม่จำเป็นต้องใช้โค้ด / อาร์กิวเมนต์ภายนอกที่ไม่ได้ต่อเชื่อมเพื่อรัน
  • อินพุตอาจมาจาก STDIN ฟังก์ชันอาร์กิวเมนต์อาร์กิวเมนต์บรรทัดคำสั่งไฟล์อะไรก็ได้ที่เหมาะกับคุณ

กรณีทดสอบ

Input: 14892093
Output: 1

Input: 12344444
Output: 5

Input: 112311
Output: 2

Input: 888888
Output: 6

Input: 135866667 //Post number I got on /pol/ few days ago, rip
Output: 1

1
เราอนุญาตให้ป้อนข้อมูลเป็นสตริงหรือไม่
Dead Possum

6
@DeadPossum ฉันจะถือว่าได้รับอนุญาตเนื่องจากคุณได้รับสตริงอย่างไรก็ตามถ้าคุณอ่านอินพุตจาก STDIN อาร์กิวเมนต์บรรทัดคำสั่งหรือไฟล์ (ซึ่งเป็นวิธีการอินพุตที่ยอมรับได้ทั้งหมด)
Martin Ender

1
เราสามารถสมมติได้ว่าอินพุตจะมากกว่า 0 หรือไม่?
Martin Ender

1
@MartinEnder ใช่
sagiksp

2
โหวตขึ้นสำหรับเกม Dubs! Check'em!
ZombieChowder

คำตอบ:


19

Mathematica, 29 ไบต์

วิธีการแก้ปัญหาทางคณิตศาสตร์?

IntegerExponent[9#+#~Mod~10]&

ฉันยินดีเป็นอย่างยิ่งที่ได้เห็นว่าสิ่งนี้เป็นวิธีการทางคณิตศาสตร์แบบตรงไปตรงมา

คำอธิบาย

โค้ดเองคำนวณ9 * n + n% 10แล้วค้นหากำลังที่ใหญ่ที่สุดของ10ที่แบ่งอินพุตหรือกล่าวอีกนัยหนึ่งนับจำนวนศูนย์ต่อท้าย เราจำเป็นต้องแสดงว่าnลงท้ายด้วยตัวเลขที่ซ้ำกันk , 9 * n + n% 10มีเลขศูนย์ต่อท้ายk

ตัวเลขตัวแทนจะแสดงทางคณิตศาสตร์ได้ง่ายที่สุดโดยการหารตัวเลขเช่น99999 (ซึ่งคือ10 5 -1 ) ด้วย9แล้วคูณด้วยตัวเลขซ้ำ ดังนั้นเราจึงสามารถเขียนn = m * 10 k + D * (10 k -1) / 9ที่ม. ≢ d (สมัย 10)เพื่อให้แน่ใจว่าnไม่ได้จบในมากขึ้นกว่าkซ้ำตัวเลข โปรดทราบว่าd n

ลองเสียบเข้าไปในสูตรของเรา9 * n + n% 10n เราได้รับ9 * * * * * * * * ม. 10 k + D * (10 k -1) + D dในตอนท้ายจะถูกยกเลิกดังนั้นเราจะเหลือ: 9 * * * * * * * * ม. 10 k + D * 10 k = (9 * m + D) * 10 k แต่9 ≡ -1 (สมัย 10)ดังนั้น9 * m + d ≡ d - เมตร (สมัย 10) แต่เราได้ยืนยันว่าม. ≢ d (สมัย 10)และด้วยเหตุนี้วันที่ - ม. ≢ 0 (สมัย 10)

ในคำอื่น ๆ ที่เราได้แสดงให้เห็นว่า9 ม * + Dไม่หารด้วย10และดังนั้นพลังงานที่ใหญ่ที่สุดของ10ที่แบ่ง9 n * n + 10% = (9 * m + D) * 10 kเป็นk , จำนวนของตัวเลขที่ซ้ำกันต่อท้าย

เป็นโบนัส, การแก้ปัญหานี้พิมพ์ผลที่ถูกต้อง, 0สำหรับการป้อนข้อมูล


1
ถึงเวลาแล้วที่ฉันต้องการให้ไซต์นี้รองรับ MathJax สูตรตัวหนาไม่ดีเท่า ๆ กับเรียงพิมพ์ เป็นเรื่องดีที่คุณใช้เวลาเขียนตัวยกกำลังแทน
wizzwizz4

1
@ wizzwizz4 ฉันเคยใช้การจัดรูปแบบโค้ด แต่ฉันพบว่าตัวหนา (ซึ่งปกติจะใช้โดย Dennis) นั้นสามารถอ่านได้มากกว่านั้นเล็กน้อย แต่เห็นด้วยมันไม่ดีเท่า MathJax
Martin Ender

13

เรติน่า 9 ไบต์

&`(.)\1*$

ลองออนไลน์!

นับจำนวนการจับคู่ที่ทับซ้อนกัน(.)\1*$ซึ่งเป็น regex ที่ตรงกับคำต่อท้ายของอักขระที่เหมือนกัน


2
นี่ต้องเป็น meme: คุณและ regex ของคุณ
Christopher

ฉันต้องเรียนรู้การปรับเปลี่ยนทั้งหมดเหล่านี้ - ฉันเพิ่งจะไป(.)(?=\1*$)แล้ว
Neil

1
@DownChristopher เขาอย่างแท้จริงทำให้ภาษา regex ตามไปกว่ามส์ควัสดุ:
ร็อด

1
@Neil ถ้ามันปลอบใจใด ๆ ความพยายามครั้งแรกของฉันคือ(?=(.)\1*$)(ดังนั้นโดยทั่วไปเช่นเดียวกับคุณ)
Martin Ender

1
ใช่แล้วขอบคุณ!
Neil

9

Brachylogขนาด 4 ไบต์

ẹḅtl

ลองออนไลน์!

คำอธิบาย

ẹ       Elements: split to a list of digits
 ḅ      Blocks: group consecutive equal digits into lists
  t     Tail: take the last list
   l    Length: Output is the length of that last list

หากทำงานโดยตรงกับจำนวนเต็ม (และฉันไม่แน่ใจว่าทำไมฉันจึงไม่ใช้มันเพื่อให้เป็นเช่นนั้น) นี่จะเป็นเพียง 3 ไบต์เนื่องจากไม่จำเป็นต้องใช้


9

Python 2 , 47 41 ไบต์

lambda s:len(`s`)-len(`s`.rstrip(`s%10`))

ลองออนไลน์!

36 ไบต์ - สำหรับอินพุตที่ยืดหยุ่นมากขึ้น

lambda s:len(s)-len(s.rstrip(s[-1]))

ลองออนไลน์!


ว้าว. ฉันต้องเรียนรู้การสร้างตัวเองอย่างตั้งใจมากขึ้น +1
Possum ที่ตายแล้ว

2
@DeadPossum dir(object)เป็นเพื่อนของเรา c:
Rod

BTW เราไม่ได้รับอนุญาตให้ใช้สายอักขระเป็นอินพุต "ถ้าวิธีการป้อนข้อมูลของคุณส่งคืนสตริงโดยอัตโนมัติคุณต้องแน่ใจ แต่คุณไม่สามารถสันนิษฐานได้ว่าอินพุตจะถูกจัดให้เป็นสตริง" : C
Dead Possum

1
@DeadPossum ฉันคิดว่าผู้เขียนเปลี่ยนใจเกี่ยวกับเรื่องนี้ ความคิดเห็นดูเหมือนจะถูกลบ
Brian McCutchon

8

Javascript (ES6), 55 52 32 30 ไบต์

a=>a.match`(.)\\1*$`[0].length
  • บันทึกแล้ว19ไบต์ด้วย @MartinEnder โดยแทนที่ regex
  • บันทึก2ไบต์ด้วย @ user81655 โดยใช้ตัวอักษรเทมเพลตที่ติดแท็ก

ใช้ regex เพื่อจับคู่กลุ่มสุดท้ายของหลักสุดท้าย

หมายเหตุ: การโพสต์ครั้งแรก อย่าลังเลที่จะพูด

f=a=>a.match`(.)\\1*$`[0].length


console.log(f("14892093"));//1
console.log(f("12344444"));//5
console.log(f("112311"));//2
console.log(f("888888"));//6
console.log(f("135866667 "));//1

ยินดีต้อนรับสู่ PPCG! คุณสามารถบันทึกไบต์จำนวนมากโดยใช้ backreference แทนการป้อนอักขระซ้ำด้วยตนเอง:/(.)\1*$/
Martin Ender

นอกจากนี้ยังมีฟังก์ชั่นที่ไม่มีชื่อจะสมบูรณ์ดี (เว้นแต่คุณจะต้องมีชื่อสำหรับการโทร recursive ตัวอย่าง) f=เพื่อให้คุณสามารถบันทึกไบต์ที่สองใน
Martin Ender

เยี่ยมมาก! สิ่งนี้ผ่านการตรวจสอบอย่างแน่นอน แต่สิ่งนี้สามารถเล่นกอล์ฟได้
Christopher

@ มาร์ตินเอนเดอร์ขอบคุณ! ฉันยังต้องเรียนรู้วิธีการเล่นกอล์ฟ
Weedoze

@DownChristopher ขอบคุณ! ฉันจะพยายามทำให้ดีขึ้นในครั้งต่อไป
Weedoze


7

PHP, 47 45 40 ไบต์

while($argn[-++$i]==$argn[-1]);echo$i-1;

ทำงานด้วย echo <n> | php -nR '<code>

ดูเหมือนว่าลูปจะยังเล็กกว่าคำตอบแรกของฉัน เพียงนับตัวอักษรที่มีค่าเท่ากับล่าสุด สิ่งนี้ใช้ออฟเซ็ตสตริงเชิงลบของPHP 7.17.1

-5 ไบต์โดย Titus ขอบคุณมาก!


คำตอบเก่า:

<?=strlen($a=$argv[1])-strlen(chop($a,$a[-1]));

ลบออกจากด้านขวาทุกตัวละครที่ตรงกับตัวละครที่เหมาะสมที่สุดและคำนวณความแตกต่างในความยาว


-Rและ$argnสามารถบันทึก 5 ไบต์
ติตัส




6

Perl 5 , 22 ไบต์

21 ไบต์ของรหัสเมือง + -pธง

/(.)\1*$/;$_=length$&

ลองออนไลน์!

/(.)\1*$/รับตัวเลขที่เหมือนกันครั้งสุดท้ายแล้ว$_=length$&กำหนดความยาวให้$_ซึ่งพิมพ์โดยปริยายด้วยการ-pตั้งค่าสถานะ


6

C (GCC) , 32 29 ไบต์

f(x){x=x%100%11?1:-~f(x/10);}

นี่คือพอร์ตของคำตอบหลามของฉัน

งานนี้กับ gcc แต่ขาด returnคำสั่งคือพฤติกรรมที่ไม่ได้กำหนด

ลองออนไลน์!


ฉันสับสนทำไมคุณไม่ผ่านตัวชี้และเปลี่ยนค่าที่ตำแหน่งหรือเพียงแค่คืนค่า ดูเหมือนว่าจะเป็นเพียงการเปลี่ยนสำเนาโลคัลซึ่งจะทำให้ฟังก์ชั่นใช้งานไม่ได้ แต่จะทำงานบน TIO คุณเพิ่ม 1 ถึง n ในส่วนท้ายแทนที่จะเป็น sizeof (int) นั่นจะไม่ย้ายมันไปข้างหน้า 1 ไบต์แทนที่จะเต็มความกว้างของ int หรือไม่ เห็นได้ชัดว่ามีเทคนิคบางอย่างที่ฉันสามารถเรียนรู้ได้ที่นี่และฉันอาจใช้คำแรกในคำตอบของฉันเอง
Bijan

2
returnคำสั่งทั้งหมดจะเก็บค่าส่งคืนใน EAX ด้วย gcc การกำหนดให้ตัวแปรเกิดขึ้นเพื่อทำสิ่งเดียวกัน สำหรับตัวชี้ทางคณิตศาสตร์เมื่อคุณเพิ่ม 1 ลงในตัวชี้ int มันจะย้ายไปยัง int ถัดไปไม่ใช่ไบต์ถัดไป
Dennis

มีกรณีใดบ้าง (เมื่อใช้ ints) เมื่อมันจะดีกว่าที่จะกลับมาดูเหมือนว่าในกรณีที่เลวร้ายที่สุดที่คุณจะสร้าง int ใหม่และมอบหมายมัน
Bijan

@Bijan C คอมไพเลอร์จะปรับการเข้าถึงหน่วยความจำโดยตรงให้ตรงกับขนาดของอะตอมดั้งเดิมที่มีปัญหา - ฉันจำไม่ได้ว่าเป็นมาตรฐานหรือไม่
cat


5

C # , 63 62 ไบต์


แข็งแรงเล่นกอล์ฟ

i=>{int a=i.Length-1,b=a;while(a-->0&&i[a]==i[b]);return b-a;}

Ungolfed

i => {
    int a = i.Length - 1,
        b = a;

    while( a-- > 0 && i[ a ] == i[ b ] );

    return b - a;
}

อ่านได้ไม่ดี

i => {
    int a = i.Length - 1, // Store the length of the input
        b = a ;           // Get the position of the last char

    // Cycle through the string from the right to the left
    //   while the current char is equal to the last char
    while( a-- > 0 && i[ a ] == i[ b ] );

    // Return the difference between the last position
    //   and the last occurrence of the same char
    return b - a;
}

รหัสเต็ม

using System;

namespace Namespace {
   class Program {
      static void Main( String[] args ) {
         Func<String, Int32> f = i => {
            int a = i.Length - 1, b = a;
            while( a-- > 0 && i[ a ] == i[ b ] );
            return b - a;
         };

         List<String>
            testCases = new List<String>() {
               "14892093",
               "12344444",
               "112311",
               "888888",
               "135866667"
            };

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

         Console.ReadLine();
      }
   }
}

ข่าว

  • v1.1 - - 1 byte - ด้วยความเห็นของเควิน
  • v1.0 -  63 bytes- โซลูชั่นเริ่มต้น

หมายเหตุ

ไม่มีอะไรให้เพิ่ม


+1 คุณสามารถตีกอล์ฟได้ทีละ 1 ไบต์ เช่นนี้:i=>{int a=i.Length-1,b=a;while(a-->0&&i[a]==i[b]);return b-a;}
Kevin Cruijssen


4

MATL , 6 5 ไบต์

บันทึก 1 ไบต์ขอบคุณ @Luis

&Y'O)

ลองใช้ที่MATL Online

คำอธิบาย

        % Implicitly grab input as a string
&Y'     % Perform run-length encoding on the string but keep only the second output
        % Which is the number of successive times an element appeared
O)      % Grab the last element from this array
        % Implicitly display

ฉันลืมไปแล้วว่า&ทำแบบนั้นY':-D ทำไมไม่ลองใช้อินพุตเป็นสตริงที่อยู่ในเครื่องหมายคำพูดและกำจัดj?
Luis Mendo

@ LuisMendo ฉันไม่แน่ใจว่าฉันสามารถทำเช่นนั้นได้หรือไม่เนื่องจากความท้าทายกล่าวอย่างชัดเจนว่าข้อมูลนั้นเป็น "จำนวนเต็ม"
Suever

ฉันสันนิษฐานจากความคิดเห็นของ Martinและจากกฎเริ่มต้นที่อนุญาต แต่ฉันไม่แน่ใจจริงๆ
Luis Mendo

@LuisMendo อาตกลงไม่เห็นความคิดเห็นของเขา จะอัปเดต!
Suever

4

Cubix, 24 19 ไบต์

)uO)ABq-!wpUp)W.@;;

บันทึก

  • จริง ๆ แล้วนับว่าอักขระตัวเดียวกันมีจำนวนเท่าใดในตอนท้ายของอินพุตดังนั้นการทำงานนี้สำหรับจำนวนเต็มขนาดใหญ่และสตริงที่ยาวมากเช่นกัน (ตราบใดที่จำนวนอักขระเดียวกันที่ส่วนท้ายมีขนาดเล็กกว่าความแม่นยำสูงสุดของ JavaScript ( ประมาณ 15 หลักในฐาน -10)
  • อินพุตไปในฟิลด์อินพุตเอาต์พุตถูกพิมพ์ไปยังฟิลด์เอาต์พุต

ลองที่นี่

คำอธิบาย

ก่อนอื่นมาขยายลูกบาศก์กันก่อน

    ) u
    O )
A B q - ! w p U
p ) W . @ ; ; .
    . .
    . .

ขั้นตอนในการดำเนินการสามารถแบ่งออกเป็นสามขั้นตอน:

  1. แยกวิเคราะห์
  2. เปรียบเทียบตัวละคร
  3. ผลการพิมพ์

เฟส 1: อินพุต

ตัวละครสองตัวแรกที่จะดำเนินการอยู่และA อ่านอินพุตทั้งหมดและส่งเป็นรหัสอักขระไปยังสแต็ก โปรดทราบว่าสิ่งนี้ทำในสิ่งที่ตรงกันข้ามอักขระตัวแรกจะจบลงที่ด้านบนสุดของสแต็กอักขระตัวสุดท้ายเกือบอยู่ที่ด้านล่าง ที่ด้านล่างสุด(BA-1EOF ) จะถูกวางไว้ซึ่งจะใช้เป็นตัวนับจำนวนตัวอักษรต่อเนื่องที่ส่วนท้ายของสตริง เนื่องจากเราต้องการด้านบนของสแต็กเพื่อให้มีอักขระสองตัวสุดท้ายเราจึงย้อนกลับสแต็กก่อนเข้าสู่ลูป โปรดทราบว่าตอนนี้ส่วนบนสุดของสแต็กมีลักษณะดังนี้:..., C[n-1], C[n], -1โปรดทราบว่าส่วนบนของสแต็คในขณะนี้ดูเหมือนว่า:

ตำแหน่งของ IP บนคิวบ์คือตำแหน่งที่Eอยู่และชี้ไปทางขวา คำแนะนำทั้งหมดที่ยังไม่ได้ดำเนินการถูกแทนที่ด้วย no-ops (หยุดเต็ม)

    . .
    . .
A B E . . . . .
. . . . . . . .
    . .
    . .

ขั้นตอนที่ 2: การเปรียบเทียบตัวละคร

สแต็คคือ..., C[a-1], C[a], counterโดยที่counterตัวนับเพื่อเพิ่มเมื่อตัวละครสองตัวที่จะตรวจสอบ ( C[a]และC[a-1]) เท่ากัน IP เข้าสู่ลูปนี้เป็นครั้งแรกที่Sตัวละครเลื่อนไปทางขวา Eตัวละครที่เป็นตำแหน่งที่ IP จะสิ้นสุด (ชี้ขวา) เมื่อC[a]และC[a-1]ไม่ได้มีค่าเดียวกันซึ่งหมายความว่าลบC[a]จากการC[a-1]ไม่ได้ให้0ในกรณีที่การเรียนการสอนต่อไปนี้!จะถูกข้ามไป (ซึ่งเป็นw)

    . .
    . .
. S q - ! w E .
p ) W . . ; ; .
    . .
    . .

นี่คือคำแนะนำที่จะถูกดำเนินการในระหว่างการวนเต็ม:

q-!;;p) # Explanation
q       # Push counter to the bottom of the stack
        #     Stack (counter, ..., C[a-1], C[a])
 -      # Subtract C[a] from C[a-1], which is 0 if both are equal
        #     Stack (counter, ..., C[a-1], C[a], C[a-1]-C[a])
  !     # Leave the loop if C[a-1]-C[a] does not equal 0
   ;;   # Remove result of subtraction and C[a] from stack
        #     Stack (counter, ..., C[a-1])
     p  # Move the bottom of the stack to the top
        #     Stack (..., C[a-1], counter)
      ) # Increment the counter
        #     Stack (..., C[a-1], counter + 1)

และจากนั้นก็วนรอบ

ขั้นตอนที่ 3: ผลการพิมพ์

counter, ..., C[a-1]-C[a]ตั้งแต่เราออกจากวงต้นสแต็คที่มีลักษณะเช่นนี้ มันเป็นเรื่องง่ายที่จะพิมพ์เคาน์เตอร์ แต่เราจะต้องเพิ่มขึ้นนับครั้งเพราะเราไม่ได้ทำมันในประโยคสุดท้ายของวงและอีกครั้งเพราะเราเริ่มต้นนับที่แทน-1 0เส้นทางบนคิวบ์จะเป็นแบบนี้เริ่มจากSชี้ไปทางขวา ไม่มีตัวเลือกสองตัวที่ดำเนินการโดย IP จะถูกแทนที่ด้วยลูกศรที่ชี้ไปในทิศทางของ IP

    ) u
    O )
. B . . . S p U
. ) . . @ . . .
    > >
    . .

คำแนะนำจะดำเนินการตามลำดับต่อไปนี้ โปรดทราบว่าB)คำแนะนำในตอนท้ายเปลี่ยนสแต็ก แต่ไม่ส่งผลกระทบต่อโปรแกรมเนื่องจากเรากำลังจะยกเลิกมันและเราจะไม่ใช้กองซ้อนอีก

p))OB)@ # Explanation
p       # Pull the counter to the top
        #     Stack: (..., counter)
 ))     # Add two
        #     Stack: (..., counter + 2)
   O    # Output as number
    B)  # Reverse the stack and increment the top
      @ # End the program

Alea iacta est


3

แบตช์ 91 ไบต์

@set s=-%1
@set n=1
:l
@if %s:~-2,1%==%s:~-1% set s=%s:~,-1%&set/an+=1&goto l
@echo %n%

การ-ป้องกันไม่ให้การทดสอบวิ่งออกจากจุดเริ่มต้นของสตริง


3

JavaScript (ES6), 34 ไบต์

f=(n,p)=>n%10-p?0:1+f(n/10|0,n%10)

ไม่สั้นกว่าโซลูชัน regex

ฟังก์ชั่นวนซ้ำซึ่งประเมินตัวเลขจากขวาไปซ้ายหยุดเมื่อพบตัวเลขที่แตกต่างกัน ผลลัพธ์คือจำนวนการวนซ้ำ pอยู่undefinedในการทำซ้ำครั้งแรกซึ่งหมายถึงn%10-pผลตอบแทนNaN(เท็จ) หลังจากนั้นเท่ากับบาทก่อนหน้านี้มีp n%10เมื่อตัวเลขปัจจุบัน ( n%10) และก่อนหน้า ( p) แตกต่างกันการวนซ้ำจะสิ้นสุดลง


3

Rödaขนาด 12 ไบต์

{count|tail}

ลองออนไลน์!

นี่เป็นฟังก์ชันที่ไม่ระบุตัวตนซึ่งคาดว่าอักขระของสตริงอินพุตแต่ละตัวจะถูกส่งไปยังสตรีม (ฉันคิดว่านี่เป็นสิ่งที่ถูกต้องในใจ คำถามเมตาล่าสุด )

มันใช้สอง builtins: countและtail:

  1. count อ่านค่าจากสตรีมและเพิ่มจำนวนองค์ประกอบต่อเนื่องไปยังสตรีม
  2. tail ส่งคืนค่าสุดท้ายในสตรีม

3

T-SQL, 238 214 ไบต์

declare @ varchar(max) = '' declare @i int=0, @e int=0, @n int=right(@,1), @m int while (@i<=len(@)) begin set @m=(substring(@,len(@)-@i,1)) if (@n=@m) set @e=@e+1 else if (@i=0) set @e=1 set @i=@i+1 end select @e

หรือ:

declare @ varchar(max) = '12345678999999'
declare 
    @i int = 0,
    @e int = 0,
    @n int = right(@,1),
    @m int

while (@i <= len(@))
begin
    set @m = (substring(@,len(@)-@i,1))
    if (@n = @m) set @e = @e + 1
    else
    if (@i) = 0 set @e = 1
    set @i = @i + 1
end
select @e

2

Java 7, 78 ไบต์

int c(int n){return(""+n).length()-(""+n).replaceAll("(.)\\1*$","").length();}

ลองที่นี่

ฉันลองบางสิ่งโดยใช้การเรียกซ้ำหรือวนรอบ แต่ทั้งคู่จบลงด้วย 100 ไบต์ขึ้นไป ..


2

Powershell, 41 ไบต์

for($n="$args";$n[-1]-eq$n[-++$a]){};$a-1

วนกลับตรงไปข้างหน้าย้อนกลับจนกว่าตัวอักษรไม่ตรงกับตัวอักษรตัวสุดท้ายในสตริงส่งคืนดัชนีของตัวอักษรตัวที่ 1

-3 ต้องขอบคุณ @AdmBorkBork - ใช้การวนซ้ำแทนสักครู่


2

Mathematica, 33 30 ไบต์

ขอบคุณ Greg Martin ที่บันทึก 3 ไบต์

Tr[1^Last@Split@Characters@#]&

รับอินพุตเป็นสตริง

ได้รับตัวเลขทศนิยม (ในรูปแบบของตัวอักษร) 1^listแยกพวกเขาเข้าไปในการทำงานขององค์ประกอบที่เหมือนกันได้รับการดำเนินการที่ผ่านมาและคำนวณระยะเวลาที่มีเคล็ดลับมาตรฐานของการใช้ผลรวมของเวกเตอร์


CharactersแทนIntegerDigits?
Greg Martin

@ GregMartin Ah ใช่ฉันเดา ขอบคุณ
Martin Ender

คุณยังไม่ได้เอาชนะนักกอล์ฟ Mathematica ที่ฉลาดคนอื่นสำหรับคำถามนี้;)
Greg Martin

@ GregMartin ช่างเป็นความอัปยศ :)
Martin Ender


2

JavaScript (ES6), 39 38 37 27 ไบต์

f=n=>n%100%11?1:1+f(n/10|0)

อาจจะไม่สั้นกว่าโซลูชันที่อิงจาก regex แต่ฉันไม่สามารถต้านทานการเขียนโซลูชันโดยใช้เลขคณิตทั้งหมด เทคนิคคือการใช้ซ้ำแล้วn % 100 % 11หารด้วย 10 จนกว่าผลลัพธ์จะไม่เป็นศูนย์จากนั้นนับซ้ำ งานนี้เพราะถ้าตัวเลขสองหลักสุดท้ายเหมือนกันจะเป็นn % 100 % 110


อ่าคุณทำเสร็จก่อนหน้าฉันฮ่าฮ่า! ฉันไม่แน่ใจว่าจะโพสต์คำตอบอื่นเนื่องจากพวกเขาจะมาบรรจบกันมากที่สุดหลังจากเล่นกอล์ฟ แต่นี่เป็นวิธีแก้ปัญหาของฉันโดยใช้ 34 ไบต์:f=(n,p)=>n%10-p?0:1+f(n/10|0,n%10)
user81655

@ user81655 เยี่ยมมากอย่าลังเลที่จะโพสต์ ฉันไม่คิดว่าของฉันจะเข้าหากันโดยที่ไม่มีการแปลงโฉมที่สมบูรณ์และแน่นอนว่าตอนนี้ฉันได้เห็นคุณแล้วว่าจะไม่เกิดขึ้น ;-)
ETHproductions

2

Haskell , 33 ไบต์

f(h:t)=sum[1|all(==h)t]+f t
f _=0

ลองออนไลน์!

รับอินพุตสตริง ตัดอักขระตัวแรกออกซ้ำ ๆ และเพิ่ม 1 ถ้าอักขระทั้งหมดในคำต่อท้ายเท่ากับอักขระตัวแรก


2

R, 35 ไบต์

rle(rev(charToRaw(scan(,''))))$l[1]

คำอธิบายสั้น ๆ

                  scan(,'')         # get input as a string
        charToRaw(         )        # convert to a vector of raws (splits the string)
    rev(                    )       # reverse the vector
rle(                         )$l[1] # the first length from run length encoding

2

Befunge-98 , 19 ไบต์

01g3j@.$~:01p-!j$1+

ลองออนไลน์!

สิ่งนี้อาจสั้นลงหากฉันจัดการเพื่อใช้สแต็กเท่านั้น

มันทำงานอย่างไร:

01g3j@.$~:01p-!j$1+
01g                 ; Get the stored value (default: 32)                 ;
   3j               ; Skip to the ~                                      ;
        ~           ; Get the next character of input                    ;
         :01p       ; Overwrite the stored value with the new char       ;
             -!     ; Compare the old value and the new                  ;
               j$   ; Skip the $ when equal, else pop the counter        ;
                 1+ ; Increment the counter                              ;

; When the input runs out, ~ reflects the IP and we run: ;
   @.$
     $              ; Pop the extraneous value (the stored value) ;
   @.               ; Print the number and exit                   ;

2

Python 3 - 50 44 ไบต์

โปรแกรมเต็มรูปแบบ (ใน Python 3 input()ส่งคืนสตริงโดยไม่คำนึงถึงอินพุต):

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