가장 크고 작은 숫자 만들기


13

Puzzling에 대한 이 게시물 에서 영감을 얻었 습니다 . 그 퍼즐의 스포일러는 다음과 같습니다.

입력으로 3 개의 양의 정수가 주어지면 (x, y, z)포함 범위를 구성하고 해당 범위 [x, y]를 연결 한 다음 제거하십시오.z 불필요하게 연속적인 숫자를 하여 가능한 가장 크고 작은 양의 정수를 생성하십시오. 선행 0은 허용되지 않습니다 (즉, 숫자는로 시작해야합니다 [1-9]). 이 두 숫자를 순서대로 출력하십시오.

Puzzling 게시물의 예에서 input (1, 100, 100)은 가능한 가장 큰 숫자는 99999785960616263646566676869707172737475767778798081828384858687888990919293949596979899100이며 jafe의 아래 논리에
따라 가장 작은 숫자는입니다 10000012340616263646566676869707172737475767778798081828384858687888990919293949596979899100.
게시 대답이 :

  • 우리는 숫자의 길이 (고정 된 자릿수가 있음)에 영향을 줄 수 없으므로 값을 최대화하기 위해 최대 첫 번째 숫자, 두 번째 숫자 등을 취합니다.
  • 나인이 아닌 첫 번째 84 개를 제거합니다 (제거 할 16 자리 남음). 999995051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  • 다음 17 자리 숫자 중 가장 큰 숫자는 7이므로 여기에서 답의 다음 숫자는 최대 7 자 (16 자리를 초과 할 수 없음)입니다. 따라서 7이 아닌 15를 제거하십시오 ...999997585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  • 여기에서 다음 숫자는 최대 8 자일 수 있으므로 가운데에서 8이 아닌 하나를 제거하십시오. 99999785960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  • 비슷한 논리,하지만 반전 (즉, 우리는 최고의 원하는 1들 대신 선도9 가장 작은 숫자에 ).

다음은 더 작은 예입니다. (1, 10, 5) ..

우리는 범위를 구성하고 가능한 가장 큰 숫자를 남겨두고 제거 할 수 12345678910있는 5숫자를 결정 합니다. 분명히 그것은 출력 길이에 영향을 줄 수 없기 때문에 선행 자릿수를 최대화하고 싶다는 것을 의미합니다. 따라서을 제거하면으로 12345남게되며 678910이는 최대 규모입니다. 가장 작은 것을 만드는 것은 조금 까다 롭습니다. 왜냐하면 우리는 123410가능한 한 가장 작은 숫자를 남겨두고 중간에서 숫자를 뽑아 낼 수 있기 때문 입니다.

의 경우 (20, 25, 11)결과는 as 5및 로 다소 지루 1합니다.

마지막으로, 앞의 0을 시도 답변을 배제하기 위해, (9, 11, 3)제공 91011하는 차례 금리9110최대 및 최소있다.

I / O 및 규칙

  • 더 쉽고 짧으면 두 개의 프로그램 / 기능을 코딩 할 수 있습니다. 하나는 가장 큰 것과 가장 작은 것입니다.이 경우 점수는 두 부분의 합계입니다.
  • 입력 및 출력은 편리한 방법 으로 제공 할 수 있습니다 .
  • 입력은 사용자 언어의 고유 숫자 유형에 적합하다고 가정 할 수 있지만 연결된 숫자 나 출력은 그렇게 가정 할 수 없습니다.
  • 전체 프로그램 또는 기능이 허용됩니다. 함수 인 경우 출력하지 않고 출력을 반환 할 수 있습니다.
  • 표준 허점 은 금지되어 있습니다.
  • 이것은 이므로 모든 일반적인 골프 규칙이 적용되며 가장 짧은 코드 (바이트)가 이깁니다.

자릿수 목록은 출력으로 허용됩니까?
Rod

선행 0을 가진 사람들을 평가할 때 가짜 최소값을 산출하는 테스트 사례는 가치가있을 수 있습니다 9, 11, 3.
Jonathan Allan

@Rod Yep, 자릿수 목록은 출력하기에 좋습니다.
AdmBorkBork

@로드 나는 당신이 무엇을 말하는지 몰라, 나는 분명히 "출력"을 입력했습니다. ;-)
AdmBorkBork

@JonathanAllan 잘 했어. 추가되었습니다.
AdmBorkBork

답변:


5

하스켈 , 162 바이트

l=length
((m,f)%n)s|n>=l s=[]|n>0,(p,c:r)<-span(/=m(f$take(n+1)s))s=c:((m,id)%(n-l p)$r)|1>0=s
(x#y)z=[p%z$show=<<[x..y]|p<-[(maximum,id),(minimum,filter(>'0'))]]

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

jafe가 설명하는 알고리즘을 사용합니다. 덜 효율적인 방법을 사용하는 것이 더 짧을 수도 있지만, 작성하는 것이 더 재미있었습니다. :)

