El problema
Un escenario del fin del mundo se describe mediante tres números en una sola línea, n
, m
, y p
. Siguiendo esa línea hay n
líneas con m
valores por línea. Cada valor representa las unidades totales de agua que puede contener cada celda.
Las siguientes p
líneas describen el clima para los próximos p
días. 1 unidad de lluvia cae en una sola celda cada día. Si la cantidad de agua en una celda excede la cantidad que puede contener, esa celda se inunda. Si varias celdas adyacentes están a plena capacidad, se tratan como una celda que comparte vecinos comunes (piense en Buscaminas cuando hace clic en un grupo de espacios en blanco).
- Una sola celda media tiene 4 vecinos.
- Dos celdas intermedias adyacentes de capacidad total se tratan como una celda que tiene 6 vecinos
- Una celda de esquina individual tiene 2 vecinos.
- Una celda de pared simple tiene 3 vecinos.
Cuando una celda se inunda, ocurre un evento de inundación. Todo el exceso de agua se distribuye uniformemente a sus vecinos. Si eso hace que uno o más vecinos se inunden, entonces ocurre otro evento de inundación. Esto continúa hasta que el agua se haya asentado o la ciudad se haya inundado por completo.
Entrada de ejemplo
7 5 3
3 2 3 4 5
2 2 0 3 4
1 1 2 3 3
4 1 2 2 2
4 1 1 2 2
4 4 1 2 2
4 4 2 2 2
0 0
1 2
4 3
0 0
significa que llovió en la fila 1, col 11 2
significa que llovió en la fila 2, col 3 (que puede contener cero agua e inmediatamente se inunda)
Después de p
días de lluvia, si la ciudad está completamente inundada, produzca Sink . De lo contrario, salida Swim .
Salida de ejemplo
Nadar
Supuestos
- La entrada puede proporcionarse a través de stdin, leerse desde "city.txt" o aceptarse como argumento. Los tres están permitidos para no invalidar las respuestas ya publicadas.
- Las capacidades hídricas serán enteros no negativos.
Más de 40 equipos de estudiantes universitarios de pregrado (de A&M, UT, LSU, Rice, Baylor, etc.) que compiten en un concurso de programación con una variedad de idiomas disponibles no pudieron resolver este problema en 5 horas. Debido a eso, no puedo evitar mencionar que hay una trampa en este rompecabezas que hace que la solución sea trivial. El código más corto sigue ganando, porque estoy seguro de que el código más corto también resolverá el rompecabezas.
n
líneas dem
valores o al revés? Su ejemplo no coincide con la especificación escrita.0.25
unidades a cada celda adyacente (suponiendo una sola celda inundada media)?Respuestas:
Golfscript,
3730 caracteresNuevo y mejorado, gracias a PeterTaylor por sus consejos:
Explicacion :
Luego, el programa termina y genera la pila.
Versión anterior + explicación:
El mismo enfoque que Fors , solo Golfscripted =). Probablemente se puede hacer más eficiente. La entrada es de stdin.
Explicacion :
Luego, el programa genera la pila, que es solo la respuesta.
fuente
]
sin una coincidencia[
, recogerá toda la pila en una matriz, por lo que[~]
se puede simplificar una inicial~]
. Para obtener los primerosgrid_size
elementos de una matriz, use<
, por<{+}*
lo que casi con seguridad puede ahorrarle un poco al agregar la capacidad total.0>"Sink""Swim"if
puede ser0>"SinkSwim"4/=
~]
? Lo intenté y no pareció funcionar. El último truco es bueno, aunque tiene que serlo"SwimSink"
, lo usaré. y lo de la matriz también parece prometedor, se pondrá a trabajar en eso.ruby golfscript.rb
y todavía no funcionó ... ¿puedes verificar que funcione en tu extremo? Me sale el mismo error en ambos:undefined method '+' for nil:NilClass (NoMethodError)
C:
1009695 caracteres¿Cinco horas? Me llevó cinco minutos. :)
Aragaer, gracias por las simplificaciones! Sin embargo, reorganicé las declaraciones de variables y los argumentos a main, ya que Clang arroja un error si el segundo argumento a main es de otro tipo que no sea
char **
.fuente
p;main(n,m){for(scanf("%d%d%d",&n,&m,&p),n*=m;n--;scanf("%d",&m),p-=m);puts(p>0?"Sink":"Swim");}
n,m;main(p){for(scanf("%d%d%d",&n,&m,&p),n*=m;n--;scanf("%d",&m))p-=m;puts(p>0?"Sink":"Swim");}
. También he jugado con la idean-=scanf
, pero no estoy seguro de si el programa será correcto después de eso. Primeroscanf
se puede mover al frentefor
sin cambiar el recuento de caracteres.n-=scanf...
no funcionaría, ya quen-=1
básicamente es un incremento previo, por lo que se perdería la esquina sureste. El otro cambio es genial.Python, 4 líneas, 175 caracteres
Lol, me pregunto si los más de 40 equipos terminaron encontrando la captura ... después de resolverlo de la manera difícil.
fuente
#
.input()
ymap()
:n,_,p=map(int,input().split());print(['sink','swim'][p>sum(sum(map(int,input().split()))for a in range(n))])
J (50 caracteres) y K (40) doble función
Resulta que, como siempre, estos dos tienen exactamente la misma estructura en sus soluciones, por lo que ambos están aquí. Sin embargo, K es mucho más corto, lo cual es una agradable sorpresa.
Explicación:
".1!:1]1
- Leer en la primera línea y convertir a enteros.(...)/0 2{
- Tome los elementos en el índice 0 y 2 (n
yp
respectivamente), y utilícelos como argumentos izquierdo y derecho del verbo(...)
, respectivamente.+1!:1@#1:
- Leer enn+p
líneas.[+/@".@$
- Tome ($
) las primerasn
filas ([
), descartando el resto, y luego convierta a enteros (".
) y sume en cada fila (+/
).]<[:+/
- Sume las sumas de filas, y luego comparar este valor con el argumento de la derecha,p
. Producimos verdadero sip
es menor que la suma.>Sink`Swim{~
- SeleccioneSwim
si la compra anterior resultó en verdadero oSink
si es falso.Uso:
Y ahora la K:
Explicado:
. 0:`
- Leer en una línea de entrada y convertir a una matriz de enteros.{...}.
- Utilice estos tres númerosn m p
como argumentosx y z
para esta función.0::'(x+z)#`
- Creex+z
copias del identificador del archivo de entrada`
y luego lea en línea para cada una de ellas (0::'
)..:'x#
- Tome los primerosx
elementos y conviértalos a un vector de números.z<+//
- Suma toda la matriz, y luego prueba para ver si es mayor quez
.`Sink`Swim@
- DevolverSink
oSwim
según si la prueba devuelve verdadero.Uso:
fuente
APL, 35
No estoy seguro si está permitido, pero deja de aceptar entradas después de la "ciudad"
x←⎕
Toma datos y los almacena en variablesx
(los números delimitados por espacios se interpretan como una matriz numérica)1⌷
Extrae el índice 1 (las matrices APL están basadas en uno)⍳
Genera una matriz de 1 al argumento (1⌷x←⎕
en este caso)¨
Operación "Map"{+/⎕}
Toma matriz de ingrese y devuelva la suma+/
Suma la matriz generada por la operación de mapeo4×x[3]>
Pruebe si la suma <x[3]
(devuelve 1 o 0), luego multiplique 4'SwimSink'⌽⍨
Gire la cadena'SwimSink'
por esa cantidad4↑
Finalmente, extraiga los primeros 4 caracteres de la cadenafuente
⎕IO←0
, luego reemplace4↑'SwimSink'⌽⍨4×
con'Swim' 'Sink'⊃⍨
,x[3]
conx[2]
y1⌷x
con⊃x
para guardar dos bytes.AWK, 70
Esta es una mejora de laindir en mi presentación (86):
fuente
NR<=h
debería serNR<=h+1
, de lo contrario, obtendrá sumideros falsos ya que se omite la última línea de capacidades. Esto también se puede acortar a 70 comon{for(;NF;NF--)s+=$NF;n--}NR==1{n=$1;p=$3}END{print p<s?"Swim":"Sink"}
CoffeeScript -
128113Una función que toma la cadena como único argumento:
fuente
`p>x?"Sink":"Swim"`
lugar deif p>x then"Sink"else"Swim"
. Parens para la tercera declaración tampoco son necesarios.SED, 128
Fue divertido escribir una
sed
versión de esto. Tiene las siguientes deficiencias:Se supone que la ciudad tiene más de dos columnas, para reconocer fácilmente las líneas de lluvia.
Se supone que la capacidad de cada ciudad está en el rango de 0-9.
Aquí está:
Llama con la
-n
bandera.fuente
SWI-Prolog 79
Si no le importa el hecho de que esta respuesta toma entrada por consulta, en lugar de a través de stdin:
La respuesta no valida el formato de entrada, pero no creo que sea un problema, ya que el concurso de programación tampoco requiere que lo hagas.
Consulta de muestra (usando el ejemplo en la pregunta):
fuente
Python - 152
fuente
,
, antes y después'
, después)
...Scala - 128
Puede ser posible omitir algunos paréntesis o algo así, pero Scala es realmente voluble sobre la puntuación y el estilo sin puntos y () vs {} y otras cosas.
fuente
Javascript - 73 caracteres
Asume que la entrada está en la variable
s
y las salidasSwim
oSink
.Ejemplo:
De la pregunta original, ingresando esto en la consola del navegador:
Salidas:
fuente