가장 큰 열에서 모든 숫자 찾기


14

다음은 비교적 간단한 문제입니다.

양의 정수 목록이 제공됩니다.

  • 그리드로 정렬하고 각 열을 합산하십시오. 예를 들어 입력이 [123, 7, 49, 681]인 경우 그리드는 다음과 같습니다.

     1  2  3
     7 
     4  9 
     6  8  1 
    

    그리고 각 열의 합은 다음과 [18, 19, 4]같습니다.

     1  2  3
     7 
     4  9 
     6  8  1 
     --------
     18 19 4
    
  • 이 합계의 최대 값을 찾으십시오.이 경우에는 19이고

  • 이 최대 열과 동일한 색인에있는 모든 숫자를 출력하십시오. 이 경우에는

    2
    9
    8
    

    이 번호를 특정 순서로 출력 할 필요는 없습니다. 4 개의 입력이 있더라도 3 개의 출력 만 있습니다. 동점 인 경우 가장 빠른 지수를 선택하십시오. 예를 들어 입력이 인 경우 [25, 223, 302]그리드는 다음과 같습니다.

    2  5
    2  2  3
    3  0  2
    -------
    7  7  5
    

    출력해야합니다

    2
    2
    3
    

이 숫자를 원하는 형식으로 인쇄 할 수 있습니다. 목록 형식, 줄 바꾸기 구분, 공백 구분 등. 입력을 2D 숫자 배열로 사용할 수 없습니다 (예 :

[[1, 2, 3],
[7],
[4, 9],
[6, 8, 1]

그러나 그 외에는 문자열 목록, 숫자 목록 또는 기타 합리적인 형식으로 입력을 취할 수 있습니다.

또한 모든 입력이 유효하고 두 개 이상의 숫자를 포함한다고 가정 할 수 있습니다.

평소와 같이 가장 짧은 바이트 단위의 응답이 이깁니다!

IO 테스트 :

#Input                      #Output
[1, 11, 111, 1111]      --> [1, 1, 1, 1]
[1, 12, 123]            --> [2, 2]
[987654321, 111]        --> [9, 1]
[111, 123456789]        --> [9]
[4, 8, 15, 16, 23, 42]  --> [4, 8, 1, 1, 2, 4]
[4, 8, 12, 26, 27, 38]  --> [2, 6, 7, 8]
[24, 53]                --> [2, 5]
[12, 304, 506]          --> [4, 6]
[30, 285, 121]          --> [0, 8, 2]

제목이 이해하기 어렵습니다. 문제는 "가장 큰 열"이라는 표현에있는 것 같습니다. "총계가 가장 큰 열 찾기"또는 "열 추가 : 최대 합계 찾기"와 같은 항목 일 수 있습니다.
DavidC

문제 설명에 "양의 정수 목록이 제공됨"이 표시되지만 예제 중 하나에 0. 영어에서 0은 일반적으로 긍정적으로 간주되지 않습니다.
Ton Hospel

@tonhospel 어느 것? 302의 사람? 열을 분할 한 후에 는 0 있습니다.
제임스

맞아, 나는 입력 형식을 잘못 이해했다. 내 제출 수정 ..
Ton Hospel

답변:


6

하스켈, 63 바이트

import Data.Lists
argmax sum.transpose.map(map(read.pure).show)

사용 예 : argmax sum.transpose.map(map(read.pure).show) $ [12,304,506]-> [4,6].

작동 방식 :

                     map                       -- for each number
                         map(read.pure).show   -- turn into list of digits
           transpose                           -- transpose the list of list
argmax sum                                     -- find the element with the
                                               -- largest sum

5

젤리 , 6 바이트

DZṚSÞṪ

온라인으로 사용해보십시오! . 이것은 비교적 간단한 질문 구현입니다.

D              Convert each number in the input to a list of digits, e.g.
               [353, 2247] -> [[3, 5, 3], [2, 2, 4, 7]]
 Z             Zip the lists together, e.g. [[3, 2], [5, 2], [3, 4], [7]]
  Ṛ            Reverse the list of lists so that first occurrences are now
               at the end, e.g. [[7], [3, 4], [5, 2], [3, 2]]
   SÞ          Sort by sum - this uses Python's sorted function, which is stable
               so equal elements end up in order of appearance, e.g.
               [[3, 2], [7], [3, 4], [5, 2]]
     Ṫ         Tail - get the last element, e.g. [5, 2]

솔루션을 방해하지는 않지만 UTF-8 멀티 바이트 문자가 포함되어 있기 때문에 실제로 11 바이트가 아닙니다.
여호수아

3
@Joshua 조금 이상하지만 Jelly는 이해하는 256 개의 문자 각각을 단일 바이트로 인코딩 하는 자체 사용자 지정 코드 페이지 를 사용합니다. 일반적으로 APL 과 거의 같은 방식으로 UTF-8로 점수가 매겨 지지 않습니다.
Sp3000

알았어 설명 주셔서 감사합니다.
여호수아

2

루비, 100 97 바이트

a=$<.map &:chomp
puts a.map(&:size).max.times.map{|i|a.map{|e|e[i]}.compact}.max_by{|e|eval e*?+}

eval e*?+중대하다! 또한 당신은 할 수 있습니다 $<.map; 배열에 뿌릴 필요가 없습니다.
Jordan

@Jordan 조언 감사합니다!
cia_rana

1

Mathematica 82 바이트

이것은 각 숫자의 자릿수를 오른쪽으로 x로 채우고, 행렬을 바꾸고, 더미 x를 제거하고, 자릿수를 합한 순서대로 가장 큰 값을 갖습니다.

SortBy[#~Select~NumberQ&/@Transpose[PadRight[#,30,x]&/@IntegerDigits@#],Tr][[-1]]&

Transpose몇 바이트를 절약하기 위해 위첨자 -T 형식을 사용하는 방법이 있어야 합니다.


1

펄, 49 48 바이트

에 +1 포함 -p

STDIN의 입력으로 실행하고 접두사가 붙은 열 번호를 STDOUT에 인쇄합니다. +

lcolumn.pl
123
7 
49 
681

lcolumn.pl:

#!/usr/bin/perl -p
s/./@;[@-].="+$&"/eg}{($_)=sort{eval"$b<=>$a"}@

1

자바 (ES6) 108 103 100 바이트

약간 장황하며 아마도 다른 접근법으로 더 골프를 칠 수 있습니다. 나는 이것을 제거 할 수 있으면 좋겠다 .filter(n=>n).

Neil 덕분에 5 바이트
절약 edc65 덕분에 3 바이트 절약

l=>l.map(n=>[...n].map((d,x)=>(m=(s[x]=(s[x]|0)-d)<m?s[c=x]:m,d)),s=[m=0]).map(n=>n[c]).filter(n=>n)

데모

let f =
l=>l.map(n=>[...n].map((d,x)=>(m=(s[x]=(s[x]|0)-d)<m?s[c=x]:m,d)),s=[m=0]).map(n=>n[c]).filter(n=>n)

console.log(f(["1", "11", "111", "1111"]).join`,`);          // --> [1, 1, 1, 1]
console.log(f(["1", "12", "123"]).join`,`);                  // --> [2, 2]
console.log(f(["987654321", "111"]).join`,`);                // --> [9, 1]
console.log(f(["111", "123456789"]).join`,`);                // --> [9]
console.log(f(["4", "8", "15", "16", "23", "42"]).join`,`);  // --> [4, 8, 1, 1, 2, 4]
console.log(f(["4", "8", "12", "26", "27", "38"]).join`,`);  // --> [2, 6, 7, 8]
console.log(f(["24", "53"]).join`,`);                        // --> [2, 5]
console.log(f(["12", "304", "506"]).join`,`);                // --> [4, 6]
console.log(f(["30", "285", "121"]).join`,`);                // --> [0, 8, 2]


(d,x)=>(... ,d)을 사용 하면 inner map는의 복사본을 반환 k하므로 할당 해야하는 시간 k이 절약되어 4 바이트가 절약됩니다.
Neil

부정 m하면 즉 (s[x]=(s[x]|0)-d)<m, 바이트를 절약 할 수 있다고 생각 합니다.
Neil

@Neil-평소와 같이 좋은 눈;)
Arnauld

1
나는 필터가없는 접근법을 시도했습니다. 그것은 103 바이트로 밝혀졌습니다! a=>a.map(n=>[...n+''].map((d,i)=>(t=s[i]=s[i]||[0],t.push(d),(t[0]-=d)<m?r=t:0)),s=[],m=0)&&r.slice(1)

숫자가 아닌 문자열 목록으로 입력을 얻을 수 있습니다. 그런 식으로 당신은 줄일 수+''
edc65

1

Pyth, 5 8 바이트

esDsMM.T

입력을 문자열 목록으로 취하고, 구분되지 않은 숫자 목록으로 출력합니다.

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

설명:

      .T  Transpose input to zip together corresponding columns
   sMM    Cast to digit lists
 sD       sort(D) by (s)um
e         take last element, implicitly print

흠, 이것은 모든 테스트 케이스에서 작동하지 않는 것 같습니까? 마지막을 시도했지만 OP의 질문 과 다른 결과를 제공 합니다 .
Kevin Cruijssen

@KevinCruijssen 그래, 난 엉망이야. Pyth의 과부하로 인해 문자열이 엉망이기 때문에 정수 값으로 정렬되었습니다.
Steven H.

0

Pyth, 11 바이트

h.MsZ.TmjdT

STDIN에서 정수 목록을 입력하고 목록을 인쇄하는 프로그램.

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

작동 원리

h.MsZ.TmjdT  Program. Input: Q
        j T   Yield the base-10 representation, giving a list of digits
       m d   Map that over Q (implicit input fill)
     .T      Justified transpose, giving each column as a list
 .MsZ        Filter the above by maximum sum
h            First element of above
             Implicitly print

0

자바 스크립트 (ES6), 90

(l,x)=>[...l+0].map((t,i)=>l.map(n=>(n=n[i])&&(v-=n,t.push(n)),v=t=[])|v>=x||(x=v,r=t))&&r

f=(l,x)=>[...l+0].map((t,i)=>l.map(n=>(n=n[i])&&(v-=n,t.push(n)),v=t=[])|v>=x||(x=v,r=t))&&r

;[
 [[123, 7, 49, 681]       , [2,9,8]]
,[[25, 223, 302]          , [2, 2, 3]]
,[[1, 11, 111, 1111]      , [1, 1, 1, 1]]
,[[1, 12, 123]            , [2, 2]]
,[[987654321, 111]        , [9, 1]]
,[[111, 123456789]        , [9]]
,[[4, 8, 15, 16, 23, 42]  , [4, 8, 1, 1, 2, 4]]
,[[4, 8, 12, 26, 27, 38]  , [2, 6, 7, 8]]
,[[24, 53]                , [2, 5]]
,[[12, 304, 506]          , [4, 6]]
,[[30, 285, 121]          , [0, 8, 2]]]
.forEach(t=>{
  var i=t[0], o=t[1], r, ok
  i=i.map(x=>x+'') // convert i to a string list
  r=f(i) 
  ok = (r+'')==(o+'') // compare r and o as comma separated strings
  console.log(ok?'OK':'KO', i+' -> '+ r)
  
})


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