숫자 범위를 취소


34

숫자가 주어지면 ~ n범위를 만드는 것이 매우 간단 0합니다 n-1. 실제로 많은 언어에서이 작업을 기본 제공 기능으로 제공합니다.

다음 CJam 프로그램은 정수를 읽은 다음 이러한 범위를 인쇄합니다 ( 온라인 시도 ).

ri,

구분 기호 없이 숫자 인쇄합니다 .

도전

당신의 임무는이 과정을 반대로하는 것입니다. 범위를 나타내는 문자열이 주어진 경우 해당 범위를 생성하는 데 사용되는 숫자를 반환하는 프로그램을 작성해야합니다.

사양

  • 숫자는 구분 기호없이 제공됩니다.
  • 문자열이 유효한 범위를 형성한다고 가정 할 수 있습니다.
  • 범위에 0 또는 1 기반 색인을 사용할 수 있습니다.
  • 올바른 출력이 32,767을 초과하지 않는다고 가정 할 수 있습니다 (따라서 유효한 입력의 길이는 152,725보다 길지 않습니다).
  • 올바른 출력이 항상 양수라고 가정 할 수 있으므로 0 또는 음수를 처리 할 필요가 없습니다.

이것은 이므로 가장 짧은 경쟁 답변 (바이트 단위로 측정)이 이깁니다.

테스트 사례

0 인덱스 :

0123 -> 4
0 -> 1
0123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 -> 101

1- 색인 :

1234 -> 4
1 -> 1
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 -> 100

하강 범위가 있습니까? 음수로 작동해야합니까?
Daniel

@Daniel No. 언급하는 것을 잊었습니다. 추가되었습니다.
Esolanging 과일

4
우리 프로그램이 실제로 빈 문자열을 처리해야합니까? 나는 그것을 무시하는 것이 합리적이라고 생각합니다. 일부 답변은 해당 규칙에서 전혀 도움이되지 않습니다.
Mr. Xcoder

출력이 숫자의 문자열 표현 일 수 있습니까 (예 : 원래 문자열에서 하위 문자열로 사용)
user2390246

@ user2390246 예, 좋습니다.
Esolanging 과일

답변:




8

05AB1E , 7 6 바이트

1- 색인.

āηJsk>

온라인으로 사용해보십시오! 또는 테스트 스위트

설명

ā        # push range [1 ... len(input)]
 η       # compute prefixes of the range
  J      # join each prefix to a string
   sk    # get index of the input in the list of prefixes
     >   # increment

내가 뭔가 잘못하고 있습니까? 이것은 0입력에 상관없이 반환되는 것 같습니다 : tio.run/##MzBNTDJM/f8/3efcdi/PbLv//5UMjYxNTM3MLSwNDZQA
Shaggy

@Shaggy : 당신처럼해야 할 또는 작은 따옴표는 입력의 한 부분으로 간주한다.
Emigna

아, 05AB1E의 문자열 입력은 삼중 따옴표로 묶어야합니까?
Shaggy

@Shaggy : 입력에 빈 문자열이나 줄 바꿈을 원하면 예. 그렇지 않으면 전혀 인용 할 필요가 없습니다.
Emigna

[NÝJQ#]N내 아이디어 였지만 작동하기 때문에 더 좋습니다 "".
매직 문어 Urn

7

자바 8, 66 59 바이트

s->{int r=0;for(String c="";!c.equals(s);c+=r++);return r;}

0 인덱스

@ PunPun1000 덕분에 -7 바이트 .

입력이 항상 유효하다고 가정 할 수 있기 때문에 입력 길이를 확인하는 것만으로도 이것이 단축 될 수 있다고 생각합니다. 아직도 알아내는 중입니다. 이것을 알아낼 수 없으며 어쨌든 유용하기 위해 Java에서 너무 많은 바이트가 필요할 것입니다 (1 색인 입력의 끝 부분 문자열을 반환하는 것과 동일).

설명:

여기에서 시도하십시오.

s->{                 // Method with String parameter and integer return-type
  int r=0;           //  Result-integer
  for(String c="";   //  Check-String
      !c.equals(s);  //  Loop as long as the sum-String doesn't equal the input-String
    c+=r++           //   Append the number to the the Check-String,
                     //   and increase the Result-integer by 1
  );                 //  End of loop
  return r;          //  Return the result-integer
}                    // End of method

1
59 바이트 : TIO
PunPun1000

필요한 부분 문자열의 길이를 얻기 위해 숫자의 수를 세거나 길이의 로그를 사용하는 것과 같은 터무니없는 지름길이있을 것입니다 ... 나는 이것에 대한 나쁜 생각을 가지고있는 것 같습니다.
JollyJoker

6

Brachylog , 9 7 바이트

⟦kṫᵐc,Ẹ

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

인덱스가 0입니다.

설명

여기에서는 Output 변수를 통해 입력을 전달하고 Input 변수를 통해 결과에 액세스합니다.

⟦          The result is the input to a range…
 k         …with the last element removed…
  ṫᵐ       …which when all elements are casted to string…
    c      …and are then concatenated results in the input string
     ,Ẹ    (Append the empty string, this is necessary for it to work in the case where the 
             input is the empty string)


5

Japt , 8 바이트

Japt에서 함수 메소드를 사용하기 시작했습니다.

인덱스가 0입니다. 입력을 문자열, 정수 또는 0 또는 1 개의 요소를 포함하는 배열로 취할 수 있습니다.

_o ´U}a

