# perdiendo.org/museodemetralla

entraron en mi cabeza (201) | libros (20) | me lo llevo puesto (7) | pelis (2) | Renta básica (9) | series (6) | escasez (2) | frikeando (94) | arduino (1) | autoreferencial (11) | bici (1) | esperanto (4) | eve online (3) | git (2) | GNU/linux (4) | markdown (7) | nexus7 (2) | python (7) | raspberry pi (3) | vim (1) | wordpress (1) | zatchtronics (3) | hago (760) | canciones (157) | borradores (7) | cover (42) | el extremo inútil de la escoba (2) | elec (1) | GRACO (2) | guitarlele (11) | ruiditos (11) | Solenoide (1) | fotos (37) | nanowrimo (3) | novela (26) | criaturas del pantano (5) | el año que no follamos (12) | huim (5) | rehab (4) | poemas (356) | Anclajes (15) | andando (3) | B.A.R (7) | Canción de cuna para un borracho (38) | Cercos vacíos (37) | Cien puentes en la cabeza (7) | Conejo azul (6) | Contenido del juego (5) | De tiendas (3) | del pantano (3) | Destrozos (2) | Epilogo (4) | Fuegos de artificio (5) | Imposible rescate (15) | Jugando a rojo (7) | Libro del desencuentro (2) | Lo que sé de Marte (11) | Los cuentos (21) | Montaje del juego (5) | Orden de salida (4) | palitos (31) | Piernas abiertas (7) | Poemas medianos (12) | Privado de sueño (7) | rasguemas (5) | Tanto para nada (17) | Todo a 100 (2) | Uno (4) | relatos (97) | anatemas (9) | orbital (2) | prompts (8) | vindicaciones (103) | perdiendo (1.708) | atranques (1) |

nomadland

Todo el mundo es amable, nadie roba, nadie golpea, nadie viola. Tiene varias opciones de abandonar la vida que lleva, pero eso supondría no valerse por sí misma. Mejor enriquecer a los que ya están forrados a cambio de migajas. Lo peor que le sucede tras las jornadas maratonianas currando en Amazon es que se queda dormida en un banco de ejercicios mientras va de compras. Uau.

Más que la relación laboral, que ya es, no hay abusos de poder en una situación con tanta escasez. No hay.

(No podía irse del pueblo porque eso sería como si su difunto marido no hubiera vivido nunca, sólo existe lo que se recuerda. Amija mía, si depende de que lo recuerdes, ¿qué importa dónde estés cuando lo hagas?)

Estoy confuso con esta película. No sé si es un ejercicio de equidistancia imposible. Lo malo que es gente sin un duro y tan mayor trabajando porque no tienen dónde caerse muertos junto qué bonito es el campo. Lo malo que es que se te joda la furgoneta y repararla te cueste 3k cuando no tienes nada junto ah, bueno, si me trago el orgullo mi hermana me los presta y listo. Lo malo de no, Mike, no fue mi decisión la que me llevó a las carreteras, fue la maldad de gente como tú que mete a la gente en deudas que no pueden pagar junto con descubrir que la gente cuando arrima el hombro y se asocia gana mucha fuerza. Lo malo de vivir al día —el nombre es sobrevivir, lo demás son metáforas— junto con el romanticismo de cagar en un bidón de plástico como pseudónimo de la libertad.

Si sumo me ha gustado porque denuncia. Aunque lo haga flojito. No se habla de horarios, productividad, objetivos, resultados… ¡Amazon incluso paga dos días más del parking de caravanas una vez que termina la temporada! Si no te fijas mucho casi parece que está dando a entender que la empresa está ayudando a que gente en esta situación a tener una alternativa. Caritativa. Una ONG. Una santa. ¿Le está pagando dinero a esta gente que a duras penas puede caminar?

Y me ha gustado porque expone consecuencias. Aunque flojito. La vida ahí fuera es maravillosa, por mucho que nos hayan estampado contra ella. Quizá con algo más de pasta… ¿pero quién no tiene de quién tirar para solucionarlo? Y eso que la protagonista se aisló de su familia yéndose a vivir al carajo con su marido. Si es que estamos mucho mejor de lo que queremos.

