max ()가 충분하지 않습니다


18

소개

한 친구가 오늘이 질문을 약간 다른 방식으로 제기했습니다. "하나의 [Python] 명령으로 일부 정수 중 가장 큰 정수를 결정할 수 있습니까?"

"단일 명령"이라는 합리적인 정의 내에서이 작업을 수행 할 수있는 방법을 찾지 못했지만 골프에 재미있는 문제라고 생각했습니다.

 도전

" 정수가 모두 같지 않은 경우 정수 목록 중 가장 큰 정수를 반환합니다. "

더 구체적으로:

쉼표로 구분 된 정수 목록 만 포함하는 문자열이 제공됩니다.

  • 모두 같으면 아무것도 반환 / 출력하지 않습니다
  • 그렇지 않으면, 가장 큰 반환 / 출력

규칙

  • 입력은 정수의 쉼표로 구분 된 목록을 포함하는 문자열이어야
  • 출력 은 입력에서와 같이 표시되는 입력의 어느 것도 (어떠한 종류의 출력), 또는 다른 큰 소자를 없어야

출품작은 전체 프로그램 일 수도 있고 기능 일 수도 있습니다.

가정

  • 가정 입력리스트 요소보다 한 자리보다 수 있지만보다 크지 (2 32 - 1)의
  • 입력 목록에 백만 요소가 있다고 가정하십시오.
  • 입력에 음수 값이 포함되지 않는다고 가정
  • 입력이 절대 비어 있지 않다고 가정

의심의 여지를 피하기 위해, "더 구체적으로"직후에 주어진 도전에 대한 설명은 그 도전에 대한 진술보다 우선합니다 ( "가장 큰 귀환 ...").

 예

(1) 모두 동일 :

Input: 1,1
Output:

(2) 이기종 :

Input: 1,2
Output: 2

(3) 제로! :

Input: 0,0,0,0,0,0,0,1,0,0
Output: 1

(4) 무작위 :

Input: 7,3,8,4,8,3,9,4,6,1,3,7,5
Output: 9

(5) 큰 숫자, 큰 목록 :

Input: 627,3894,863,5195,7789,5269,8887,3262,1448,3192
Output: 8887

추가 예 :

(6) 모두 같고 더 큰 목록 :

Input: 7,7,7,7,7,7,7,7,7
Output:

(7) 모두 같고 큰 목록, 큰 숫자 :

Input: 61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976
Output:

(8) 같지 않고 큰 목록, 큰 숫자 :

Input: 96185,482754,96185,96185,96185,96185,96185,96185,7,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,961185,96185,96185,96185
Output: 961185

채점

이것은 code-golf가장 짧은 바이트 수를 가진 코드가 승리합니다!


3
목록에 동일한 값이 모두 포함되어있을 때 오류가 발생해도 괜찮습니까? 그리고 None아무것도 출력하지 않고 null 값 (예 : 파이썬)을 출력 할 수 있습니까? 또한 입력이 목록이 아닌 문자열이어야하는 이유는 무엇입니까? 그리고 입력에서 와 같이 표현
DJMcMayhem

15
배열 / 정수 목록을 허용하기 위해 입력 요구 사항을 완화하는 것이 좋습니다. 목록에 최소 2 개의 요소가 포함되어 있다고 보장됩니까? 모든 정수가 같으면 숫자가 아닌 일관된 숫자가 아닌 값을 출력 할 수 있습니까?
Shaggy

15
과 같이 최대 값이 두 번 이상 나타나는 테스트 사례를 추가하십시오 7,3,7,2.
nimi

3
요소가 하나 뿐인 테스트 케이스를 가질 수 있습니까? 또한 ,입력에 후행 을 포함시킬 수 있습니까?
Jo King

2
정보 :이 도전은 샌드 박스였습니다. /// OP의 경우 : 샌드 박스가 비활성 상태이지만 사소한 문제 일뿐입니다. 문제는 챌린지를 읽는 경우에만 챌린지에 대한 일부 문제가 명확하지 않으며 실제로 해결하는 경우에만 발견 할 수 있다는 것입니다.
user202729

