제로의 무게


21

순서가 지정된 숫자 목록 (주행 0이있을 수 있음)이 있으면 숫자를 세로로 배열 한 다음 모든 0을 맨 아래로 내리고 모든 돌출부는 맨 아래 열린 슬롯으로 떨어 뜨립니다. 선행 0을 제거하여 결과 정수를 출력하십시오.

작동 예

다음과 같이 입력을 받았다고 가정하십시오.

['0000312941295', '239124000124581598', '32852353800451258', '10235923505185190', '1491359102149']

먼저 수직으로 정렬합니다.

0000312941295
239124000124581598
32852353800451258
10235923505185190
1491359102149

그런 다음 열 단위로 0을 다른 숫자를 "통과"하여 아래쪽에 놓고 다른 숫자를 "밀어"냅니다. 결과적으로 첫 몇 단계는 다음과 같습니다.

2000312941295
339124000124581598
12852353800451258
10235923505185190
0491359102149
^

2300312941295
329124000124581598
14852353800451258
10235923505185190
0091359102149
 ^

2390312941295
328124000124581598
14252353800451258
10935923505185190
0001359102149
  ^

...

2391312941295
328524538124581598
14232323525451258
10915991001185190
0000350000049
                ^

다음으로 중력이 모래처럼 당겨지는 것처럼 모든 돌출부를 떨어 뜨립니다.

2391312941295
3285245381245 1598
14232323525458258
10915991001181190
00003500000495
             ^

2391312941295
3285245381245  598
14232323525458158
10915991001181290
000035000004951
              ^

...

2391312941295
3285245381245
14232323525458159
10915991001181258
000035000004951908
                 ^

마지막으로이 숫자를 출력하여 선행 0을 제거하십시오. 우리의 예제에서 출력 :

[2391312941295, 3285245381245, 14232323525458159, 10915991001181258, 35000004951908]

다른 예를 들어, 입력을 가정하십시오 [1234000,12345678,1234,12340608,12341234].

1234000
12345678
1234
12340608
12341234

0을 삭제하십시오.

1234  
12345678
1234163
12340208
12340004

나머지 돌출 숫자를 삭제하십시오.

1234  
1234567
12341638
12340208
12340004

출력은 [1234, 1234567, 12341638, 12340208, 12340004]입니다.

규칙

  • 입력에 선행 0 포함될 있습니다. 출력 에는 선행 0이 포함 되지 않아야 합니다.
  • 해당되는 경우 입력 / 출력이 해당 언어의 고유 정수 유형에 맞는 것으로 가정 할 수 있습니다.
  • 입력 및 출력은 편리한 방법 으로 제공 할 수 있습니다 .
  • 전체 프로그램 또는 기능이 허용됩니다. 함수 인 경우 출력하지 않고 출력을 반환 할 수 있습니다.
  • 표준 허점 은 금지되어 있습니다.
  • 이것은 이므로 모든 일반적인 골프 규칙이 적용되며 가장 짧은 코드 (바이트)가 이깁니다.

2
출력 숫자가 언어의 정밀도를 초과하지 않는다고 가정 할 수 있습니까? (JS 라운드 14232323525458159까지 14232323525458160)
ETHproductions

@ETHproductions PPCG 기본값이라고 생각합니다.
Outgolfer Erik

and all overhangs drop to the bottom-most open slot내 깨진 도전에 대한 좋은 수정이었습니다 :).
Magic Octopus Urn

1
@PeterCordes 예, 입력에 선행 0이 포함될 수 있으므로 처리 할 수 ​​있어야합니다. 대부분의 언어에서 문자열로 입력을 받는다는 것을 의미합니다.
AdmBorkBork

1
@PeterCordes 입력과 출력은 반드시 기본 10에 있어야 할 필요는 없습니다 (허용 된 기본 I / O 방법에 있음). 두 번째로, 선행 0을 완전히 제거해야한다고 지정하지 않았지만 그 의도였습니다. 출력 . 1234이 출력 과 매우 다르기 때문에 0을 공백으로 바꾸는 것은 허용되지 않습니다 1234.
AdmBorkBork

답변:


10

젤리 , 8 바이트

Z¬Þ€UZṚḌ

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

작동 원리