El valor de la historia está en la historia en sí, la situación en sí, el por qué y a dónde conduce. Y eso es así pese a que haya que ir ignorando los andamios que se van colocando en cada fotograma para justificarla y dulcificarla, pretendiendo convertirla de algún modo en algo justificado y, al fin y al cabo, no tan malo porque el campo es bonito.

Cuando la escasez te agarra por el cuello, eres incapaz de percibir cualquier otra cosa. Los atardeceres son para quien puede mirarlos sin tener que pensar en cómo sobrevivirlos.

caminantes de la incertidumbre

Es como si no hubiera más que hacer en esta vida que comerse las uñas esperando qué va a ser lo próximo que te va a partir por la mitad. Un puñado de ladrones vestidos de gurús están ahora vendiendo las ventajas de la incertidumbre. Acostúmbrate a ella, dicen. Aprende a convivir con ella, dicen. Sácale partido, dicen.

La incertidumbre tiene grados en función de hasta dónde puedes caer. Normalmente los que conviven tan ricamente con ella suelen tener red suficiente como para tomarse un fracaso como una estupenda pausa para pensar en qué empezar a continuación. Se llevan tan estupendamente bien con ella porque por mucho que les afecte nunca los lleva al pozo.

¡Qué estupenda ocasión para dar unos golpecitos en tu adormecida rutina! Vete a la mierda, gilipollas.

el ahorcado

Es divertido, mucho. Pero después de reventarme contra ello es de esas cosas que sé que puedo entender si la reviso, pero no sé si sería capaz de crearlo por mí mismo (dudo mucho que fuera capaz).

# el famosísimo internacionalmente juego del ahorcado versión mimismo

import random # importamos el módulo para elegir posteriormente entre las palabras de la variable "palabras"

'''
Cadena multi-línea: comillas triples en una variable permiten meter varias líneas sin tener que utilizar \n

Lista: contiene varios valores a los que se puede acudir por número de izq a der empezando desde el 0,
en la de abajo IMÁGENES_AHORCADO cada elemento de la lista es una cadena multi-línea

Constantes: para variables constantes como IMÁGENES_AHORCADO la convención es que vayan escritas en mayúscula
(una "variable constante" es un contrasentido como un piano, yo diría "constante" sin más)

'''

IMÁGENES_AHORCADO = [''' 

  +---+
  |   |
      |
      |
      |
      |
=========''', '''

  +---+
  |   |
  O   |
      |
      |
      |
=========''', '''

  +---+
  |   |
  O   |
  |   |
      |
      |
=========''', '''

  +---+
  |   |
  O   |
 /|   |
      |
      |
=========''', '''

  +---+
  |   |
  O   |
 /|\  |
      |
      |
=========''', '''

  +---+
  |   |
  O   |
 /|\  |
 /    |
      |
=========''', '''

  +---+
  |   |
  O   |
 /|\  |
 / \  |
      |
=========''']

palabras = 'hormiga babuino tejon murcielago oso castor camello gato almeja cobra pantera coyote cuervo ciervo perro burro pato aguila huron zorro rana cabra ganso halcon leon lagarto llama topo mono alce raton mula salamandra nutria buho panda loro paloma piton conejo carnero rata cuervo rinoceronte salmon foca tiburon oveja mofeta perezoso serpiente araña cigüeña cisne tigre sapo trucha pavo tortuga comadreja ballena lobo wombat cebra'.split()

# el método .split() devuelve una lista en la que cada palabra en la cadena es un elemento aparte, separa en cada hueco en blanco. 
# "palabras" pasa a ser una lista igual que si hubiéramos escr
# con ListaDePalabras defines un parámetro, dices que al lanzar la función obtenerPalabraAlAzar le incluirás una lista entre (). ito palabras = ['hormiga', 'babuino'] etcetc.

# recordatorio personal: definir funciones no pone en marcha nada, simplemente las define para un futuro

# no es que estés creando otra lista, sino que le indicas que trabajará con una lista de palabras que proporcionas, en este caso 'palabras'
# eso mola porque la función utilizará listaDePalabras para manipularlas se llame como se llame la lista que le metas
# lo que me ha costado comprender esto, todo está relacionado con las variables globales y las variables locales
# si dentro de la función substituyes listaDePalabras por palabras todo seguiría funcionando igual, de hecho lo hace en la función siguiente
def obtenerPalabraAlAzar(listaDePalabras):
    índiceDePalabras = random.randint(0, len(listaDePalabras) - 1) # el número que se usará para elegir de la lista palabras[x]