그것을 테스트


설명

문자열의 암시 적 입력 U.

_     }a

다음과 >=0같은 함수를 통과하면 true를 반환 하는 첫 번째 정수 를 가져옵니다.

o

0현재 정수보다 1 이하 의 정수 배열을 생성합니다 ...

¬

문자열에 조인 ...

¥U

해당 문자열이와 일치하는지 확인합니다 U.

결과 정수의 내재적 출력.


대체, 8 바이트

ÊÇo ¬ÃbU

그것을 테스트


4

, 13 바이트

I⌕E⁺ψθ⪫EκIλωθ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

          λ     Inner map variable (μ inner map index also works)
         I      Cast to string
        κ       Outer map index
       E        Map over implicit range
      ⪫    ω    Join result
     θ          Input string
   ⁺ψ           Plus an extra character
  E             Map over each character
 ⌕          θ   Find the index of the original string
I               Cast from integer to string
                Implicit print

4

하스켈, 40 37 바이트

f s=[n|n<-[0..],(show=<<[0..n])>s]!!0

0부터 시작하는 범위를 반대로하는 기능입니다.

3 바이트를 절약 한 Laikoni에게 감사합니다!

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


1
목록 이해력이있는 37 바이트 : f s=[n|n<-[0..],(show=<<[0..n])>s]!!0.
Laikoni

1
그리고 두 번째 패턴 가드를 사용하여 바이트를 절약 할 수 있습니다 |m<-n+1=s!m.
Laikoni


2

자바 스크립트 (ES6), 32 31 바이트

Challenger5 덕분에 1 바이트 절약

f=(s,r=n='')=>r<s?f(s,r+n++):+n

테스트 사례


1
다시, 사전을 문자열로 비교할 수 있습니까?
Esolanging 과일