답변:


8

R , 50 37 바이트

digEmAll 덕분에 -33 바이트! rturnbull 덕분에 -13 바이트!

x=scan(se=",");if(any(diff(x)))max(x)

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


불행히도 입력 현재 문자열이어야합니다.
Shaggy


죄송합니다. 이전 링크가 잘못되었다고 생각합니다! 이것은 내가 게시물에 의도 한 ...와 digEmAll의 아이디어를 결합, 바로해야한다
주세페

3
배열의 동등성을 테스트하는 방법을 개선하여 37 바이트 .
rturnbull

5

MathGolf , 5 바이트

è▀s╞╙

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

설명

è      Read whole input as int array
 ▀     Get unique elements
  s    Sort list
   ╞   Discard from left of array
    ╙  Get maximum of list

max 연산자와 left 연산자에서 삭제는 빈 목록에 대해 아무것도하지 않기 때문에 작동합니다. max 연산자는 목록을 제거하고 빈 목록에 대해서는 아무것도 푸시하지 않습니다.

입력을 목록으로 사용할 수 있으면 4 바이트 일 수 있습니다.


입력은 쉼표로 구분 된 문자열 이어야 합니다.
Shaggy

1
@Shaggy 나는 그것을 놓쳤다. 현재 MathGolf에는 "문자 분리"연산자가 없으므로 제대로 작동하려면 약간의 작업이 필요합니다. 내가 무엇을 할 수 있는지 알아볼 게.
maxb

5

펄 6 , 26 23 22 바이트

nwellnhof 덕분에 -1 바이트

{.max if .Set>1}o&EVAL

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

모든 것이 같으면 빈 슬립을 반환합니다.

설명

                o&EVAL  # Eval the string to a list of integers
{              }         # Pass to code block
 .max            # Return the max
      if .Set>1  # If the list converted to a set has more than one element

1
EVAL트릭은 깔끔한 그리고 당신은 심지어와 바이트를 저장할 수 있습니다 o&EVAL.
nwellnhof

if +.Set작동 하지 않습니까?

@Ven 아니요, Set에 하나 이상의 요소가 있는지 확인해야합니다.
조왕

Mh 및 비트 단위 ~는 Perl 6에서 2 바이트입니다 : (
Ven

5

젤리 , 4 바이트

ḟṀE?

필요한 출력을 인쇄하는 명령 줄 인수 (인용되지 않은)로 입력을 받아들이는 전체 프로그램

(이것은 빈 입력과 같은 단일 항목 입력과 스펙 77,8,7같은 다중 항목 입력 을 처리하는 데 현재 필요합니다.)

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

어떻게?

ḟṀE? - Full program: if one argument is present it is evaluated using Python
     -                 so 7,8,7 -> [7,8,7], while 7 -> 7
ḟṀE? - Main Link: list or integer OR no argument (in which case an implicit argument of 0)
   ? - if...
  E  - ...condition: all equal? (for any integer E yields 1 since the argument is
     -                           treated as a list like [integer])
ḟ    - ...then: filter discard (since it's undefined the right argument is implicitly 
     -                          equal to the left; both are treated as lists, so this
     -                          yields an empty list)
 Ṁ   - ...else: maximum (again an integer is treated as a list)
     - implicit print (Jelly's representation of an empty list is an empty string
     -                 furthermore no newline is printed in either case)

4

APL (Dyalog Classic) , 6 바이트

⍪⌈/~⌊/

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

최소값 ( )없이 최대 값 ( )을 계산 하는 열차 ( )가 행렬 ( )로 바⌈/~⌊/

입력에 하나의 고유 한 요소 만 포함 된 경우 ⌈/~⌊/비어 있으며 0x1 행렬을 반환하여 아무것도 렌더링하지 않습니다.

그렇지 않으면 ⌈/~⌊/1 요소 벡터 가되고 최대 값을 포함하는 1x1 행렬 (스칼라와 시각적으로 구분할 수 없음)이됩니다.




3

파이썬 2 , 42 41 바이트

a=input();print('',max(a))[len(set(a))>1]

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


PPCG에 오신 것을 환영합니다 :) 파이썬을 모르지만 목록으로 입력 해야하는 것처럼 보입니다. 불행히도 (그리고 불필요하게 내 의견) 사양은 입력이 문자열이어야한다는 (현재) 매우 명백합니다.
Shaggy