# -1 porque el elemento 1 es el 0 en la asignación, así que la cuarta palabra en la lista estará en la posición 3
# elige entre 0 y la longitud de la lista -1
    return listaDePalabras[índiceDePalabras]
# devuelve listaDePalabras (que en este caso es palabras, el nombre de la lista) y [el índice]: palabras[x]

# en esta función las variables locales se llaman igual que las globales, aunque no son las mismas
def mostrarTablero(IMÁGENES_AHORCADO, letrasIncorrectas, letrasCorrectas, palabraSecreta):
    print(IMÁGENES_AHORCADO[len(letrasIncorrectas)]) # imprime de la lista de imágenes la que está en la posición de las letras incorrectas
    print() # imprimimos una línea en blanco

    print('Letras incorrectas:', end=' ') # imprime el texto y no salta a la línea de abajo
    for letra in letrasIncorrectas: # letra es una nueva variable for hace que "deletree" las letras que pertenecen a incorrectas y las guarda en cada ciclo en letra
        print(letra, end=' ') # la secuencia for imprime letra sin saltar a la linea de abajo
    print() # imprimimos una línea en blanco

    espaciosVacíos = '_' * len(palabraSecreta) # las líneas de la palabra, imprime tantos _ como su longitud

    for i in range(len(palabraSecreta)): # nueva variable i en la que se acumula toda la longitud de palabraSecreta, si tiene 7 letras se moverá entre el 0-6
        if palabraSecreta[i] in letrasCorrectas: # si la letra que toca está en letras correctas... (cualquier variable es tb una lista de letras, guardas 'hola' y palabraSecreta[0] será h)
            espaciosVacíos = espaciosVacíos[:i] + palabraSecreta[i] + espaciosVacíos[i+1:]
            ''' vamos a actualizar espaciosVacíos por las letras descubiertas con un corte de lista
                corte de lista [a:c] marca las palabras que se van a incluir con desde-hasta, y el hasta no incluye, en hola[1:3] sería ol, las pos 1 y 2
                1. espaciosVacíos[:i] metemos los valores de espacios vacíos hasta i (para no modificar los anteriores bucles de _ vacíos y letras descubiertas)
                el hasta del corte llega hasta justo la posición anterior a i
                2. palabraSecreta[i] metemos la letra que ha sido correcta en i
                3. espaciosVacíos[i+1:] metemos desde i en adelante lo que hubiera (_ vacíos y letras descubiertas)
                de espaciosVacíos nos interesan los _ y las letras descubiertas en bucles anteriores, y de palabraSecreta sólo la letra correcta
            '''

    for letra in espaciosVacíos: # generamos letra con todo lo que esté en spaciosVacíos
        print(letra, end=' ') # imprimimos las letras y los _ (letra es la variable que creamos cada ciclo) y no saltamos de línea
    print() # imprimimos una línea en blanco

# nueva función para recibir la nueva letra, le metemos letrasProbadas con las letras que hemos metido con anterioridad como parámetro
def obtenerIntento(letrasProbadas):
    while True: # jaja, siempre es true hasta que sales con return
        print('Adivina una letra.') # imprimimos Adivina...
        intento = input() # le pedimos que meta una letra y la guardamos en intento
        intento = intento.lower() # la ponemos en minúscula
        if len(intento) != 1: # si la longitud de intento es más de uno es que ha metido más de una letra y no mola
            print('Por favor, introduce una letra.') # le decimos lo que ha pasado
        elif intento in letrasProbadas: # tb si la letra ya la ha metido antes 
            print('Ya has probado esa letra, elige otra.') # le decimos que ya lo ha hecho
        elif intento not in 'abcdefghijklmnñopqrstuvwxyz': # si no está en el abecedario
            print('Por favor, ingresa una LETRA.') # se lo recordamos
        else: # en cualquier otro caso
            return intento # devolvemos el resultado metiéndolo en la variable global intento

