Detectar palíndromos y palíndromos de rotación en SAS

Detectar palíndromos y palíndromos de rotación en SAS


Un palíndromo es una secuencia de letras que se leen igual hacia adelante y hacia atrás. En resumen, si invierte la secuencia de letras, la palabra permanece sin cambios. Por ejemplo, «mamá» y «coche de carreras» son palíndromos. Puede extender la definición a frases eliminando todos los espacios y signos de puntuación de la frase y preguntando si las letras restantes son un palíndromo. Por ejemplo, «¿pedir prestado o robar?» es un palíndromo porque la secuencia de letras «borroworrob» es la misma cuando se lee hacia adelante y hacia atrás.

Recientemente vi un nuevo tipo de palíndromo: el palíndromo de la revolución. Tomas una palabra (escrita en minúsculas) y la giras 180 grados para que las letras queden al revés e invertidas. Luego pregunte si el patrón de letras coincide con la palabra original. Si es así, ¡has encontrado un palíndromo rotacional!

Este artículo muestra cómo se reconocen los palíndromos, palíndromosfrases y palíndromos de rotación en SAS. En el camino, aprenderemos algunas funciones útiles de comparación de cadenas, como las funciones UPCASE, STRIP, COMPRESS, REVERSE y TRANSLATE.

Reconocer una palabra palíndromo en SAS

Para introducir el tema de los palíndromos, primero veamos solo las palabras. Si desea determinar si una palabra es un palíndromo, haga lo siguiente:

  1. Use la función UPCASE para convertir todas las letras a mayúsculas.
  2. Utilice la función REVERSE para obtener la secuencia inversa de letras.
  3. Utilice la función STRIP para eliminar los espacios iniciales o finales. Compara la secuencia de letras original e invertida. Si las dos secuencias son iguales, la palabra es un palíndromo.

El siguiente paso SAS DATA implementa este algoritmo en un conjunto de palabras.

data Words;
length source $120;
input source;
datalines;
solos
Hannah
Dad
madaM
racecar
SAS
STATs
programmer
;
 
/* detect palindrome words */
data Palindrome;
  set Words;
  length str reverse $120;
  str = upcase(source);
  reverse = reverse(str);
  isPalindrome = (strip(str) = strip(reverse));  /* 0/1 indicator variable */
run; 
 
proc print noobs; run;

El conjunto de datos contiene una variable indicadora (isPalindrome) que tiene un valor de 1 para palabras de palíndromo y un valor de 0 si la palabra no es un palíndromo. Palabras como «Solos», «Padre» y «SAS» son palíndromos. La palabra «programador» no lo es.

Reconocer una frase palíndromo en SAS

La misma lógica funciona para una frase palindrómica, pero requiere un paso adicional. Para una oración, primero debe eliminar los espacios y la puntuación de la cadena y luego aplicar la lógica anterior a la cadena de letras restante. Puede usar la función COMPRESS en SAS para eliminar espacios y puntuación. A menudo, los programadores llaman a la función COMPRESS con dos argumentos: la cadena de entrada y un conjunto de caracteres para eliminar de la cadena. Sin embargo, el tercer argumento opcional proporciona una forma de eliminar conjuntos de caracteres compartidos de la cadena de entrada. Por ejemplo, para eliminar todos los signos de puntuación, puede especificar «p» como parte del tercer argumento. Para eliminar todos los espacios, puede especificar el modificador ‘s’. Puede especificar ‘ps’ para combinar estos dos modificadores de esta manera:

data Sentences;
length source $120;
infile datalines truncover;
input source $ 1-120;
/* use DATALINES4 if a string includes a semicolon */
datalines;   
Madam, I'm Adam.
Step on no pets.
No lemon, no melon.
To be or not to be.
My gym, sir, is my gym.
Was it a cat I saw?
A man, a plan, a canal: Panama!
racecar
SAS
programmer
;
 
/* detect palindrome phrases (also works for words) */               
data Palindrome;
  set sentences;
  length str reverse $120;
  str = compress(upcase(source), , 'ps');  /* remove punctuation and whitespace */
  reverse = reverse(str);
  palindrome = (str = strip(reverse));     /* no blanks in str */
  drop reverse;
run; 
 
proc print  noobs; run;

Este programa maneja tanto palabras como frases, por lo que puede reemplazar al programa de la sección anterior. De niño me encontré con la frase palindrómica «Un hombre, un plan, un canal: ¡Panamá!» en un libro de juegos de palabras; siempre me divirtio!

Generalizaciones de palíndromos

El palíndromo tradicional es un ejemplo específico de un problema matemático más general. Matemáticamente, una transformada es una función que asigna un conjunto a sí mismo. Un punto fijo es un elemento en el dominio de una transformación que se asigna a sí mismo. si R Si la transformación es sobre una serie de letras que invierte las letras, entonces un palíndromo es un punto fijo para la R Transformación.

Con esta generalización, puedes jugar todo tipo de juegos matemáticos. Puede buscar el palíndromo más cercano a una palabra específica. Puede buscar «cerca de palíndromos». Por ejemplo, «Bevel» es casi un palíndromo, ya que puedes reemplazar la «b» por una «l» para obtener el «nivel» del palíndromo.

Alternativamente, puede cambiar la transformación y encontrar puntos fijos de la nueva transformación. Esa es la idea detrás de un palíndromo de rotación. Ciertas letras minúsculas parecen una sola letra si las rotas 180 grados. yo uso la expresión similar a una rotación para referirse a un par de letras como «b» y «q» que son rotaciones de 180 grados entre sí. Algunas letras (como ‘o’ y ‘s’) son similares a la rotación. Dado un conjunto de letras, defina una transformación de dos pasos: primero, asigne ciertas letras a su imagen similar a una rotación. A continuación, aplique la transformación BACK. Luego busca puntos fijos de la figura compuesta.

