Este programa cuenta el número de ocurrencias superpuestas de una cadena dentro de una cadena más grande.

Entrada:

  • cadena más grande (nombre var: espacio_búsqueda) << abababa

  • cadena más pequeña (nombre de var: cadena_búsqueda) << aba

Responda usando 'Debug Code' en Pycharm 2016.3: 3

Responda usando 'Run Code' en Pycharm 2016.3: 7

Respuesta esperada: 3

Mi código:

import sys

def count_substring(search_space, search_string):
    search_space = search_space.lower()
    search_string = search_string.lower()

    if search_space:
        search_space = search_space.split('\n')[0]
    if search_string:
        search_string = search_string.split('\n')[0]
    lower = 0
    upper = len(search_string)
    curr = ' '
    count = 0
    for curr in search_space:
        selected = search_space[lower:upper]
        if search_string == selected:
            count += 1
        lower += 1
        upper += 1
        if upper > len(search_space):
            break
    return count

if __name__ == '__main__':
    s = sys.stdin.read()
    t = sys.stdin.read()
    occurance_count = count_substring(s, t)
    sys.stdout.write(str(occurance_count))

El código fue modificado para ayudar a dilucidar el error:

for idx, curr in enumerate(search_space):
    print(idx, curr)
    print(count)
    selected = search_space[lower:upper]

Salida utilizando el 'Código de depuración': (funciona según lo previsto)

>? abababa <ENTER>
>? aba <ENTER>
0 a
0
1 b
1
2 a
1
3 b
2
4 a
2
3

Salida usando 'Código de ejecución':

abababa
aba
^D  
0 a
0
1 b
1
2 a
2
3 b
3
4 a
4
5 b
5
6 a
6
7

Nota: ^ D, es decir, Ctrl + D, se presiona porque al presionar ENTER durante la ejecución se inserta una nueva línea. Ctrl + D es la única forma en que logro que se ejecute el código restante. Pero incluso sin CTRL + D, la discrepancia permanece cuando se realiza una prueba remota del código (es parte de un curso autoguiado sin certificado)

Nota: Tengo que usar entradas y salidas estándar para este ejercicio.

Me parece que usar for curr in search_space: está haciendo que el ciclo se repita a lo largo de search_space y, por lo tanto, más veces de lo que debería.

¿Por qué no funciona el comando Break?

Mis preguntas:

  1. ¿Por qué está pasando esto?
  2. ¿En qué concepto leo más para comprender y prever tales eventos?
  3. ¿Por qué la discrepancia en los modos de depuración y ejecución?
  4. ¿Cómo puedo prever y prevenir este error en el código futuro?
  5. ¿Hay una mejor manera de ejecutar esto que Ctrl + D? Este truco crudo no funciona en Terminal o IDLE.
0
kchawla-pi 21 mar. 2017 a las 01:14

2 respuestas

La mejor respuesta

El código se lee dos veces desde stdin: sys.stdin.read(). Este método lee desde ese flujo hasta su final (no el final de la línea como en el ejemplo de "ejecución"). Solo debe llamarse una vez, y no debe tocar stdin después.

Si desea leer la entrada línea por línea, use sys.stdin.readline().

0
Elmar Peise 19 may. 2017 a las 12:34

Elmar Peise comentó:
Has leído dos veces desde stdin: sys.stdin.read (). Este método lee desde ese flujo hasta su final (no el final de la línea como en su ejemplo de "ejecución"). Solo debe llamarse una vez, y no debe tocar stdin después.

Qubit escribió:
Reemplacé read () con readline () y todo funcionó.
Si alguien tiene más pepitas útiles para compartir, hágalo y gracias, pero mi situación particular ahora está resuelta, así que marque esto como respuesta.
Gracias elmar!

0
kchawla-pi 20 mar. 2017 a las 23:28