나는 카레를 제안하려고했지만 그것은 더 이상 합의가 아닌 것처럼 보인다 :(
Shaggy


1
@EriktheOutgolfer 표준 카레는 괜찮지 만 Shaggy는 또는 같은 전화가 필요한 이 특별한 형태의 카레 를 참조했습니다 . (덧붙여, 나는 모두 필요하기 때문에이 특별한 경우 일 것이라고 모르겠어요 및 초기화 할 수 있습니다.)f(payload_param)()f(payload_param)(some_constant)rn
Arnauld

2

수학, 46 바이트

Array[""<>ToString/@Range@#&,2^15]~Position~#&

1- 색인

입력

[ "12345678910"]


2

루비 , 51 50 46 바이트

->n{(0..4e4).map{|x|(1..x).to_a.join}.index n}

(이것은 내 첫 루비 프로그램이므로 더 쉽게 골프를 칠 수 있어야한다)

@Nnnes 덕분에 -4 바이트


1
마지막 괄호 세트는 필요하지 않습니다 : .index(gets)=> .index gets. 4e4대신 사용할 수 8**5있지만 속도가 느려질 수 있습니다. 루비 답변에 익명의 람다를 사용하는 것이 일반적으로 괜찮으며 종종 몇 바이트를 절약 합니다. 온라인에서 사용해보십시오! (시간이 초과되지 않도록 제한을 100으로 변경했습니다.)
Nnnes

2

파이썬 2 , 43 바이트

f=lambda s,i=1,r='':r<s and-~f(s,i+1,r+`i`)

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


파이썬 2 , 43 바이트

f=lambda s,i=1:s>''and-~f(s[len(`i`):],i+1)

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


파이썬 , 46 바이트

lambda s:s[-sum(i*'0'in s for i in range(5)):]

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

다른 전략. 끝 0에서 s 의 가장 큰 런 길이와 동일한 문자 수를 가져옵니다 .


파이썬 , 46 바이트

f=lambda s,c=0:c*'0'in s and f(s,c+1)or s[-c:]

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

위의 재귀 버전.


당신의 "다른 전략"(매우 영리하고, btw)은 챌린지의 진술에서 요구되는 0- 기반 범위에서 작동합니까? 내부 비트 ... i*'0'in s[1:] for ...또는 이와 유사한 것을 변경해야합니까 ?
Luca Citi

@LucaCiti 그것은 1 기반 범위에서 작동하며 도전은 우리가 선택할 수 있습니다.
xnor

물론입니다. 초기 설명 만 보았고 1 기반 범위를 허용하는 부분을 놓쳤습니다.
Luca Citi

2

R , 47 바이트

n=nchar(scan(,""));which(cumsum(nchar(1:n))==n)

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

1- 색인


3
"if"대신 사용ifelse
Giuseppe

좋은 지적! 그러나 OP는 이제 0 사례를 처리하기위한 요구 사항을 제거하여 해당 비트를 완전히 제거 할 수 있습니다.
user2390246

1
nchar숫자에 대해 예상 한대로 입력을 숫자로 사용할 수 있습니다. 그러나 전체 프로그램으로 실행할 때는 출력되지 않으므로 출력 인쇄를 처리해야합니다.
JAD

1
n=nchar(scan());cat(which(cumsum(nchar(1:n))==n))
JAD

2

APL (Dyalog) , 17 11 바이트

-6 감사는 바이트 NGN을 .

{,\⍕¨⍳≢⍵}⍳⊂

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

⍳⊂에서 전체 인수  의 ɩ ndex를 찾으십시오.

{} 이 익명 함수의 결과 :

 인수의 길이

그 때까지 nt ntegers

⍕¨ 각 형식 (문자열)

,\ 그것들의 누적 연결


아, 나는 길에서 벗어날 수 있다는 것을 잊었다.
Zacharý

{,\⍕¨⍳≢⍵}⍳⊂(11 자)
ngn

@ngn 바보. 당연하지!
Adám

2

펄 5 , 19 바이트

18 바이트 코드 + 1 -p.

$i++while s/$i\B//

1 기반 인덱싱을 사용합니다. @ nwellnhof훨씬 더 나은 접근 방식 덕분에 -7 바이트 !

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

설명

$\print각 명령문 다음에 자동으로 처리 되는 특수 변수 이므로 숫자를 저장하기 위해이를 사용 하여 원하는 출력을 포함 하도록 업데이트 할 필요가 없습니다 $_( -p플래그 기능의 일부로 자동 인쇄 됨 ). 그런 다음 입력이로 시작하는 동안 입력 $\redo프로그램을 제거하면 다시 증가 $\하고 대체됩니다. 더 이상 문자열의 시작 부분에서 숫자를 찾지 못하면 끝났습니다! 마지막으로 감소 $\하여 범위의 마지막 숫자를 얻습니다.


무엇에 대한 $i++while s/$i\B//(18 + 1 바이트)?
nwellnhof 오전

@nwellnhof 훨씬 낫습니다! 나는 대답을 0 인덱스로 만들면서보다 복잡한 경로를 시작했다고 생각합니다 ... 감사합니다!
Dom Hastings



1

CJam , 13 바이트

q:Q,),{,sQ=}#

너무 많은 쉼표 ...

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

설명

q:Q            Read the input and store it in Q
   ,           Get its length
    ),         Get the range 0..n
      {,sQ=}#  Find the index of the first number in the range to satisfy this block:
       ,        Get the range 0..(number)-1
        s       Stringify it
         Q=     Check if it equals the input

1

펄 6 ,  30 28  27 바이트

{first :k,*eq$_,[\~] '',0...*}

그것을 테스트

{[\~]('',0...*).first($_):k}

그것을 테스트

{first :k,$_,[\~] '',0...*}

그것을 테스트

넓히는:

{  # bare block lambda with implicit parameter 「$_」

  first       # find the first one
  :k,         # return the index into the Seq instead of what matched
  $_          # that matches the input

  # from the following

  [\~]        # triangle reduce using &infix:«~» (string concatenation)

              # a Seq
    '',       #   that starts with an empty Str
    0         #   then a 0
    ...       #   generate values
    *         #   indefinitely
}

'',0...*값 무한 시퀀스를 생성 '', 0, 1, 2, 3...

[\~] '',0...* 가능한 모든 입력의 무한 시퀀스 생성

""
"0"
"01"
"012"
"0123"
...

이 코드는 유효하지 않은 입력을 주면 절대 멈추지 않습니다.


1

Pyth , 11 10 바이트

1- 색인.

fqQ|jkSTk0

여기 사용해보십시오

빈 문자열을 무시할 수 있으면 6 바이트 로 단축 할 수 있습니다 .

fqQjkS

@Mnemonic 덕분에 -1 바이트


?QfqQjkUT)111에서도 할 수 있지만 일부 재정렬은 1 바이트에서 골프를 칠 수 있다고 생각합니다. 어떤 아이디어?
Dave