%동작은 (어떤 실제로 3 만) 사 개 인수를 취 m함수는 그 목록에서 선택은 "최적의"멤버 (하나 maximum또는 minimum우리가 원하는 내용에 따라); f"필터"기능입니다. n떨어 뜨릴 자리수 그리고 s문자열. 먼저 n이 문자열에 남은 자릿수와 같은지 확인하고 ( >=안전에 사용 했습니다) 나머지는 s버립니다. 그렇지 않으면 우리는 여전히 숫자 ( n>0) 를 삭제 해야하는지 확인한 다음 span문자열을 세 부분으로 나눕니다. p삭제할 c숫자, 도달 가능한 최적 숫자 및r나머지 문자열 우리는 최적의 숫자에 대한 평등을 검사하는 술어를 스팬하여 전달합니다. 이 숫자를 찾으려면 의 첫 번째 가져 와서n+1문자열의 숫자를 필터링하고 필터링 한 다음 "chooser"함수로 전달하십시오. 이제 우리는 최적의 숫자를 산출하고 되풀이하여에서 p(떨어진 자릿수) 의 길이를 뺍니다 n. 필터링 함수를 재귀 호출에 전달하지 않고 대신로 대체합니다 id. minimum첫 번째 반복에만 관련된 경우 0을 선택하지 않도록 필터가 있기 때문 입니다. 그 후에는 더 이상 필터가 필요하지 않습니다.

%정말에만 도우미 함수입니다 #어떤 복용, 우리의 "진짜"기능입니다 x, y하고 z. 우리는 목록 반복을 사용하여 약간의 반복을 피하고 함수 튜플을 반복 하고 연결 된 문자열 %과 함께 전달합니다 z. 이 문자열은 매직 모나드 연산자 (=<<)를 사용하여 생성 되며,이 컨텍스트에서는 다음과 같이 작동합니다 concatMap.


3

젤리 , 17 바이트

r/VDœcL_¥¥ḷ/ƇVṢ.ị

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

모든 가능성을 계산 한 다음 가장 크고 가장 작게 유지합니다.

왼쪽 인수 : x,y범위를 구성합니다. 올바른 주장 : z제거 할 숫자.

r/VDœcL_¥¥ḷ/ƇVṢ.ị
r/                 Inclusive range from x to y
  V                Concatenate the digits together
   D               Get the resulting digits
         ¥         Dyad:
        ¥            Dyad:
      L                Length of the list of digits in the concatenated number.
       _               Subtract the number of digits to be removed.
    œc               Combinations without replacement. (remove z digits)
            Ƈ      Keep lists of digits that:
          ḷ/       have a positive first element (no leading zeros).
             V     Combine digits into integers. (vectorizes to ldepth 1)
              Ṣ    Sort the numbers
               .ị  Indexes at value 0.5 which yields the first and last elements.

2

파이썬 2 , 143 바이트

import itertools
s,e,r=input()
l=''.join(map(str,range(s,e+1)))
L=[i for i in itertools.combinations(l,len(l)-r)if'0'<i[0]]
print min(L),max(L)

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

대상 크기의 모든 조합을 계산하고 (요소 순서가 유지됨) 가장 작거나 큰 숫자를 가져옵니다.


아 .. ㅋㅋ ㅋㅋㅋ 실제로 결정적으로 계산하는 프로그램을 만들려고 열심히 노력했습니다.
Don Thousand

@RushabhMehta Brute 힘 계산은 여전히 ​​결정 론적이며 느리다.
dylnan

2

, 56 바이트 또는 21 + 46 35 = 67 56 바이트

≔⪫…·NNωθFN≔⌈EθΦθ⁻λνθθ

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

≔⪫…·NNωθ

입력 x하고 y, 포함 범위를 만들고 숫자를 문자열에 결합합니다.

FN

제거 할 각 숫자마다 한 번씩 반복합니다.

≔⌈EθΦθ⁻λνθ

현재 문자열에서 가능한 각 문자를 제거하여 구성된 문자열 목록을 작성하고 최대 값을 사용하십시오.

θ

결과를 인쇄하십시오.

≔⪫…·NNωθF⊕N⊞υωΦθ∧⁼ι⌊Φ✂θκLυ¹∨κIλ⊞Oυω

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

≔⪫…·NNωθ

입력 x하고 y, 포함 범위를 만들고 숫자를 문자열에 결합합니다.

F⊕N⊞υω