Cada una de las siguientes 13 letras minúsculas es rotacionalmente similar a otra letra minúscula. Cinco de ellos (‘l’, ‘o’, ‘s’, ‘x’ y ‘z’) son autosimilares:

b -> q
d -> p
l -> l
m -> w
n -> u
o -> o
p -> d
q -> b
s -> s
u -> n
w -> m
x -> x
z -> z

Para definir completamente la transformación, también debes definir cómo afecta al resto de letras (‘a’, ‘c’, ‘e’, ​​etc.). Las palabras que contienen estas letras nunca son palíndromos rotacionales, ya que rotar estas letras 180 grados no produce una letra minúscula válida.

Por ejemplo, «mamá» no es un palíndromo rotatorio, porque si lo giras 180 grados, obtienes «wow». Pero «Pod» es un palíndromo de revolución porque la letra «p» es la rotación de 180 grados de «d» (y viceversa) y la letra «o» es rotacionalmente simétrica. La palabra «Mow» es un palíndromo rotacional, pero «Maw» no lo es porque la letra «a» no es rotacionalmente similar a ninguna otra letra.

Palíndromos de rotación en SAS

Puede utilizar la función TRANSLATE en SAS para definir la transformación de rotación. La función TRANSLATE toma tres argumentos: la cadena de entrada y dos cadenas de reemplazo, TO y FROM. La cadena FROM es el conjunto de letras que desea reemplazar y la cadena TO es el conjunto de letras que desea usar para el reemplazo. Creo que es más claro definir una cadena de 26 letras para que puedas ver cómo cada letra se convierte en una palabra. En el siguiente programa, las letras que no tienen parientes de rotación se asignan a un punto (.). Suponiendo que elimine todos los signos de puntuación de la cadena de entrada, esta opción garantiza que el programa identifique correctamente los palíndromos rotacionales.

Puedes usar un truco matemático para comprobar si hay un palíndromo de rotación. Una rotación de 180 grados es matemáticamente equivalente a un giro horizontal seguido de un giro vertical. Por lo tanto, puede programar una rotación de 180 grados reemplazando primero la letra similar a la rotación y luego invirtiendo la cadena de esta manera:

data Words2;
length source $120;
infile datalines truncover;
input source $ 1-120;
datalines;
solos
mow
maw
pod
dad
mop dow
madam
SAS
;
 
/* detect rotational palindromes */
data Rotate;
  set Words2;
  length str flip flipReverse $120;
  FROM='abcdefghijklmnopqrstuvwxyz0123456789'; /* old values (including digits) */
  TO = '.q.p.......lwuodb.s.n.mx.z01....9.86'; /* map to new values */
  str = compress(lowcase(source), , 'ps');     /* remove blanks and punctuation */
  flip = translate(str, TO, FROM);             /* map to rotationally similar letters */        
  flipReverse = strip(reverse(flip));          /* do the usual palindrome check */
  isRotPalindrome = (str = flipReverse);
  drop TO FROM;
run; 
 
proc print noobs; run;

El programa elimina la puntuación y los espacios, traduce cada letra a su imagen similar a una rotación y luego determina si la cadena invertida es igual a la cadena original. El programa comprueba si «Mow» y «Pod» son palíndromos de rotación. También tenga en cuenta que la palabra «soli» es una palabra muy especial. ¡Es a la vez un palíndromo tradicional y un palíndromo rotacional! Un palíndromo que contiene solo letras autosimilares es también un palíndromo de revolución.

resumen

Un palíndromo tradicional es una serie de letras que son iguales en orden hacia adelante y hacia atrás. Este artículo muestra cómo usar las funciones de cadena integradas en SAS para detectar palíndromos. Algunas funciones útiles incluyen UPCASE, STRIP, COMPRESS y REVERSE. Además, puedes generalizar la noción de palíndromo. Un palíndromo generalizado es un punto fijo para una transformación de las letras en una cadena. Muestro cómo definir un palíndromo de rotación asignando letras específicas a sus imágenes de rotación y luego verificando que el inverso de la cadena resultante sea igual a la cadena original.

Siéntase libre de compartir sus pensamientos sobre los palíndromos. ¿Le interesan los palíndromos rotacionales? ¿Puedes encontrar palabras de más de cinco letras que sean palíndromos de rotación? ¿Puedes pensar en otras transformaciones interesantes de cuerdas? ¿Cuáles son los puntos fijos (palíndromos) de estas transformaciones?

Related post

Nuevo chip de microfluidos puede detectar contaminación en muestras de 100 picolitros

Nuevo chip de microfluidos puede detectar contaminación en muestras…

27 de junio de 2022 (Noticias de Nanowerk) Científicos del Instituto de Tecnología Láser de la Universidad de Osaka han desarrollado…
El sensor cuántico puede detectar señales electromagnéticas de cualquier frecuencia

El sensor cuántico puede detectar señales electromagnéticas de cualquier…

23 de junio de 2022 (Noticias de Nanowerk) Los sensores cuánticos que detectan fluctuaciones diminutas en los campos magnéticos o eléctricos…
Global Recharge Day: un día SAS para la abeja estrella de los empresarios

Global Recharge Day: un día SAS para la abeja…

En mayo de 2022, SAS hemos celebrado el Mes de la Salud mental y este año fue el primero en que…

Leave a Reply

Tu dirección de correo electrónico no será publicada.