jks`m 대신 사용하여 바이트를 저장할 수 있습니다 .
니모닉

1

CJam, 14 12 11 바이트

q,_){,s,}%#

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

q,   e# Get length of input string
_)   e# Duplicate length, increment by 1
{    e# Generate array by mapping [0,1,2,...,length] using the following function: 
,    e# Generate range [0,x] (x is the int we're mapping)
s    e# Convert range to string (e.g [0,1,2,3] => "0123"
,    e# Get the length of that string
}%   e# Map the int to the length of it's range string
#    e# Return the index of the length of the input string in the generated array

1

Dyvil , 42 38 바이트

s=>"".{var r=0;while($0!=s)$0++=r++;r}

이 Java 응답 과 동일한 알고리즘은 (ab) Dyvil의 구문 전문 기술 중 일부를 사용한다는 점을 제외하고.

설명:

s=>          // starts a lambda expression with one parameter
"".{         // begins a brace access expression, the value before the '.'
             // is available within the braces as a variable named '$0'
var r=0;     // variable with inferred type int
while($0!=s) // while the accumulator $0 does not (structurally) equal s
$0++=r++     // concatenate $0 and the String representation of r,
             // then store the result in $0 and increment r by 1
;            // end of while
r}           // return r as the result of the lambda

  • 4누산기의 변수 대신 중괄호 액세스 표현식을 사용하여 바이트를 절약 했습니다.

멋진 언어 !!
Robert Fraser

0

MATL , 14 바이트

`@q:VXzGX=~}@q

1- 색인.

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

설명

`       % Do...while
  @     %   Push iteration index (1-based), k
  q     %   Subtract 1: gives k-1
  :     %   Range: [1 2 ... k-1]. Will be empty for k=1
  V     %   Convert to string
  Xz    %   Remove spaces
  G     %   Push input
  X=    %   Are the two strings equal?
  ~     %   Negate. This is the loop condition. If true: next iteration
}       % Finally (execute at the end of the loop)
  @     %   Push k
  q     %   Subtract 1: gives k-1. This is the solution
        % End (implicit). Display (implicit)

1
잠깐, 숯이 MATL을 이겼어?
Neil

0

C # , 72 바이트


데이터

  • 입력 String i 해독 할 int 배열
  • 출력 Int32 배열을 만드는 데 사용되는 숫자

골프

(string i)=>{int c,p=c=0;for(;p<i.Length;c++)p+=(c+"").Length;return c;}

언 골프

( string i ) => {
    int
        c,
        p = c = 0;

    for( ; p < i.Length; c++ )
        p += ( c + "" ).Length;

    return c;
}

언 골프 가능

// Takes the string with the int array
( string i ) => {
    int
        c,         // Counter, it will count how many ints the array has.
        p = c = 0; // Padding, it will help jumping from int to int on the string.

    // Start counting. If 'i' is empty, the 'c' will be 0.
    for( ; p < i.Length; c++ )

        // Increase the number of digits with the length of 'c'.
        p += ( c + "" ).Length;

    // Return the counter.
    return c;
}

전체 코드

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestBench {
    public static class Program {
        private static Func<String, Int32> f = ( string i ) => {
            int
                c,
                p = c = 0;

            for( ; p < i.Length; c++ )
                p += ( c + "" ).Length;

            return c;
        };

        static void Main( string[] args ) {
            List<String>
                testCases = new List<String>() {
                    "0123",
                    "0",
                    "",
                    "0123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100",
                };

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

            Console.ReadLine();
        }
    }
}

자료

  • V1.0 - 72 bytes- 초기 솔루션입니다.

노트

  • 없음

1
i=>{int c,p=c=0;for(;p<i.Length;)p+=(c+++"").Length;return c;}62 바이트
TheLethalCoder


0

아세토 , 27 25 바이트

1 기반 색인.

;L[¥
`=]z
MLdI<
r!`;   p

우리 r는 입력을 ead하고 Memorize하고 (그리고 직접 Load), 그것을 부정합니다 ( !빈 문자열에 대해서만 진실한 값을 가져옵니다). 이 값이 진실 ( `)이면 끝 ( ;)으로 이동 p하여 암시 적 0을 찢습니다 .

그렇지 않으면 현재 스택 값을 증가시키고 (처음에는 0), 복제 한 다음 스택에 하나의 사본을 오른쪽에 놓고 이동합니다 ( Id]). 그런 다음 감소하는 범위 ( z) 를 구성 하고 스택을 문자열 ( ¥)로 결합한 다음 원래 스택에서 값 (및 us)을 다시 이동합니다 ( [). 우리는 L우리가 기억 된 값 이전 (입력)를 OAD이 캐릭터와 비교. 같으면 끝으로 다시 점프하여 현재 "카운터"값 ( =`;)을 인쇄합니다 .

그렇지 않으면, Hilbert 곡선이 결국에 <도달 할 때까지 많은 빈 공간이 이동 하여 IP가 I다시 위에 올라가 카운터를 증가시키고 다시 테스트합니다.



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.