El peso de un cero

21

Dada una lista ordenada de números (posiblemente con ceros a la izquierda), organice los números verticalmente, luego deje que todos los ceros caigan hasta el fondo y todos los voladizos caigan en la ranura abierta más inferior. Salida de los enteros resultantes, eliminando los ceros a la izquierda.

Ejemplo trabajado

Digamos que nos dieron lo siguiente como entrada:

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

Primero lo arreglamos verticalmente:

0000312941295
239124000124581598
32852353800451258
10235923505185190
1491359102149

Luego, columna por columna, coloque los ceros "a través" de los otros números para que descansen en la parte inferior y "empuje" los otros números hacia arriba. Esto daría como resultado que los primeros dos pasos sean los siguientes:

2000312941295
339124000124581598
12852353800451258
10235923505185190
0491359102149
^

2300312941295
329124000124581598
14852353800451258
10235923505185190
0091359102149
 ^

2390312941295
328124000124581598
14252353800451258
10935923505185190
0001359102149
  ^

...

2391312941295
328524538124581598
14232323525451258
10915991001185190
0000350000049
                ^

Luego, suelte todos los voladizos como si la gravedad los empujara hacia abajo como arena.

2391312941295
3285245381245 1598
14232323525458258
10915991001181190
00003500000495
             ^

2391312941295
3285245381245  598
14232323525458158
10915991001181290
000035000004951
              ^

...

2391312941295
3285245381245
14232323525458159
10915991001181258
000035000004951908
                 ^

Finalmente, genere estos números, eliminando los ceros a la izquierda. Para nuestro ejemplo trabajado, salida:

[2391312941295, 3285245381245, 14232323525458159, 10915991001181258, 35000004951908]

Para otro ejemplo, suponga la entrada de [1234000,12345678,1234,12340608,12341234].

1234000
12345678
1234
12340608
12341234

Suelta los ceros:

1234  
12345678
1234163
12340208
12340004

Suelta los dígitos sobresalientes restantes:

1234  
1234567
12341638
12340208
12340004

La salida es [1234, 1234567, 12341638, 12340208, 12340004].

Reglas

  • La entrada puede contener ceros a la izquierda. La salida no debe contener ceros a la izquierda.
  • Si corresponde, puede suponer que la entrada / salida se ajustará al tipo entero nativo de su idioma.
  • La entrada y salida se pueden dar por cualquier método conveniente .
  • Un programa completo o una función son aceptables. Si es una función, puede devolver el resultado en lugar de imprimirlo.
  • Las lagunas estándar están prohibidas.
  • Este es el por lo que se aplican todas las reglas habituales de golf, y gana el código más corto (en bytes).
AdmBorkBork
fuente
2
¿Podemos suponer que los números de salida no excederán la precisión de nuestro idioma? (JS redondea 14232323525458159a 14232323525458160)
ETHproductions
@ETHproductions Creo que es un valor predeterminado de PPCG.
Erik the Outgolfer
and all overhangs drop to the bottom-most open slotfue una buena solución a mi desafío roto :).
Urna mágica del pulpo
1
@PeterCordes Sí, la entrada puede contener ceros a la izquierda, por lo que debería poder manejar eso. Me imagino que para la mayoría de los idiomas, eso significa tomar la entrada como una cadena.
AdmBorkBork
1
@PeterCordes La entrada y la salida no necesariamente tienen que estar en base-10 (eso está en los métodos de E / S predeterminados permitidos), siempre que el uso de una base diferente no trivialice la tarea (esa es una laguna estándar). En segundo lugar, supongo que no especifiqué que los ceros iniciales se deben eliminar por completo , aunque esa era la intención. Voy a decidir que no está permitido reemplazar los ceros con espacios, ya que la salida . 1234es muy diferente a la salida 1234.
AdmBorkBork

Respuestas:

10

Jalea , 8 bytes

Z¬Þ€UZṚḌ

Pruébalo en línea!

Cómo funciona

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.
Dennis
fuente
44
¿QUÉ? Mientras leía la pregunta estaba pensando: "Finalmente, no hay forma de que alguien pueda obtener menos de 20 bytes para esto". Madness
Cruncher
1
Sort each row of the transpose by logical NOT, pushing 0's to the end.¿Se garantiza que sea un tipo estable?
Cruncher
1
Sí, Jelly usa Python sorted, que está garantizado para ser estable.
Dennis
Me gusta esta versión de apariencia conmutativa: ṚZẸÞ€ZṚḌ:)
Jonathan Allan
4