@Shaggy,이 프로그램은 입력이 형식이면 작동합니다 element, element, .... 즉, 대괄호로 묶을 필요가 없습니다.
Arnav Borborah 1

1
목록 작동하지만 Python 2에서는 input기본적으로 evalstdin에서 전달 된 모든 문자열 이기 때문에 필요하지 않습니다 .
Arnav Borborah

1
40 바이트 . ,입력이 단지 하나의 숫자이면 솔루션 오류가 발생하기 때문에 하나의 요소 목록에 후행이있을 수 있는지 모르겠습니다.
Jo King

2
@JoKing 입력이 비어 있지 않기 때문에 !=를 a >로 변경할 수없는 이유 가 있습니까?
nedla2004

3

하스켈 , 77 75 61 바이트

f.read.('[':).(++"]")    
f a=[0|any(/=a!!0+0)a]>>show(maximum a)

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

('[':).(++"]")문자열 (예 "1,2,1,3":)을 괄호 문자 ( "[1,2,1,3]")로 묶습니다 . 그런 다음 read문자열을 정수 목록 ( [1,2,1,3]) 으로 바꿉니다 .

결과 중 하나가 비어있는 목록 인 경우 함수 f이 팁 을 짧은 조건부로 사용 합니다. any(/=a!!0+0)a목록 a에 첫 번째 요소와 다른 요소가 포함되어 있는지 확인합니다 a!!0. ( 숫자 목록을 찾아야 +0한다는 read것을 알고 있어야합니다.) 모든 요소가 같으면이 테스트 결과가 나타납니다.False 가 나오고 빈 문자열이 반환됩니다. 그렇지 않으면 show(maximum a), 즉 문자열로 변환 된 목록의 최대 값이 반환됩니다.


@nimi 지적 해 주셔서 감사합니다!
Laikoni

3

빨강, 81 바이트

x: split input","forall x[x/1: load x/1]sort x: unique x if 1 <>length? x[last x]

R 솔루션과 마찬가지로 엄청난 양의 코드가 입력 문자열 "1,1,2,44,1"을 처리합니다. 예를 들어 블록으로 블록을 가질 수 있다면 x: [1 1 2 44 1]41 바이트로 수행 할 수 있습니다.

sort x: unique x if 1 <>length? x[last x]

4
PPCG에 오신 것을 환영합니다! 우리는 일반적으로 솔루션을 확인하기 위해 통역사와의 링크를 요청하고, 우리의 개조 자 중 하나 인 Dennis가 온라인으로 사용해보십시오! 그런 목적으로! 그것은 당신을 위해 당신의 답변을 형식화 할 것입니다! 당신이 여기에서 보낸 시간을 즐기시기 바랍니다!
Giuseppe

sort x: unique load replace/all input","" "if 1 <>length? x[last x]67 바이트 불행히도 inputTIO에서는 작동하지 않습니다. 당신이 그것을 func로 만들면, 그것은 TIO에서 잘 작동합니다 : 73 바이트
Galen Ivanov

3

APL (Dyalog Unicode) , 12 바이트

전체 프로그램. stdin에서 문자열을 프롬프트합니다.

{1≠≢∪⍵:⌈/⍵}⎕

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

 식에 대한 프롬프트 및 평가 (쉼표로 숫자를 목록으로 연결)

{} 다음의 익명 람다를 적용하십시오 ( 인수, 숫자 목록).

1≠ [1] 1과 다른 경우…

 탈리…

 고유 한 숫자는…

 목록

: 그때

⌈/ 최대 값을 돌려줍니다 (최소값 감소)…

 목록

 [그렇지 않으면 : 아무것도하지 마라]


