줄자 문자열


15

동기 부여 : 때때로 당신은 당신이 줄에 어디에 있는지 알아야합니다. 문자열의 어느 부분을보고 가능한 한 정확하게 어디에 있는지 알고 싶습니다.

도전 과제 : 주어진 길이의 줄자 문자열 을 출력하는 프로그램을 작성하십시오 . 테이프 측정 값 문자열 자체의 길이 그리까지 가능한 한 자주는 자신의 길이입니다 함께 설명합니다.

규칙 :

  1. 줄자 문자열의 전체 길이에 대해 프로그램은 하나의 양의 정수 매개 변수를 가져야합니다.
  2. 출력에서 연속 된 각 자릿수 문자열에 대해이 숫자는 지금까지의 출력 길이를 정확하게보고해야 합니다 !
    1. 길이는 문자열의 시작부터 각 숫자 의 끝까지 측정됩니다
  3. 가능한 많은 길이의 숫자가 문자열에 포함되어야합니다
  4. 모호성을 피하십시오. 분리 자 / 구분자는 숫자가 병치되는 것을 피하기 위해 사용될 수 있습니다 12.
  5. 문자열은 항상 끝에 구분 기호없이 끝에 전체 길이를 정확하게보고해야합니다.
  6. 길이를 정확하게 유지하려면 여러 개의 구분 기호가 필요할 수 있습니다. 예를 들어 길이가 4 인 줄자 문자열이 여기에 있습니다. 1--4

비처방 적 / 완전한 예 :

  • 길이가 1 인 줄자 줄 : 1
  • 길이가 2 인 줄자 줄 : -2
  • 길이가 3 인 줄자 줄 : 1-3
  • 길이가 4 인 줄자 줄 1--4또는 -2-4(가능한 한 두 번의 보고서 길이, 즉 두 번, 정확한 총 길이로 끝남)
  • 길이가 10 인 줄자 줄 : 1-3-5-7-10
  • 길이 11의 줄자 문자열 : 1-3-5-7--11또는 1-3-5--8-11또는 1-3--6-8-11또는 ( 1--4-6-8-11또는 -2-4-6-8-11모두 가능한 한 많은 수의 길이를 가지며 전체 문자열 길이로 마무리)

따라서 문자열의 모든 숫자는 다른 숫자와 인접하지 -않으며 문자열은 완전히 대시로 구성되며 문자열에서 가능한 한 많은 길이 표시가 필요합니까?
Rɪᴋᴇʀ

0 기반 인덱싱을 사용할 수 있습니까?
Rɪᴋᴇʀ

@EasterlyIrk 규칙 3은 가능한 많은 숫자가 문자열에 맞아야합니다.
Post Rock Garf Hunter


@EasterlyIrk 동기 부여를 충족시키지 못하고 규칙 3과 5를 위반하므로 대시를 모두 가질 수는 없습니다. 인덱싱이 없습니다. 그냥 길이. 따라서 길이가 1 인 줄자 문자열은 없습니다 0.
Tom Viner

답변:


12

파이썬, 50 48 47 46 바이트

f=lambda x:x*"1"if x<2else f(x-len(`-x`))+`-x`

설명

매우 간단한 재귀 람다 솔루션

우리의 기본 사례는 1과 0이며, "1"*x그렇지 않으면 -xwith로 문자열을 얻고 `-x`함수를 호출 한 결과를 len(`-x`)적게 붙입니다.


1
문자열을 지정하여 바이트를 저장할 수 있습니까 -x?
Martin Ender

@MartinEnder Ok 작동합니다. 팁 고마워! 나는 그것을 일찍 알지 못하는 것에 대해 바보 같은 느낌이 든다.
Post Rock Garf Hunter

5

매스 매 티카, 67 57 바이트

jettisoning 10 bytes를위한 Martin Ender에게 감사합니다!

""["1"][[#]]/._@__:>#0[#-1-IntegerLength@#]<>ToString@-#&

음이 아닌 정수 인수를 가져 와서 문자열을 반환하는 Unnamed 함수. 명백한 재귀 알고리즘은 다음과 같습니다. 문자열이 앞에 입력 번호로 끝나는 지 확인한 "-"다음을 사용하여 함수를 다시 호출하십시오 #0.

그러나 알고리즘을 구현할 때 골치 아픈 재미가 있습니다. ""["1"][[#]]는 식의 #인수를 나타냅니다 ""["1"]. 0 번째 인수는 머리 ""이고 첫 번째 인수는 눈에 띄게 "1"재귀의 기본 사례를 제공합니다. 경우 #1을 초과하고 ""["1"][[#]]에러 메시지를 발생하고, 미 평가 함수로서 남아있다. 그러나 /._@__:>평가되지 않은 함수를 가져 와서 다음에 오는 표현식으로 변환하는 규칙입니다. 이는 원래 함수에 대한 재귀 호출입니다.

원본 제출 :

If[#<2,""["1"][[#]],#0[#-1-IntegerLength@#]<>"-"<>IntegerString@#]&

2
""["1"][[#]]/._@__:>#0[#-1-IntegerLength@#]<>ToString@-#&하나를 피함으로써 바이트 저장 If및 피함으로써 바이트의 무리 IntegerString"-"<>.
Martin Ender

1
omg, _@__evil magic
Greg Martin

3

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

f=(n,s='',t=''+-n)=>n>1?f(n-t.length,t+s):n?n+s:s
<input type=number oninput=o.value=f(this.value)><br><textarea id=o></textarea>


1
나는 당신이 정의해야한다고 생각합니다f
Tom Viner

@TomViner 항상 그렇게하고 있습니다. (적어도 나는 올바른 바이트 수를 가졌다.)
Neil


1

펄 6 , 43 바이트

{[R~](-$_,{$_+.comb}...^*>-1).&{S/^\-1/1/}}

설명:

{                                         }  # A lambda.
                    ...                      # Generate a sequence...
      -$_                                    #   starting from the negated lambda argument,
         ,{        }                         #   continuing iteratively using the formula:
           $_+.comb                          #     Last element plus length of last element.
                        *>-1                 #   until we hit 0 or higher,
                       ^                         end-point not inclusive.
 [R~](                      )                # Reverse and concatenate the number sequence.
                             .&{         }   # Apply to this the transformation:
                                S/^\-1/1/    #   Remove the sign from a leading "-1".

예를 들어 입력 10의 경우 시퀀스를 생성하고 (-10, -7, -5, -3, -1)해당 문자열 -1-3-5-7-10과 최종 문자열을 생성합니다 1-3-5-7-10.

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

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