# función para volver a jugar o salir
def jugarDeNuevo(): # definimos, no necesita parámetro
    print('¿Quieres jugar de nuevo (sí o no)') # imprimimos la pregunta
    return input().lower().startswith('s') # ponemos input en minúsculas, si empieza por s devuelve True (s no es lo mismo que S)

# y empieza el juego!
print('A H O R C A D O') # imprimimos el nombre
letrasIncorrectas = '' # creamos la variable letrasIncorrectas
letrasCorrectas = '' # creamos la variable #letrasCorrectas
# la única vez que se invoca "palabras" es para meterla dentro de la función obtenerPalabraAlAzar
# le estás diciendo a la función el nombre de la lista que tiene que utilizar
palabraSecreta = obtenerPalabraAlAzar(palabras) # creamos la palabra correcta
juegoTerminado = False # establecemos el status para salir del juego en False

while True: # repite el bucle indefinidamente hasta que algo le saca
    mostrarTablero(IMÁGENES_AHORCADO, letrasIncorrectas, letrasCorrectas, palabraSecreta) # invocas mostrarTablero con sus variables

    intento = obtenerIntento(letrasIncorrectas + letrasCorrectas) # creas intento invocando a la función obtenerIntento, con las letrasIncorrectas y las letrasCorrectas como variables que se meterán en la variable local letrasProbadas

    if intento in palabraSecreta: # aquí la función obtenerIntento ya ha devuelto la letra que ha metido el tipo, así que si está en la palabraSecreta...
        letrasCorrectas = letrasCorrectas + intento # la añadimos a letrasCorrectas manteniendo las anteriores, en intento sigue estando la letra que ha metido el tipo

        encontradoTodasLasLetras = True # marcamos el status de encontradoTodasLasLetras como verdadero, tendrá sentido en el siguiente if
        for i in range(len(palabraSecreta)): # bucle for para testar las letras
            if palabraSecreta[i] not in letrasCorrectas: # si una de las letras de palabraSecreta no está en letrasCorrectas
                encontradoTodasLasLetras = False # cambiamos el status de encontradoTodasLasLetras a False
                break # rompemos el for, así que pasará a else:
        if encontradoTodasLasLetras: # si encontradoTodasLasLetras es True
            print('¡Sí! ¡La palabra secreta es "' + palabraSecreta + '"! ¡Has ganado!') # imprimes el final
            juegoTerminado = True # y creas juego terminado y le das valor True
    else:
        letrasIncorrectas = letrasIncorrectas + intento # si la letra no estaba en la palabra secreta, la añadimos a letras incorrectas

        if len(letrasIncorrectas) == len(IMÁGENES_AHORCADO) - 1: # ojo, si la longitud de letrasIncorrectas es igual a IMÁGENES_AHORCADO - 1 (len empieza en 1, las listas en 0)
            mostrarTablero(IMÁGENES_AHORCADO, letrasIncorrectas, letrasCorrectas, palabraSecreta) # invocamos mostrarTablero con sus parámetros
            print('¡Te has quedado sin intentos!\nDespués de ' + str(len(letrasIncorrectas)) + ' intentos fallidos y ' + str(len(letrasCorrectas)) + ' aciertos, la palabra era "' + palabraSecreta + '"')
            # imprimimos msg + el número de letras incorrectas + msg + el número de letras correctas + msg + la palabra secreta que había que adivinar
            juegoTerminado = True # y establecemos juegoTerminado en True

    if juegoTerminado: # invocamos juegoTerminado, y si devuelve True 
        if jugarDeNuevo(): # si el tipo ha contestado cualquier cosa que empiece por s, incluido soplapollas
                           # atención a cómo juegoTerminado, que no es una función, no tiene (), mientras que jugarDeNuevo, que sí lo es, sí los tiene
            letrasIncorrectas = '' # ponemos a cero letrasIncorrectas
            letrasCorrectas = '' # ponemos a cero letrasCorrectas
            juegoTerminado = False # convertimos juegoTerminado a False
            palabraSecreta = obtenerPalabraAlAzar(palabras) # obtenemos una nueva palabraSecreta
        else: # si jugarDeNuevo devuelve false
            break # cerramos el programa