1 ≠ ≢∪ 여기서는 인수가 동일한 수의 반복이 아닌 목록이므로 1 1 1 또는 22가 아닌 경우에만 찾습니다. 따라서 1 ≠ ≢∪1 1 2 3 3은 3이 고유하지 않은 경우에도 true를 반환하고, true이면 3 / ⍵ 최대 3을 반환합니다 (출력이 반환되지 않더라도). 내 오류는 어디에 있습니까? 또는 가능한 ':'은 다른 의미
를가집니다

@RosLuP 반복 횟수와 최대 횟수 반복이 있어도 최대 값을 인쇄해야합니다. 목록에 정확히 하나의 고유 번호가있는 경우에만 아무 것도 인쇄하지 않습니다. OP의 마지막 사례를 살펴보십시오.
Adám

예, 문제를 잘못 이해했습니다 ... 감사합니다
RosLuP

이게 효과가 있을까요? ⌈/~⌊/
ngn

@ngn 아니오, 모든 요소가 같으면 개행을 출력합니다.
Adám

3

자바 스크립트 (Node.js) , 49/53 바이트

.every(), 53 바이트를 사용하는 원래 버전

''를 반환하는 함수가 출력이없는 것으로 계산됩니까? 물론 이것은 개선 될 수 있습니다 ...

s=>(a=s.split`,`).every(e=>a[0]==e)?'':Math.max(...a)

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


개선 된 버전은 사용 Set()에 의해 얽히고 설킨 , 49 바이트

s=>new Set(a=s.split`,`).size>1?Math.max(...a):``

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



@Shaggy nice! 나는 Set을 사용하기 시작했지만 그렇게 짧을 수는 없다
Chris M



2

apt, 16 바이트

불필요하게 엄격한 입력 형식이 아닌 경우 9이고, 오류가 발생해도 아무것도 출력하지 않는 경우 7입니다.

문자열에 최소 2 개의 정수가 있다고 가정합니다.

q, mn
â ÊÉ?Urw:P

시도 해봐


2

공통 리스프, 102 바이트