Casco , 12 bytes

md↔TmoÖ±miT↔

Pruébalo en línea!

Explicación

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]
ბიმო
fuente
4

Python 2 , 118 bytes

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

Pruébalo en línea!

Versión sin golf

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

Las dos primeras líneas son equivalentes a map(lambda*a...), el comportamiento predeterminado si se mapdebe completar con Nones si una lista es más corta que la otra.
e>'0'es equivalente a cell != '0' and cell != None, porque si es cualquier dígito (1 ~ 9) tendrá un punto de código más alto, y (cualquier) cadena es más alta que None.

Barra
fuente
¿Te importaría publicar una versión sin gofres de esto?
Peter Cordes
@PeterCordes agregó la versión no golfista y una breve explicación de algunos puntos oscuros
Rod
2

Retina 0.8.2 , 95 92 bytes

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

Pruébalo en línea! Explicación: La primera etapa elimina los dígitos sobresalientes ya que esto hace que sea más fácil (editar: aún más fácil para un ahorro de 3 bytes) que la segunda etapa elimine los ceros. La tercera etapa elimina los ceros iniciales.

Neil
fuente
2

Ruby , 104 bytes

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

Pruébalo en línea!

Explicación

->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
}
Unihedron
fuente
1

APL (Dyalog Unicode) , SBCS de 26 bytes

Función de prefijo tácito anónimo que toma una matriz de caracteres como argumento y devuelve una lista de números.

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

Pruébalo en línea!

 transponer la entrada (ya que necesitamos trabajar en las columnas)

' 0'(... )⍤1⍨ aplicar la siguiente función tácito a cada fila (sub-array de rango tensor 1) con ' 0'como derecho argumento ( permutas de los argumentos):

 intersección de la fila y
 y
 el primero de ' 0'
 (es decir row∩' ', todos los espacios de cada fila)

, seguido por…

~ la diferencia establecida
 (es decir row~' 0', la fila pero sin espacios y ceros)

, seguido por…

 intersección de la fila y
 y
 la primera
 de
 la inversa ' 0'
 (es decir row∩'0', todos los ceros de cada fila)

⍎⍤1 evaluar cada fila (sub-matriz de tensor rango 1)
 de
 la transposición de eso (es decir, cada columna; las filas de entrada ahora modificadas)

Adán
fuente
El bit entre paréntesis es inteligente. Me llevó un tiempo comprender la intención allí, aunque sé lo que hacen los garabatos individuales. Una vez que lo entendí, es fácil de superar: ⍎⍤1∘⍉{⍵[⍋3|2×' 0'⍳⍵]}⍤1∘⍉( ⎕io←0) Puede ser más fácil de jugar, por ejemplo, no
exploré dyadic
En realidad, lo anterior es más corto que un programa completo (no un tren):⍎⍤1⍉{⍵[⍋3|2×' 0'⍳⍵]}⍤1⍉⎕
NGN
@ngn Un método tan diferente merece una publicación propia. El procesamiento previo y posterior es obvio.
Adám
1

Perl 5 , -p0 77 bytes

Conteo de estilo antiguo: 79 bytes ( +2para p0)

Dé entrada como líneas en STDIN sin nueva línea final (de lo contrario, todo se ve como saliente y la nueva línea final sube a la parte superior cuando la cadena de entrada se bloquea). P.ej:

0000312941295
239124000124581598
32852353800451258
10235923505185190
1491359102149

Fue un poco complicado hacer que el saliente cayera y 0cayera en una expresión regular

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

Pruébalo en línea!

Ton Hospel
fuente
0

Ruby , 203 bytes

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

Pruébalo en línea!

Una lambda que acepta un conjunto de cadenas y devuelve un conjunto de ints. Siento que me falta algo; esto se siente enorme: /

->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
}
benj2240
fuente
Me outgolfed esto (por ahora)
Unihedron
@Unihedron Wow, me ganaste un 50%. Tienes mi +1 seguro.
benj2240