입력 z하고 늘리십시오. 그런 다음 해당 길이의 목록을 작성합니다 z. 다음 필터 내에서 증분 할 수 있어야 하지만 명령 만 변수를 증분 할 수 있습니다. PushOperator목록의 길이를 늘리는 허점이 있습니다.

 θ                      String of digits
Φ                       Filter over characters
         κ              Current index
          Lυ            Length of list i.e. current `z` value
            ¹           Literal 1
       ✂θ               Slice string of digits
      Φ                 Filter over characters
              κ         Outer index
               Iλ       Cast inner character to number
             ∨          Logical OR
     ⌊                  Minimum
   ⁼ι                   Equals the outer character
  ∧              ⊞Oυω   And also push to list i.e. increment `z`
                        Implicitly print

슬라이스 가능한 영역에 하위 문자가 없는지 확인하여 원하는 문자를 필터링하십시오. 영역은 첫 번째 z+1문자로 시작합니다 (첫 번째 문자를 슬라이스 할 수 있으므로z ) 유지되는 각 문자에 대해 끝 점이 증가합니다. 첫 번째 문자에 대해 0을 선택하지 않도록주의하십시오.

가능한 가장 큰 수를 계산하는 데 사용될 때 더 빠른 알고리즘은 30 바이트입니다.

≔⪫…·NNωθF⊕N⊞υωΦθ∧⁼ι⌈✂θκLυ¹⊞Oυω

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 편집 : 위의 두 가지를 두 번째 56 바이트 솔루션으로 결합하여 두 가지 결과를 모두 생성했습니다.

≔⪫…·NNωθF⊕N⊞υω≔⮌υη⟦Φθ∧⁼ι⌈✂θκLυ¹⊞OυωΦθ∧⁼ι⌊Φ✂θκLη¹∨κIλ⊞Oηω

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

≔⪫…·NNωθ

초기 문자열을 생성하십시오.

F⊕N⊞υω

대표 z+1리스트의 길이있다.

≔⮌υη

복제 한 목록을 뒤집어 결과를 저장하십시오.

두 개의 결과를 별도의 줄에 인쇄하십시오. (이를 수행하는 다른 방법은 결과를 리터럴 \r문자 로 분리하는 것 입니다.)

Φθ∧⁼ι⌈✂θκLυ¹⊞Oυω

가능한 가장 큰 수를 생성하십시오.

Φθ∧⁼ι⌊Φ✂θκLη¹∨κIλ⊞Oηω

를 추적하기 위해 복제 된 목록을 사용하여 가능한 가장 작은 수를 생성하십시오 z.


1

젤리 ,  19  18 바이트

rDẎœcL_⁵Ɗ$ị@Ƈ1ḌṢ.ị

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

매우 비효율적이며1, 100, 100 으로 갈 필요가 없습니다.(19292)=305812874887035355118559193163641366325011573739619723360


1

05AB1E , 16 바이트

ŸSDg³-.Æʒ¬Ā}{Ć`‚

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

이 입력 순서로 읽고 전체 프로그램, Y, X, Z가 . 두 문자 목록을 출력합니다.

설명

ŸSDg³-.Æʒ¬Ā}{Ć`‚    Full program. Inputs: y, x, z.
Ÿ                   Inclusive binary range from x to y. Push [x ... y].
 S                  Dump the digits separately in a list.
  Dg                Duplicate, and use the second copy to get its length.
    ³-              Subtract z from the length.
      .Æ            Retrieve all combinations of length - z elements from the digits.
        ʒ  }        Keep only those that...
         ¬Ā         Don't start with a 0 (head, then Python-style boolean).
            {       Sort the remaining elements.
             Ć      Enclose. Pushes list + list[0] (appends its tail to itself)
              `     Dump all elements separately on the stack.
               ,    Pair, to get the last two, min and max (after enclosing)

아, Ć`‚꽤 똑똑하고 좋은 대답입니다!
Kevin Cruijssen

0

Matlab, 95 바이트

function[m]=f(s,e,c),a=sprintf('%d',s:e);x=str2num(combnk(a,length(a)-c));m=[min(x),max(x)];end

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

최소 및 최대 1x2 행렬을 반환합니다.

작동 원리

% Full code
function[m]=f(s,e,c),a=sprintf('%d',s:e);x=str2num(combnk(a,length(a)-c));m=[min(x),max(x)];end

% The function
function[m]=f(s,e,c),                                                                       end

                     % Creates the range in a single string
                     a=sprintf('%d',s:e);

                                                   % Gets all the combinations
                                                   combnk(a,length(a)-c)

                                         % Converts the string combinations to integers
                                         x=str2num(                     );

                                                                          % Finds min and max
                                                                          m=[min(x),max(x)];
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.