ゼロの重み


21

番号の順序付きリスト(先頭にゼロが付いている場合もある)を指定して、番号を垂直に並べ、すべてのゼロを一番下まで落とし、すべてのオーバーハングを一番下の空きスロットまで落とします。結果の整数を出力し、先行ゼロを削除します。

実施例

入力として次のものが与えられたとします。

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

まず、垂直に配置します。

0000312941295
239124000124581598
32852353800451258
10235923505185190
1491359102149

次に、列ごとに、ゼロが他の数字を「通り抜ける」ようにドロップして、それらが下に残り、他の数字を「押し上げる」ようにします。これにより、最初のいくつかの手順は次のようになります。

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
                 ^

最後に、これらの数値を出力して、先行ゼロを削除します。作業例では、出力は次のとおりです。

[2391312941295, 3285245381245, 14232323525458159, 10915991001181258, 35000004951908]

別の例として、の入力を想定します[1234000,12345678,1234,12340608,12341234]

1234000
12345678
1234
12340608
12341234

ゼロをドロップします。

1234  
12345678
1234163
12340208
12340004

残りのオーバーハング数字をドロップします。

1234  
1234567
12341638
12340208
12340004

出力は[1234, 1234567, 12341638, 12340208, 12340004]です。

ルール

  • 入力には先行ゼロ含まれる場合があります。出力に先行ゼロを含めることはできません
  • 該当する場合、入力/出力が言語のネイティブ整数型に適合すると想定できます。
  • 入力と出力は、任意の便利な方法で指定できます。
  • 完全なプログラムまたは機能のいずれかが受け入れられます。関数の場合、出力する代わりに出力を返すことができます。
  • 標準的な抜け穴は禁止されています。
  • これはので、通常のゴルフルールがすべて適用され、最短のコード(バイト単位)が勝ちます。

2
出力数が言語の精度を超えないことを想定できますか?(JSラウンド14232323525458159まで14232323525458160
ETHproductions

@ETHproductionsこれはPPCGのデフォルトだと思います。
エリックアウトゴルファー

and all overhangs drop to the bottom-most open slot私の壊れた挑戦への良い修正でした:)。
魔法のタコ

1
@PeterCordesはい、入力には先行ゼロが含まれる場合があるため、それを処理できる必要があります。ほとんどの言語では、入力を文字列として受け取ることを意味します。
AdmBorkBork

1
@PeterCordes異なるベースを使用してもタスクが単純化されない限り(標準の抜け穴)、入力と出力は必ずしもベース10(許可されたデフォルトのI / Oメソッド内)にある必要はありません。第二に、先行ゼロを完全に削除する必要があるとは指定しなかったと思いますが、それは意図でした。出力. 1234はoutput とは非常に異なるため、ゼロをスペースに置き換えることは許可されないというルールを決め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.これは安定したソートであることが保証されていますか?
ランチャー

1
はい、JellyはPythonを使用sortedしています。これは安定性が保証されています。
デニス

種類この可換見ているバージョンのようなのI:ṚZẸÞ€ZṚḌ:)
ジョナサン・アラン


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

Python 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)]

最初の2行はに相当しmap(lambda*a...)ます。1つのリストが他のリストより短い場合にsでmap埋めるためのデフォルトの動作ですNone
e>'0'これはに相当しますcell != '0' and cell != None。これは、数字(1〜9)の場合、コードポイントが高くなり、(任意の)文字列はより大きいためNoneです。


これの無料版を投稿してもよろしいですか?
ピーター

@PeterCordesはungolfedバージョンといくつかのあいまいな点について簡単な説明を加え
ロッド


2

網膜0.8.295の 92バイト

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

オンラインでお試しください!説明:最初の段階では、2番目の段階でゼロをドロップするのが簡単になるため(編集:3バイトの節約がさらに容易になる)、オーバーハングする数字がドロップされます。次に、3番目のステージで先行ゼロが削除されます。


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'asで適用します引数ます(引数を交換します)。

 行
 と
 の最初の' 0'
 (つまりrow∩' '、各行のすべてのスペース)

, に続く…

~ セットの差
 (つまりrow~' 0'、行。ただし、スペースとゼロはありません)

, に続く…

 行と
 と
 の最初
 の
 反転の交差' 0'
 (つまりrow∩'0'、各行のすべてのゼロ)

⍎⍤1 その転置の 各行(テンソルランク1のサブ配列)
 を評価します
(つまり、各列、現在変更された入力行)


括弧で囲まれたビットは賢いです。個々の波線が何をしているのかは知っていますが、そこでの意図を理解するのに少し時間がかかりました。理解したら、簡単に打ち負かすことができます。⍎⍤1∘⍉{⍵[⍋3|2×' 0'⍳⍵]}⍤1∘⍉⎕io←0)それはさらにgolfableすることができ、例えば、私は、ダイアディック探検しませんでした
NGN

実際には、上記の完全なプログラム(ない電車)のように短いです:⍎⍤1⍉{⍵[⍋3|2×' 0'⍳⍵]}⍤1⍉⎕
NGN

@ngnこのような異なる方法は、独自の投稿に値します。前処理と後処理は明らかです。
アダム

1

Perl 5、-p0 77バイト

古いスタイルのカウント:79バイト(+2for p0

入力を最後の改行なしでSTDINの行として指定します(それ以外の場合は、入力文字列がクラッシュすると、すべてがオーバーハングとして表示され、最後の改行が上に上がります)。例えば:

0000312941295
239124000124581598
32852353800451258
10235923505185190
1491359102149

オーバーハングをドロップし、01つの正規表現にドロップするのは少し難しい

#!/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}}

オンラインでお試しください!

文字列の配列を受け入れ、intの配列を返すラムダ。私は何かを見逃しているように感じます。これはすごい感じです:/

->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
}

私はこれをアウトゴルフしました(今のところ)
Unihedron

@Unihedronうわー、あなたは私を50%倒しました。確かに私の+1があります。
benj2240

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.