(lambda(x &aux(c(read-from-string(concatenate'string"#.`("x")"))))(or(apply'= c)(princ(apply'max c))))

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

크기는 주로 데이터를 입력하기 때문입니다. 입력을 일반 목록으로 사용하면 길이가 46 바이트로 줄어 듭니다.

(lambda(x)(or(apply'= x)(princ(apply'max x))))

2

XPath 3.1, 54 바이트

입력 문자열을 컨텍스트 항목으로 사용하십시오.

let$t:=tokenize(.,',')!xs:int(.)return max($t)[$t!=$t]

컨텍스트가 "xs"보다 짧은 접두사를 XML 스키마 네임 스페이스에 바인딩하도록 허용하면 한 문자 씩 줄일 수 있습니다.

설명 : 입력 문자열을 가져오고 ","구분 기호로 토큰 화 xs:int()하고 정수로 변환하기 위해 각 토큰에 적용 하고, 시퀀스의 최대 값을 계산하고, 술어 $t!=$t가 true 인 경우 최대 값을 출력 합니다. A와 B가 시퀀스이면 다음과 A!=B같은 한 쌍의 항목 (A에서 A, B에서)이있는 경우에 해당 a!=b됩니다.

입력을 쉼표로 구분 된 문자열이 아닌 정수 $ s의 시퀀스로 제공 할 수있는 경우 솔루션은

max($s)[$s!=$s]

(15 바이트-간결하게 설계된 언어가 아닌 가장 짧은 솔루션 일 수 있음)

참고 : 이는 "입력에있는 그대로"요구 사항을 충족하지 않습니다. 입력에 선행 0 또는 더하기 부호가있는 정수가 있으면이 값이 손실됩니다. 다른 많은 솔루션에서도 마찬가지입니다.


2

K4 , 38 35 바이트

{$[1=#:t:?:(7h$","\:x)-48;;*:t@>t]}

테스트 사례 :

q)k){$[1=#:t:?:(7h$","\:x)-48;;*:t@>t]}"1,2,4,4"
,4
q)k){$[1=#:t:?:(7h$","\:x)-48;;*:t@>t]}"4,4,4,4"
q)
q)k){$[1=#:t:?:(7h$","\:x)-48;;*:t@>t]}"7,3,8,4,8,3,9,4,6,1,3,7,5"
,9
q)k){$[1=#:t:?:(7h$","\:x)-48;;*:t@>t]}"7,7,7,7,7,7,7,7,7,7,7,7,7"
q)

TiO에서 사용할 수있는 k 변형에 매우 유창하지 않으므로 온라인 예제를 사용할 수 없으므로 하나를 생각해 낼 것입니다.

설명

특정 작업이 다른 작업보다 먼저 수행되는 이유가 궁금하다면 K4에는 연산자 우선 순위가 없지만 대신 오른쪽에서 왼쪽으로 해석됩니다 (우선 순위로 괄호를 사용할 수 있음). 세미콜론으로 분리 된 표현.

   $[expr;`True;`False] is the conditional format

{$[1=#:t:?:(7h$","\:x)-48;;*:t@>t]}
               ","\:x                 //split string on commas
            7h$                       //cast strings to long
                      -48             //they'll be from ascii format, so compensate
         ?:                           //get distinct list      
       t:                             //set list to variable t        
     #:                               //get count of t
   1=                                 //check if count t = 1
                         ;;           //return nothing if true
                             t@>t  //if false, sort t descending
                           *:         //return first value

마지막에 임시 변통 최대 기능을 사용해야하는 팬이 아니라 더 많이 골프를 칠 수 있습니다.

편집 : 출력의 쉼표에 문제가 있으면 두 바이트 이상으로 수정할 수 있습니다.

q)k){$[1=#:t:?:(7h$","\:x)-48;;*:,/t@>t]}"1,2,4,4"
4
                                 ,/                 //joins the single element lists into one

40 37을 사용하지만 숫자 앞에 쉼표를 사용하면 원자와 달리 단일 요소 목록임을 의미합니다.


2

PHP (<= 5.6) 64 74 바이트

 echo array_count_values($a=split(',',$argn))[$m=max($a)]==count($a)?'':$m;

파이프로 실행 -nR하거나 테스트 온라인으로

splitPHP7에서 제거되었지만 몇 가지 문제를 해결하기 위해 10을 추가해야했기 때문에 대신이 값을 사용하는 것이 좋습니다 explode.


Also this doesn't work when there are more than one element with the max value 나는이 missread If they are all equal, return/output nothing하는 If they are equal, return/output nothing두 개 이상의 출력에 비어있는 경우 의미한다. 추가하면 ==count($a)수정됩니다. array_count_values배열에 나타나는 횟수를 계산 하기 때문에 배열의 총 요소 수와 같으면 ''을 출력하고 그렇지 않으면 max
ArtisticPhoenix

1
@ JoKing-미리 선언 된 변수를 통해 입력을해서는 안됩니다-stdin에서 가져 와서 고정 $argn하십시오 (여러 골프 답변에 사용되었습니다) 나는 내뿐만 아니라 다른 사용자의 예를들 수 있습니다.
ArtisticPhoenix


2

05AB1E , 9 8 바이트

',¡ZsËiõ

@Cowabunghole 덕분에 -1 바이트 .

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

',¡        '# Split the (implicit) input by ","
   Z        # Push the maximum (without popping the list)
    s       # Swap so the list is at the top of the stack again
     Ëi     # If all elements are equal:
       õ    #  Push an empty string ""
            # (Implicitly output the top of the stack to STDOUT as result)

1
꽤 비슷한 솔루션이지만 ',¡ZsËiõ1 바이트를 절약 하여 다른 바이트를 피할 수 있습니다.
Cowabunghole

@Cowabunghole Smart, 감사합니다!
Kevin Cruijssen



1

, 15 바이트

≔I⪪S,θ¿›⌈θ⌊θI⌈θ

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

≔I⪪S,θ

입력을 쉼표로 나누고 각 값을 정수로 캐스트하십시오.

¿›⌈θ⌊θ

최대 값이 최소값보다 큰지 테스트합니다.

I⌈θ

그렇다면 최대 값을 문자열로 캐스팅하고 인쇄하십시오.


1

수학, 43 바이트

If[!Equal@@#,Max@#]&@@#~ImportString~"CSV"&

순수한 기능. 쉼표로 구분 된 문자열을 입력으로 받아서 숫자 또는를 반환합니다 Null. Null그래픽으로 표시되지 않으므로 이것이 유효하다고 생각합니다 .


1

C (gcc) , 91 바이트

M(s)char*s;{long m=atol(s),o,l=0;for(;s=strchr(s,44);o<0?m-=o:0)l|=o=m-atol(++s);s=l?m:-1;}

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

데 고프

M(s)char*s;{
    long m=atol(s),o,l=0; // Read the first integer from string
    for(;s=strchr(s,44); // Advance pointer to next ','
           o<0?m-=o:0) // End of loop: if difference <0, deduct from max, increasing it to new max.
        l|=o=m-atol(++s); // Read next number, and subtract it from current max. 
                          // Bitwise-OR the difference into the l-variable
    s=l?m:-1; // End of function: if l is non-zero, there were at least two different values.
              // Return -1 if l is zero, otherwise the max value.
}

제안 M(char*s)대신 M(s)char*s;하고 index()대신strchr()
ceilingcat

1

Pyth, 7 바이트

Itl{QeS

온라인으로 사용해보십시오!
모든 테스트 사례 (더 나은 출력 형식을위한 약간 다른 코드)

Pyth는 Python을 기반으로하기 때문에 사용자 입력은 항상 문자열로 해석되어 전달 될 수 있습니다 eval() . 모든 Pyth 프로그램은 자동으로 실행됩니다Q=eval(input()) 은 첫 번째 명령 됩니다.

설명:
Itl{QeS  | Full code
Itl{QeSQ | with implicit variables filled
---------+-------------------------------
I        | If
 t       | one less than
  l      | the length of
   {Q    | the deduplicated input
         | is truthy (!=0),
         | print
     e   | the last element of
      SQ | the sorted input

1

자바 (JDK) , 101 바이트

d->{long m=0,c=-1,b;for(var s:d.split(",")){b=new Long(s);c=c<0|c==b?b:0;m=b>m?b:m;}return c>0?"":m;}

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

설명

d->{                            // Function taking a String input
    long m=0,c=-1,b;            // Initialise variables
    for(var s:d.split(",")){    // Split by comma and loop over elements
        b=new Long(s);          // Parse String to Long
        c=c<0                   // If c<0 (i.e. this is the first element)
            |c==b               // ...or c is equal to the current element
            ?b                  // Set c to the current element (all elements are the same so far
            :0;                 // Otherwise set c to zero to denote that list is not all same element  
        m=b>m?b:m;              // Set m to max of b and m
    }
    return c>0?""               // If c is not zero then all elements are the same, return nothing
                 :m;            // Else return max element
}

보너스 솔루션!

최선의 노력에도 불구하고 정규 표현식과 스트림을 사용하여 105 바이트 미만 으로이 솔루션을 얻을 수는 없었지만 우아함을 정말 좋아했기 때문에 명예로운 언급을해야했습니다.

d->d.matches("(.+?)(,\\1)+")?"":java.util.Arrays.stream(d.split(",")).map(Long::new).reduce(0L,Long::max)

정규식 ( ?)과 일반 루프 및 리턴 (스트림 대신) 의 조합을 사용하여 100 바이트 .
Kevin Cruijssen


1

, 13 바이트

a^:',MXaRMMNa

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

ngn의 APL 솔루션 접근 방식을 사용합니다 .

     MNa  Minimum of the list
  aRM     Remove it from the list
MX        Take the max of the remaining elements

처음 5 바이트 a^:', 는 입력 문자열을 쉼표로 분할합니다.

대체 13 바이트 솔루션 :

I!$=Ya^',PMXy
a^:',$=a?uMXa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.