Z¬Þ€UZṚḌ  Main link. Argument: M (2D array / matrix)

Z         Zip; transpose M by reading columns as rows.
 ¬Þ€      Sort each row of the transpose by logical NOT, pushing 0's to the end.
    U     Upend; reverse all sorted rows of the transpose.
     Z    Zip again, restoring rows from columns. Overhangs rise to the top.
      Ṛ   Reverse the order of the rows.
       Ḍ  Decimal; convert the rows from base 10 to integer.

4
뭐? 내가 그 질문을 읽고있을 때 나는 생각했다 : "마지막으로, 누군가가 이것에 대해 20 바이트 미만을 빼낼 수있는 방법은 없다". 광기
런처

1
Sort each row of the transpose by logical NOT, pushing 0's to the end.이것은 안정적인 정렬이 보장됩니까?
Cruncher

1
그렇습니다. 젤리는 파이썬을 사용하는데 sorted, 이는 안정적입니다.
Dennis

나는 이런 정통적인 버전을 좋아한다 : ṚZẸÞ€ZṚḌ:)
Jonathan Allan


4

껍질 , 12 바이트

md↔TmoÖ±miT↔

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

설명

md↔Tm(Ö±mi)T↔  -- input as list of strings, example: ["103","32","258"]
            ↔  -- reverse: ["258","32","103"]
           T   -- transpose: ["231","520","83"]
    m(    )    -- with each line do (example with "520")
        mi     -- | convert each char to digit: [5,2,0]
      Ö±       -- | sort by signum (stable): [0,5,2]
               -- : [[2,3,1],[0,5,2],[8,3]]
   T           -- transpose: [[2,0,8],[3,5,3],[1,2]]
  ↔            -- reverse: [[1,2],[3,5,3],[2,0,8]]%
md             -- convert each to integer: [12,353,208]

4

파이썬 2 , 118 바이트

lambda l:[int(''.join(z))for z in zip(*map(lambda*a:['']*a.count(None)+[e for e in a if'0'<e]+['0']*a.count('0'),*l))]

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

언 골프 버전

def f(list_):
 max_len = max(len(x) for x in list_)
 transposed_list = zip(*[list(row)+(max_len-len(row))*[None] for row in list_])
 weighted_list = [['']*column.count(None)+[cell for cell in column if cell != '0' and cell != None]+['0']*column.count('0') for column in transposed_list]
 return [int(''.join(row)) for row in zip(*weighted_list)]

처음 두 줄은에 해당 합니다. 한 목록이 다른 목록보다 짧은 경우 s 로 채울 map(lambda*a...)경우의 기본 동작 입니다. 에 해당 그것은 더 높은 코드 포인트가됩니다 어떤 숫자 (1 ~ 9)이며, (모든) 문자열보다 높은 경우 때문에 .mapNone
e>'0'cell != '0' and cell != NoneNone


ungolfed 버전을 게시 하시겠습니까?
Peter Cordes

@PeterCordes는 ungolfed 버전과 불분명 한 점에 대한 간단한 설명을 추가했습니다
Rod


2

레티 나 0.8.2 , 95 92 바이트

