더빙을 함께하세요


24

4chan에서는 인기있는 게임이 제공됩니다. 사이트의 모든 게시물은 순차적 게시물 ID를받습니다. 영향을 미치거나 결정할 수 없기 때문에 사람들은 일반적으로 처음 몇 자리 숫자 인 자신의 게시물 번호를 추측하려고합니다 (적어도 일부). 다른 버전의 게임을 더빙이라고하며, 목표는 숫자 끝에 반복되는 숫자를 얻는 것입니다 (예 : 1234555).

당신의 임무는 그것을 받아들이고 싶다면 포스트 ID를 입력으로 사용하는 프로그램을 작성하는 것입니다 (표준 정수, 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
더빙 게임에 대한 공감! Check'em!
ZombieChowder

답변:


19

매스 매 티카, 29 바이트

산술 솔루션은 어떻습니까?

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

나는 이것이 간단한 Mathematica 접근 방식을 능가한다는 것을 매우 기쁘게 생각합니다.

설명

코드 자체는 9 * n + n % 10을 계산 한 다음 입력을 나누거나 다시 말해서 0을 세는 최대 10의 거듭 제곱을 찾습니다 . nk의 반복 된 숫자로 끝나는 지 , 9 * n + n % 10k의 후행 0 이 있는지 표시해야합니다 .

담당자 숫자는 99999 ( 10 5 -1 ) 와 같은 숫자 를 9 로 나누고 반복 된 숫자를 곱하여 수학적으로 가장 쉽게 표현할 수 있습니다 . 우리는 쓸 수 있도록 N = 10 m * K + D * (10 K -1) / 9 , m ≢ D (모드 10) ,되도록 N이 끝나지 않는 이상 K 반복 숫자. 참고 D가 N = 10 % .

이것을 우리의 공식 9 * n + n % 10에 연결합시다 . 우리는 9 * m * 10 k + d * (10 k -1) + d를 얻습니다 . 끝 의 d 는 취소되었으므로 9 * m * 10 k + d * 10 k = (9 * m + d) * 10 k로 남습니다 . 그러나 9 ≡ -1 (mod 10) 이므로 9 * m + d ≡ d-m (mod 10) . 그러나 우리는 m ≢ d (mod 10)d-m ≢ 0 (mod 10) 이라고 주장했습니다 .

다시 말해, 9 * m + d10으로 나눌 수 없으므로 9 * n + n % 10 = (9 * m + d) * 10 k 를 나누는 10 의 최대 거듭 제곱 은 k , 후행 반복 자릿수

보너스로이 솔루션 은 input에 대한 올바른 결과를 인쇄합니다 0.


1
이 사이트가 MathJax를 지원하기를 원하는시기는 이렇습니다. 굵은 수식은 조판 수식만큼 좋지 않습니다. 그래도 지수 위첨자를 작성하는 데 시간이 걸린 것이 좋습니다.
wizzwizz4

1
@ wizzwizz4 코드 형식을 사용했지만 굵게 (보통 Dennis가 사용)는 그보다 약간 더 읽기 쉽다는 것을 알았습니다. 그러나 동의했다, 그것은 MathJax만큼 좋지 않다.
Martin Ender

13

레티 나 , 9 바이트

&`(.)\1*$

온라인으로 사용해보십시오!

(.)\1*$동일한 문자의 접미사와 일치하는 정규 표현식 인 겹치는 일치 수를 계산합니다 .


2
당신과 당신의 정규식
Christopher

이 수정자를 모두 배워야합니다 (.)(?=\1*$). 방금 갔을 것입니다 .
Neil

1
@DownChristopher 그는 문자 그대로 정규 표현식 기반의 언어를 만들었습니다. 이것은 meme 자료 c를 뛰어 넘습니다.
Rod

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

파이썬 2 , 47 41 바이트

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

온라인으로 사용해보십시오!

36 바이트-보다 유연한 입력

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

온라인으로 사용해보십시오!


와우. 내장을 더 세 심하게 배워야합니다. +1
Dead Possum

2
@DeadPossum dir(object)은 우리의 친구입니다 c :
Rod

BTW는 문자열을 입력으로 사용할 수 없습니다. "입력 방법이 자동으로 문자열을 반환하면 입력이 문자열로 제공 될 것이라고 가정 할 수 없습니다." : C
Dead Possum

1
@DeadPossum 저자가 그것에 대해 마음을 바꿨다고 생각합니다. 댓글이 삭제 된 것 같습니다.
Brian McCutchon

8

자바 스크립트 (ES6), 55 52 32 30 바이트

a=>a.match`(.)\\1*$`[0].length
  • 저장 (19)는 정규식을 대체하여 @MartinEnder 덕분 바이트
  • 태그가있는 템플릿 리터럴을 사용하여 @ user81655 덕분에 2 바이트 절약

마지막 숫자의 마지막 그룹과 일치시키기 위해 정규식 사용

참고 : 처음 게시 주저하지 말고 발언하십시오.

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에 오신 것을 환영합니다! 반복되는 문자를 수동으로 채우는 대신 역 참조를 사용하여 많은 바이트를 절약 할 수 있습니다./(.)\1*$/
Martin Ender

또한 명명되지 않은 함수는 (예를 들어 재귀 호출의 이름이 필요하지 않은 한) 완벽하게 작동하므로에 2 바이트를 저장할 수 있습니다 f=.
Martin Ender

잘 했어! 이것은 확실히 검토를 통과하지만 이것은 골프 수 있습니다
Christopher

@MartinEnder 감사합니다! 나는 아직도 골프를 배우는 법을 배워야한다
Weedoze

@DownChristopher 감사합니다! 나는 다음에 더 잘하려고 노력할 것이다
Weedoze


7

PHP, 47 45 40 바이트

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

로 실행 echo <n> | php -nR '<code>

루프가 여전히 첫 번째 대답보다 작은 것 같습니다. 단순히 마지막과 같은 문자를 계산하십시오. PHP 7.1 의 음수 문자열 오프셋을 사용합니다 .

Titus에 의해 -5 바이트 감사 !


이전 답변 :

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

가장 오른쪽 문자와 일치하는 모든 문자를 오른쪽에서 제거하고 길이의 차이를 계산합니다.


-R$argn5 바이트를 절약 할 수있다.
Titus





6

C (gcc) , 32 29 바이트

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

이것은 내 파이썬 답변 의 포트입니다 .

이것은 gcc와 함께 작동하지만 return문장 의 부족 은 정의되지 않은 동작입니다.

온라인으로 사용해보십시오!


혼란 스럽습니다. 포인터를 전달하지 않고 위치에서 값을 변경하거나 값을 반환하는 방법은 무엇입니까? 이것은 로컬 사본을 변경하여 기능을 사용할 수 없게 만드는 것처럼 보이지만 TIO에서 작동합니다. 또한 바닥 글에 1에 n을 더한 다음 sizeof (int)를 추가하면 int의 전체 너비가 아니라 1 바이트 앞으로 이동하지 않습니까? 분명히 여기서 배울 수있는 몇 가지 트릭이 있으며 아마도 내 자신의 대답에서 첫 번째 트릭을 사용할 수 있습니다.
Bijan

2
모든 return진술은 EAX에 반환 값을 저장하는 것입니다. gcc를 사용하면 변수에 변수를 할당하면 같은 일이 발생합니다. 포인터 산술에 관해서는 int 포인터에 1을 추가하면 다음 바이트가 아닌 다음 int로 이동합니다.
Dennis

반환하는 것이 더 좋을 경우 (int를 사용하는 경우)가 있습니까? 최악의 경우 새로운 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;}

언 골프

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 -- Kevin의 의견에 - 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;}
케빈 Cruijssen


4

MATL , 6 5 바이트

@Luis 덕분에 1 바이트 절약

&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 Ah ok 자신의 댓글을 보지 못했습니다. 업데이트됩니다!
Suever

4

Cubix, 24 19 바이트

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

노트

  • 실제로 입력의 끝에 같은 문자가 몇 개 있는지 계산하므로 실제로 큰 정수와 긴 문자열에서도 작동합니다 (끝에 동일한 문자의 수가 JavaScript의 최대 정밀도보다 작은 한) 10 진수 기준 약 15 자리).
  • 입력이 입력 필드에 들어가고 출력이 출력 필드에 인쇄됩니다

여기 사용해보십시오

설명

먼저 큐브를 확장 해 봅시다

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

실행 단계는 세 단계로 나눌 수 있습니다.

  1. 입력 분석
  2. 문자 비교
  3. 인쇄 결과

1 단계 : 입력

실행되는 처음 두 문자는 AB입니다. A모든 입력을 읽고 스택에 문자 코드로 푸시합니다. 이 작업은 반대로 수행되며 첫 번째 문자는 스택 맨 위에 있고 마지막 문자는 거의 맨 아래에 있습니다. 맨 아래에 -1( EOF)가 표시되며, 문자열 끝에 연속 문자 수에 대한 카운터로 사용됩니다. 마지막 두 문자를 포함하려면 스택의 상단이 필요하므로 루프에 들어가기 전에 스택을 뒤집습니다. 스택의 상단 부분은 이제 다음과 같습니다 ..., 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, 이는 케이스가 다음 명령에서 !스킵 될 것이다 (A이다 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에 의해 실행되는 두 개의 no-ops는 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

자바 스크립트 (ES6), 34 바이트

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

정규식 솔루션보다 짧지 않습니다.

오른쪽에서 왼쪽으로 자릿수를 평가하고 다른 숫자가 발생하면 중지하는 재귀 함수입니다. 결과는 반복 횟수입니다. pundefined수단 첫번째 반복에 n%10-p반환 NaN(falsy). 그 후, p이전 자릿수는와 같습니다 n%10. 현재 숫자 ( n%10)와 이전 숫자 ( p)가 다르면 루프가 종료됩니다.


3

Röda , 12 바이트

{count|tail}

온라인으로 사용해보십시오!

이것은 입력 문자열의 각 문자가 스트림으로 푸시 될 것으로 예상하는 익명 함수입니다 (이것은 최근의 메타 질문의 정신에서 유효하다고 생각합니다 ).

그것은 두 개의 내장 매크로를 사용 count하고 tail:

  1. count 스트림에서 값을 읽고 연속 요소 수를 스트림으로 푸시합니다.
  2. tail 스트림의 마지막 값을 반환합니다.

3

T-SQL, 238214 바이트

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

파워 쉘, 41 바이트

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

char이 문자열의 마지막 char와 일치하지 않을 때까지 역방향 루프를 수행하십시오. 해당 char -1의 색인을 리턴하십시오.

@AdmBorkBork 덕분에 -3-while 대신 for 루프 사용.


2

Mathematica, 33 30 바이트

3 바이트를 절약 한 Greg Martin에게 감사합니다.

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

입력을 문자열로받습니다.

10 진수 (문자 형태)를 가져 와서 동일한 요소의 런으로 나누고, 마지막 런을 가져오고 vector의 합을 취하는 표준 트릭으로 길이를 계산합니다 1^list.


Characters대신에 IntegerDigits?
Greg Martin

@GregMartin 아 그래. 감사.
Martin Ender

당신은 여전히이 질문에 대한 다른 날카로운 Mathematica 골퍼 를 이길 수 없습니다 ;)
Greg Martin

@GregMartin 부끄러운 일입니다. :)
Martin Ender


2

자바 스크립트 (ES6), 39 38 37 27 바이트

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

아마 정규식 기반 솔루션보다 짧지는 않지만 산술을 기반으로 솔루션을 작성하는 것에 저항 할 수 없었습니다. 이 기술은 n % 100 % 11결과가 0이 아닌 값이 될 때까지 반복해서 10으로 나누고 나눈 다음 반복 횟수를 계산합니다. 마지막 두 자리가 같으면이므로 작동 n % 100 % 11합니다 0.


아, 당신은 내 앞에 haha를 완료했습니다! 골프 후 수렴 할 가능성이 높기 때문에 다른 답변을 게시할지 여부는 확실하지 않지만 34 바이트를 사용하는 솔루션은 다음과 같습니다.f=(n,p)=>n%10-p?0:1+f(n/10|0,n%10)
user81655

@ user81655 훌륭합니다. 자유롭게 게시하십시오. 나는 내 것이 완전한 화장 없이는 그것으로 수렴 할 것이라고 생각하지 않으며, 물론 지금 일어나지 않을 당신의 것을 보았 기 때문에 ;-)
ETHproductions


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

파이썬 3- 50 44 바이트

전체 프로그램 (파이썬 3에서는 input()입력에 상관없이 문자열을 반환합니다) :

g=input();print(len(g)-len(g.rstrip(g[-1]))) 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.