Nuevo diseño del sitio!

57

A menos que tenga un script de usuario que modifique el diseño del sitio (o incluso si es así), ¡debería haber notado que tenemos nuestro diseño del sitio!

(Es noviembre ahora)

Entonces, para celebrar, ¡hagamos un programa que aplique retroactivamente este diseño (simplificado en exceso, por supuesto)!

Entonces, los cambios más importantes son:

  • nuestro nuevo nombre ahora es Code Golf y Coding Challenges
  • nuestro sitio ya no es el color azul predeterminado y, en cambio, es un bonito verde oscuro

Entonces, dada una cadena, cambie:

  • PPCG a CGCC
  • Programming Puzzles {non-whitespace} Code Golfa Code Golf {same-thing} Coding Challenges(por ejemplo, Programming Puzzles + Code Golf, and Code Golf, y & Code Golftodo habría cambiado a Code Golf + Coding Challenges, and Coding Challengesy & Coding Challenges.
  • #abca #acb(cambiar de azul a verde y viceversa, simplemente ignorar el hecho de que el verde no debería convertirse lógicamente en azul, pero no quiero complicar el cambio de color)
  • #abcdefa #abefcd(igual que el anterior)

Tenga en cuenta que para los intercambios de color, debe aceptar cualquier dígito hexadecimal de 0-9a a-f. Puede elegir qué caso de dígito hexadecimal requerirá, pero debe ser coherente e igual desde la entrada hasta la salida.

Sus sustituciones pueden distinguir entre mayúsculas y minúsculas, y si no, especifique cómo funciona la salida.

Las sustituciones solo deben ocurrir cuando la cadena está rodeada por límites de palabras (incluido el inicio de la #). En otras palabras, cada una de las sustituciones especificadas solo debe ocurrir si la coincidencia está en el borde de la cadena o está bordeada por caracteres no alfanuméricos (en ambos lados).

Se aplican lagunas estándar. Este es un desafío de código de golf, por lo que gana el código más corto.

Ejemplos

PPCG -> CGCC
Programming Puzzles or Code Golf -> Code Golf or Coding Challenges
PPCG stands for Programming Puzzles and Code Golf and its site color is #abf -> CGCC stands for Code Golf and Coding Challenges and its site color is #afb
The color #00f is much more intense than #5568ed -> The color #0f0 is much more intense than #55ed68
Programming Puzzles and No Substitution -> Programming Puzzles and No Substitution
No Substitution and Code Golf -> No Substitution and Code Golf
Programming Puzzles and no substitution Code Golf -> Programming Puzzles and no substitution Code Golf
Code Golf and Programming Puzzles -> Code Golf and Programming Puzzles
Programming Puzzles and Programming Puzzles and Code Golf -> Programming Puzzles and Code Golf and Coding Challenges

(para el último caso de prueba, es importante tener en cuenta que la cadena traducida podría traducirse nuevamente, pero la transformación debe aplicarse exactamente una vez)

Actualización importante

(Gracias @tsh)

La Programming Puzzles ... Code Golfregla de sustitución puede incluir otras reglas dentro de ella ( Programming Puzzles PPCG Code Golfes válida). En este caso, puede elegir si se aplican o no las reglas, pero debe ser determinista. No estoy exigiendo que sea coherente entre PPCGy #...porque las respuestas parecen implementar las reglas en mi orden de lista, lo que resulta en inconsistencias. Esto es solo una aclaración; Creo que todas las respuestas actuales siguen siendo válidas.

Hiperneutrino
fuente
3
¿Deben aplicarse las sustituciones solo si hay límites de palabras alrededor de las subcadenas o en todas partes?
Erik the Outgolfer
1
@EriktheOutgolfer Buena captura; debe tener límites de palabras. Voy a especificar eso; Gracias.
HyperNeutrino
Definir "límite de palabra" para un #; Las implementaciones de expresiones regulares generalmente no consideran un # para comenzar una palabra.
Tomsmeding
1
Oh, supongo Programming Puzzles and no substitution Code Golfque también podría atrapar a alguien (aunque todos
estén
1
Casos de prueba sugeridos Code Golf and Programming Puzzlesy Programming Puzzles and Programming Puzzles and Code Golf. @Veskah Hmm, y creo que el último caso de prueba sugerido falla en mi respuesta 05AB1E, ya que no tengo expresiones regulares ...>. <Volver a la mesa de dibujo ...
Kevin Cruijssen

Respuestas:

12

Rubí -p , 165 164 159 bytes

Terminó siendo muy similar a la respuesta sed, pero abusa de la interpolación de cadenas de Ruby para duplicar el grupo hexadecimal que coincide ([\da-f]{1,2})dentro de la tercera expresión regular tres veces en lugar de tener que repetir todo nuevamente.

  • -1 byte de @ randomdude999.
  • -5 bytes aprovechando la solución Perl de @ Xcali
gsub /\bPPCG\b/,"CGCC"
gsub /\bProgramming Puzzles( \S+ )(Code Golf)\b/,'\2\1Coding Challenges'
[1,2].map{|i|gsub /(^|\s)#\K#{'([\da-f]{%d})'%i*3}\b/,'\2\4\3'}

Pruébalo en línea!

Tinta de valor
fuente
¿No utiliza {1,2}break con entradas hexadecimales de longitud 4 o 5, por ejemplo #aabbc? Editar: lo hace (este ejemplo no debe reemplazarse porque no es un color hexadecimal válido).
randomdude999
Falla en este caso ( -es un carácter no alfanumérico).
Erik the Outgolfer
@ randomdude999 sí, buena captura. Se agregó un cheque para eso.
Value Ink
@EriktheOutgolfer sí, supongo. "Límites de palabras" con el #es un poco ambiguo ya /\b/que no se registra junto a otro no alfanumérico, pero hice el cambio de todos modos para ningún cambio de byte (reemplazo \Scon \w)
Value Ink
¿No puedes reemplazar tu (?<!\w)con mi (^|\W)por 1 char?
Tomsmeding
9

C ++ (gcc) , 270 285 283 bytes

Gracias a Neil por señalar un error.

-2 bytes gracias a ceilingcat.

#import<regex>
#import<string>
auto f=[](auto s){typeof(s)R[][2]{"bPPCG","CGCC","bProgramming Puzzles( \\S+ )(Code Golf)","$2$1Coding Challenges","B#(?=([\\da-f]{3}){1,2}\\b)(.+?)(..??)(..??)","#$2$4$3"};for(auto r:R)s=std::regex_replace(s,std::regex('\\'+*r+"\\b"),r[1]);return s;};

Pruébalo en línea!

gastropner
fuente
3
Parece destrozar #fadey #facedque no debería.
Neil
6

Retina 0.8.2 , 153 130 bytes

\bPPCG\b
CGCC
\bProgramming Puzzles( \S+ )(Code Golf)\b
$2$1Coding Challenges
\B(#(?=([\da-f]{3}){1,2}\b).+?)(..??)(..??)\b
$1$4$3

Pruébalo en línea! El enlace incluye casos de prueba. Todas las sustituciones son sensibles a mayúsculas y minúsculas. Asume que los caracteres de palabras regex normales son aceptables para que \B#solo coincidan con #s que no siguen un carácter de palabra. Editar: Guardado 22 bytes gracias a @tsh.

Neil
fuente
Prueba \B#(?=([\da-f]{3}){1,2}\b)(.+?)(..??)(..??)\b?
tsh
5

GNU sed -E, 198 caracteres

s/\bPPCG\b/CGCC/g
s/\bProgramming Puzzles( \S* Cod)e Golf\b/Code Golf\1ing Challenges/g
s/((^|\W)#[0-9a-f])([0-9a-f])([0-9a-f])\b/\1\4\3/g
s/((^|\W)#[0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})\b/\1\4\3/g

Ejecutable usando eg sed -E 'the above'; las nuevas líneas pueden incluirse literalmente o reemplazarse ;si así lo desea. Ambos trabajan.

@HyperNeutrino vamos, esa regla de límite de palabras es estúpida. Mira lo que tuve que hacer en el #caso.

Sí, ni siquiera lo intenté. :PAGS

+9 por @Value Ink

tomsmeding
fuente
3
Las banderas ya no se incluyen en el recuento de bytes, por lo que puede quitar el byte adicional y llamarlo "GNU sed -E".
Value Ink
@ValueInk Whaaaaat? Aparentemente, he estado muy fuera de contacto con esta comunidad durante demasiado tiempo como para no darme cuenta. Sin embargo, creo que es una buena regla. Además, gracias por mencionarlo.
Tomsmeding
¿no sedpermite la coincidencia de expresiones regulares usar \dcomo atajo para 0-9? podría ahorrarle 6 bytes
completos
También me acabo de dar cuenta de que devuelve "Puzzles de programación o desafíos de codificación" para el segundo caso de prueba en lugar del esperado "Código de golf o desafíos de codificación".
Value Ink
@ randomdude999 La página de manual re_format (7) en mi Mac parece sugerir que sed debería admitir \ d, pero aparentemente no. ¯ \ _ (ツ) _ / ¯
tomsmeding
4

Stax , 85 bytes

ì▀¼FΣ¼≤C╛╓ÄydîNû►┘Δ▲Bd♫|α╒oñFτ▒t!↑▌╩┘♦pMc6Hèé▄·│╝∙↔¥^4b5╠·9█&╨^╨♂═î£ε■屫\┴J₧å♠Å≡z╜û♀

Ejecutar y depurarlo

recursivo
fuente
4

05AB1E , 123 109 105 110 114 bytes

žKISå_Å¡JεÐć'#QsžhA6£«sSåP*i3äćsRJ«ë"PPCG"Qi"CGCC"]J”–±ÇÀ”DU¡ćsε”ƒËŠˆ”©¡DVćDÁ2ôεðå}ćs_P*YyÊP*i”Âïªï”«s®ý«®ìëyXì]J«

+5 bytes arreglando casos de prueba como Programming Puzzles and no substitution Code Golfy Programming Puzzles and Programming Puzzles and Code Golf.
+4 bytes arreglando casos de prueba como color-#00f(colores con algo además de espacios / líneas nuevas que lo rodean). Gracias a @Grimy por llamar mi atención sobre esto.

Distingue mayúsculas y minúsculas. Los valores hexadecimales están en minúsculas abcdef; Programming Puzzles ... Code Golfestá en título PPCGestá en mayúscula completa.

Pruébalo en línea.

Definitivamente no es el lenguaje correcto para el trabajo. Imitar los límites de palabras y reemplazarlos Programming Puzzles \S+ Code Golf, pero no Code Golf \S+ Programming Puzzleso Programming Puzzles \S+ \S+ Code Golfsin expresiones regulares es bastante difícil (para abreviar) ..>.>

Explicación:

žK                # Push "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
                  # (NOTE: if '_' also count as word boundary, use `žj` instead)
  IS              # Push the input as a list of characters
    å_            # Check for each character if they are NOT in the string
      Å¡          # Split the (implicit) input on truthy values
        J         # Join each inner character list to a string again
ε                 # Map each word to:
 Ð                #    Triplicate the word
  ć               #    Extract head; push remainder and head separately to the stack
   '#Q           '#    Check if the head equals "#"
    žh            #    Push string "0123456789"
      A6£«        #    Append the first 6 letters of the alphabet: "0123456789abcdef"
   s      sSåP    #    Check if the characters of the remainder are all in this string
   *i             #    If both are truthy:
     3ä           #     Split the 'word' into three parts
                  #      i.e. "#ab12cd" → ["#ab","12","cd"]
       ćs         #     Extract head, and swap
         R        #     Reverse the remainder list
          J«      #     Join them together, and merge them to the head again
    ë"PPCG"Qi     #    Else-if the word is "PPCG":
     "CGCC"       #     Push "CGCC"
                  #    (Implicit else:
                  #      Use the word that's still there from the initial triplicate)
]                 # Close all if statements and the nested map
 J                # Join the mapped words together again
”–±ÇÀ”            # Push dictionary string "Programming Puzzles"
      DU          # Save a copy in variable `X`
        ¡         # Split the string by this
         ćs       # Extract head & swap; pushing head and remainder to the stack
ε                 # Map each substring `y` in the remainder to:
 ”ƒËŠˆ”           #  Push dictionary string "Code Golf"
       ©          #  Save it in variable `®` (without popping)
        ¡         #  Split the current substring we're mapping by it
         DV       #  Save a copy of this list in variable `Y`
           ćD     #  Extract the head and duplicate
                  #  (so the stack is: remainder, head, head)
 Á                #  Rotate the characters in the head-string once towards the right
  2ô              #  Split it into parts of size 2
    εðå}          #  Check in each part if it contains a space
        ćs        #  Extract head and swap again
          _       #  Check if all values are 0
           P      #  And check if this is truthy for all
          *       #  And check if this is truthy, as well as the head
                  #  (this means the current string has a leading and trailing space,
                  #   and no other spaces)
 YyÊP             #   Check that none of the susbtrings in variable `Y`
                  #   are equal to the current substring `y`
 *i               #   If both checks above are truthy:
   ”Âïªï”«        #    Prepend "Coding Challenges" to the duplicated head
          s®ý     #    Join the remainder by variable `®` ("Code Golf")
             «    #    Append it
              ®ì  #    And prepend an additional variable `®` ("Code Golf")
  ë               #   Else:
   y              #    Simply keep the substring `y` as is
    Xì            #    And prepend variable `X` ("Programming Puzzles") 
                  #    since we've split by it
]                 # Close all if-else statements and the map
 J                # Join the mapped substrings together to a single string
  «               # And append it to the initially extracted head
                  # (then output the resulting string implicitly as result)

Vea esta sugerencia mía 05AB1E (sección ¿Cómo usar el diccionario? ) Para entender por qué ”–±ÇÀ”es "Programming Puzzles"; ”ƒËŠˆ”es "Code Golf"; y ”Âïªï”es "Coding Challenges".

Kevin Cruijssen
fuente
3

Python 2 , 240 bytes

import re
lambda x,s=re.sub,b='(?<!\w)',e='(?!\w)',h='([\da-f]',t=r'#\1\3\2':s(b+'#%s{2})'%h+h+'{2})%s{2})'%h+e,t,s(b+'#%s)'%h+h+')%s)'%h+e,t,s(b+'Programming Puzzles( \S+ Cod)e Golf'+e,r'Code Golf\1ing Challenges',s(b+'PPCG'+e,'CGCC',x))))

Pruébalo en línea!

Erik el Outgolfer
fuente
3

JavaScript (Node.js) , 174 bytes

s=>s[R='replace'](/\bPPCG\b/g,'CGCC')[R](/\bProgramming Puzzles( \S+ )(Code Golf)\b/g,'$2$1Coding Challenges')[R](/\B#(?=([\da-f]{3}){1,2}\b)(.+?)(..??)(..??)\b/ig,'#$2$4$3')

Pruébalo en línea!

tsh
fuente
Falla en el caso de prueba #abcdeporque el calificador regex {3,6}coincide con entre 3 y 6 caracteres, en lugar de 3 o 6, que supongo que estaba buscando.
Value Ink
@ValueInk buena captura. arreglado con +5 bytes.
tsh
Puede ser más corto usar una función de reemplazo durante la expresión regular larga
Downgoat
2

Pyth , 177 173 162 142 bytes

J::jb.z"\\bPPCG\\b""CGCC"." z¶NZI°Pÿúd(MÜ_BöIkxnqä'u)"." s6#~ÍN³=<nñu/GÎg"VS2~:J%"(^|\W)#%s\\b"*3%"([\da-f]{%d})"N$r"\1#\2\4\3"$)J

Aquí hay una versión sin los mecanismos de compresión de cadenas de Pyth (también conocido como seguro para copiar y pegar):

J::jb.z"\\bPPCG\\b""CGCC""\\bProgramming Puzzles( \S+ )(Code Golf)\\b""\\2\\1Coding Challenges"VS2~:J%"(^|\W)#%s\\b"*3%"([\da-f]{%d})"N$r"\1#\2\4\3"$)J

Pruébalo en línea!

Esto terminó siendo muy largo porque traté de ser lo más pedante posible con las expresiones regulares. Traté de comprimir todas las cadenas posibles, pero la mayoría de ellas no se hicieron más pequeñas o no se pudieron pegar en TIO correctamente.

Explicación:

J::                      # definition of J to the following 2 regex replacements
   jb.z                  # input to first regex replacement: all input lines joined together
   "\\bPPCG\\b"          # first regex
   "CGCC"                # first replacement
   ."<compressed>"       # second regex: "\\bProgramming Puzzles( \S+ )(Code Golf)\\b"
   ."<compressed>"       # second replacement: "\\2\\1Coding Challenges"
VS2                      # loop twice, N = 1 or 2
  ~:J                    # some weird assignment: J = regex replace in J (would be J := (regex, replacement) if : was python's regex replace operator)
    %                    # third regex: string format
     "(^|\W)#%s\\b"      # format string
     *3                  # repeat 3 times:
       %"([\da-f]{%d})"N # string format, replace %d with N (the loop counter)
    $r"\1#\2\4\3"$       # third replacement: uses python raw literals because it's shorter than escaping the backslashes
    )                    # end for loop
J                        # print J
  • -11 gracias a una mejor expresión regular de la respuesta Ruby de Value Ink
  • -20 gracias al uso de un bucle para ambos reemplazos hexadecimales, inspirado en las respuestas de Ruby y Perl
randomdude999
fuente
1

Perl 5 -p , 152 145 bytes

@ValueInk ahorra 7 bytes

s/\bPPCG\b/CGCC/g;s/\bProgramming Puzzles( \S+ )(Code Golf)\b/$2$1Coding Challenges/g;for$a(1,2){$p="([a-f0-9]{$a})"x3;s/(^|\s)#\K$p\b/$2$4$3/gi}

Pruébalo en línea!

Xcali
fuente
( \S+ )(Code Golf)\b/$2$1Codingahorra 2 bytes. También la última expresión regular puede terminar con solo un en \blugar de(?=\s|$)
Value Ink
Estaba trabajando en el primero mientras escribías ese comentario. He hecho el otro cambio para guardar algunos bytes. ¡Gracias!
Xcali
Eso \sdebería ser \Wen su lugar, de lo contrario falla este caso ( -es un carácter no alfanumérico, por lo que se debe aplicar la sustitución).
Grimmy
137
Grimmy
0

Java 8, 192 bytes

s->s.replaceAll("\\bPPCG\\b","CGCC").replaceAll("\\bProgramming Puzzles( \\S+ )(Code Golf)\\b","$2$1Coding Challenges").replaceAll("\\B(#(?=([0-9a-f]{3}){1,2}\\b).+?)(..??)(..??)\\b","$1$4$3")

Puerto de la respuesta de Retina de @Neil , ¡así que asegúrate de votarlo!

Pruébalo en línea.

Kevin Cruijssen
fuente