m(+`^((.)*)(.+)(¶(?<-2>.)*)(?(2)_)$
$1$4$3
+`^((.)*)0(.*¶(?>(?<-2>.)*))([^0])
$1$4${3}0
^0+

온라인으로 사용해보십시오! 설명 : 첫 번째 단계는 돌출 숫자를 삭제하여 두 번째 단계에서 0을 제거하는 것이 더 쉬워집니다 (편집 : 3 바이트 절약이 훨씬 쉬움). 그런 다음 세 번째 단계는 선행 0을 제거합니다.


2

루비 , 104 바이트

->a{a.map{|x|x.ljust(99).chars}.transpose.map{|x|x.sort_by{|x|x<?1?x:?!}}.transpose.map{|x|x.join.to_i}}

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

설명

->a{
  a.map{|x|x.ljust(99).chars}  # Fill spaces to make this rectangular
    .transpose.map{|x|
       x.sort_by{|x|x<?1?x:?!} # Treat all chars but " 1" as ! (see ascii table)
    }.transpose.map{|x|x.join.to_i} # Convert back to numbers
                       # note: if no leading 0s, eval x*'' , doesn't work here
}

1

APL (Dyalog Unicode) , 26 바이트 SBCS

익명의 암묵적 접두사 함수는 문자 행렬을 인수로 사용하고 숫자 목록을 반환합니다.

⍎⍤1∘⍉' 0'(∩∘⊃,~,∩∘⊃∘⌽)⍤1⍨⍉

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

 입력을 바꿉니다 (열 작업을해야하므로)

' 0'(... )⍤1⍨ 각 행 (텐서 1 레벨의 서브 어레이)에 다음 암묵적 함수 적용 ' 0'오른쪽 인자 ( 스왑 인수) :

 행과의 교점
 과
 의 제 ' 0'
 (즉 row∩' ', 각 행의 모든 구역)

, 뒤에…

~ 세트 차이
 (즉 row~' 0', 행과 공백과 0은없는)

, 뒤에…

 행과의 교점
 과
 제
 의
 (가) 역전 ' 0'
 (즉 row∩'0', 각 행의 모든 제로)

⍎⍤1 해당 조옮김의  각 행 (텐서 랭크 1의 하위 배열)
 을 평가
합니다 (즉, 각 열; 현재 수정 된 입력 행).


괄호로 묶은 비트는 영리합니다. 나는 개인 구불 구불 한 행동을 알고 있지만 그 의도를 이해하는 데 시간이 걸렸습니다. 일단 이해 한 후에는 쉽게 이길 수 있습니다 . ⍎⍤1∘⍉{⍵[⍋3|2×' 0'⍳⍵]}⍤1∘⍉( ⎕io←0) 골프를 더 할 수 있습니다. 예를 들어, 난폭성을 탐험하지 않았습니다
ngn

실제로, 위의 프로그램은 완전한 프로그램 으로서는 짧습니다 (기차 아님) :⍎⍤1⍉{⍵[⍋3|2×' 0'⍳⍵]}⍤1⍉⎕
ngn

@ngn 이러한 다른 방법은 자신의 게시물에 장점이 있습니다. 사전 처리 및 사후 처리가 분명합니다.
Adám

1

Perl 5 , -p0 77 바이트

이전 스타일 계산 : 79 바이트 ( +2for p0)

STDIN에서 마지막 줄 바꿈없이 줄로 입력하십시오. 예 :

0000312941295
239124000124581598
32852353800451258
10235923505185190
1491359102149

오버행이 떨어지고 0하나의 정규식에 빠지는 것이 약간 까다 롭습니다.

#!/usr/bin/perl -p0
s/^.{@{+}}\K((0)|.+$)(.*
.{@{+}})((?(2)[1-9]|$))/$4$3$1/m while/|/g;s/^0+//mg

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


0

루비 , 203 바이트

->a{t=->b{b[0].zip(*b[1..-1])}
m=a.map{|s|s.size}.max
a.map!{|s|(s+" "*m)[0...m].chars}
a=t[a].map{|c|c.size.times{|i|" 0"[c[i]]&&(c.slice!(i)==?0?c.push(?0):c.unshift(" "))}
c}
t[a].map{|r|r.join.to_i}}

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

문자열 배열을 수락하고 정수 배열을 반환하는 람다. 뭔가 빠진 것 같아요. 이것은 엄청나게 느낀다 : /

->a{
  t = -> b { b[0].zip(*b[1..-1]) }     # t is a lambda that transposes 2D arrays
  m = a.map{ |s| s.size }.max          # m is the maximum input string length
  a.map!{ |s| (s+" "*m)[0...m].chars } # Right-pad every string to the same length
  a = t[a].map{ |c|                    # Transpose a, and for every row (column)
    c.size.times{ |i|                  # For every character in the column
      " 0"[c[i]] && (                  # If the character is 0 or space
        c.slice!(i) == ?0 ?            # Remove it from the column, and if it was 0,
          c.push(?0) :                 # Push a 0 to the end (bottom) of the column, else
          c.unshift(" ")               # Add a space to the top of the column
      )
    }
    c
  }
  t[a].map{ |r| r.join.to_i }          # Transpose a back, and parse each row to int
}

나는 이것을 지금
outgolfed했다

@Unihedron 와우, 당신은 나를 50 % 이겼습니다. +1이 확실합니다.
benj2240

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