Invertire una stringa mantenendo la maiuscola negli stessi punti


28

L'obiettivo qui è semplicemente invertire una stringa, con una svolta:
mantenere la capitalizzazione negli stessi punti.

Esempio di input 1: Hello, Midnightas
esempio di output 1:SathginDim ,olleh

Esempio di input 2: .Q
Exmaple output 2:q.

Regole :

  • Uscita su STDOUT, ingresso da STDIN
  • Il vincitore verrà scelto il 13 luglio GMT + 3 12:00 (una settimana)
  • L'input può consistere solo di simboli ASCII, semplificando i programmi che non utilizzano alcuna codifica che contiene caratteri non ASCII.
  • Qualsiasi punteggiatura che finisce in una posizione in cui vi era una lettera maiuscola deve essere ignorata.

È con o senza la stampa? È con o senza la stringa?

"Qualsiasi punteggiatura che finisce in una posizione in cui c'era una lettera maiuscola deve essere ignorata." , il secondo esempio non è in contrasto con questa regola?
Stefano Sanfilippo,

È coerente con la regola perché le punteggiatura non hanno una variazione maiuscola.

Risposte:


7

TCC - 4 byte

<>ci

Provalo online!

Spiegazione:

     - output is implicit in TCC
<>   - reverse string
  c  - preserve capitalization
   i - get input

9
Funzionava con una versione tcc.luaprecedente alla pubblicazione della sfida? Dato che hai aggiunto di recente comandi per risolvere altre tre sfide, suppongo che non lo sia. Se la tua risposta richiede una versione della lingua che postdatasse la sfida, devi etichettarla come non competitiva nell'intestazione. Rimuoverò il mio downvote quando aggiungi l'etichetta o fornisci la prova che il tuo codice ha funzionato in una versione precedente.
Dennis,

16

Python, 71 byte

lambda s:''.join((z*2).title()[c.isupper()-1]for c,z in zip(s,s[::-1]))

Provalo online

-3 byte da Ruud, più l'ispirazione per altri 2.

-4 più byte da FryAmTheEggman


lambda s:''.join([z.lower(),z.upper()][c.isupper()]for c,z in zip(s,s[::-1]))è più corto di tre byte
Arfie il

1
@Ruud Grazie! Spostando la chiamata di funzione all'esterno della selezione dell'elenco si salvano altri 2!
Mego,

2
(z*2).title()[c.isupper()-1]dovrebbe funzionare.
FryAmTheEggman,

6
Potresti vincere un altro byte con ~c.isupper()invece dic.isupper()-1
Lulhum il

Questo non ottiene input da stdin o output su stdout ...
ArtOfWarfare

13

Python 2, 73 byte

Poiché le regole specificano l'input è ascii:

lambda s:''.join([z.lower,z.upper]['@'<c<'[']()for c,z in zip(s,s[::-1]))

Tutto il merito va comunque a @Mego, ma non ho avuto la reputazione di commentare solo la sua risposta.


Puoi usare il valore ascii di '@' e '[' per guadagnare 2 byte?
aloisdg dice Reinstate Monica il

Purtroppo no, dovrei usare ord (c), il confronto tra numeri interi e stringhe non funziona molto bene in Python
Lulhum,

Praticamente quello che ho ottenuto, ma eri il primo +1
orlp

13

Perl, 31 + 2 ( -lp) = 33 byte

Questa soluzione è tratta da @Ton Hospel (13 byte più breve della mia).

s%.%(lc$&gt$&?u:l)."c chop"%eeg

Ma avrai bisogno le paccendi. Per eseguirlo:

perl -lpe 's%.%(lc$&gt$&?u:l)."c chop"%eeg'

5
Ciao e benvenuto in PPCG! Questo è fantastico!
NoOneIsHere il

Davvero molto bello! Non ho mai usato l' -aautosplit, penso che avrei potuto usarlo molte volte in passato! Devo ricordarmelo! Penso che puoi salvare un altro byte usando map...,...invece di map{...}...come hai $Fall'inizio! :)
Dom Hastings il

Codice più breve (31 + 2 byte):perl -lpe 's%.%(lc$&gt$&?u:l)."c chop"%eeg
Ton Hospel

Si noti che -aè implicito da-F
Ton Hospel il

@TonHospel wow, grazie mille e ben fatto, è un bel codice! A proposito di -a(e -n) essere implicito -F, l'ho letto poco fa su perlrun, l'ho provato, ma non ha funzionato; ma l'ho provato di nuovo ora e funziona bene, quindi suppongo di aver fatto qualcosa di sbagliato allora. Grazie.
Dada,

9

Pyth, 13 11 10 9 byte

Grazie a @FryAmTheEggman per avermelo ricordato Ve @LeakyNun per un altro byte.

srV_Qm!/G

Provalo online! ora su dispositivo mobile, aggiornando un po 'il collegamento


srV_Qm!rId0sono le 11, ma penso che potrebbe essere possibile abbreviare quella mappa ...
FryAmTheEggman,

@FryAmTheEggman Rimuovi de hai salvato un byte.
Leaky Nun,

srV_Qm!/Gdovrebbe salvare un byte
Leaky Nun il

8

Python, 66 byte

f=lambda s,i=0:s[i:]and(s[~i]*2).title()[~('@'<s[i]<'[')]+f(s,i+1)

Recluta attraverso gli indici i, prendendo il personaggio s[~i]da dietro e il caso s[i]da davanti. L'essere capitale viene verificato come compreso nell'intervallo contiguo @ABC...XYZ[. Ringraziamo FryAmTheEggman dal (_*2).title()trucco.


5

Retina , 75 67 65 byte

Il conteggio dei byte presuppone la codifica ISO 8859-1.

$
±·$`
O$^`\G[^·]

s{T`L`l`±.
T01`l`L`±.*·[A-Z]
±·

±(.)
$1±
·.
·

Provalo online! (La prima riga abilita una suite di test con più casi di test separati da avanzamento riga.)


5

JavaScript (ES6), 95 83 byte

s=>[...t=s.toLowerCase()].reverse().map((c,i)=>s[i]==t[i]?c:c.toUpperCase()).join``

Modifica: salvato un enorme 12 byte grazie a @ edc65.


.. s => r = [... l = s.toLowerCase ()] reverse () MAP ((c, i) => s [i] = l [i] c.toUpperCase ():!? c) .join`` -10
edc65

@ edc65 Grazie! (Nota: r=non è necessario.)
Neil,

5

Pyke, 11 10 9 byte

_FQo@UhAl

Provalo qui!

_         -   reversed(input)
 F        -  for i in ^
   o      -      o+=1
  Q @     -     input[^]
     Uh   -    ^.is_upper()+1
       Al -   [len, str.lower, str.upper, ...][^](i)
          - "".join(^)

In primo luogo mi ha dato un errore, quindi allo stesso tempo la risposta corretta. i.imgur.com/uTcH27F.png

Succede sempre, puoi fare clic su disabilita gli avvisi per disattivarlo.
Blue

Ah, va bene. Spiacenti, non sto bene con Pyke

Potrebbe essere perché sono l'unico che lo usa
Blue

4

05AB1E , 19 16 15 13 byte

Grazie a Emigna per aver salvato 3 byte!

Probabilmente verrà battuto da Jelly ... Codice:

Âuvy¹Nè.lil}?

Utilizza la codifica CP-1252 . Provalo online! .


S.l_v¹lRNèyiu}?è più corto di 1 byte
Emigna il

@Emigna Wow grazie! È molto intelligente.
Adnan,

Âuvy¹Nè.lilë}?è 14. Solo felice di
poterti

@Emigna È fantastico! Ottimo uso del biforcato :).
Adnan,

Ruvy¹Nè.lil}?in realtà. Non ho usato la biforcazione e ho dimenticato di rimuovere l'altro. Quindi 13.
Emigna,

4

MATL , 13 byte

PktGtk<)Xk5M(

Provalo online!

Pk      % Implicit inpput. Flip, lowercase
t       % Duplicate
Gtk<    % Logical index of uppercase letters in the input string
)       % Get letters at those positions in the flipped string
Xk      % Make them uppercase
5M(     % Assign them to the indicated positions. Implicit display

3

J , 30 byte

(={"_1 toupper@]|.@,.])tolower

Non supporta non ASCII


"toupper" "tolower" non puoi usare i punti di codice per accorciarlo?
Leaky Nun,

@LeakyNun Forse, ma non posso davvero dirlo con certezza
miglia

3

Brachylog , 28 byte

@lr:?z:1ac.
h@u.,@A@um~t?|h.

Spiegazione

  • Predicato principale:

    @lr                 Reverse the lowercase version of the Input
       :?z              Zip that reversed string with the Input
          :1a           Apply predicate 1 to each couple [char i of reverse, char i of Input]
             c.         Output is the concatenation of the result
    
  • Predicato 1:

    h@u.,               Output is the uppercase version of the first char of Input
         @A@um~t?       The second char of Input is an uppercase letter
                 |      Or
                  h.    Output is the first char of Input
    

3

TSQL, 175 byte

golfed:

DECLARE @ varchar(99)='Hello, Midnightas'

,@o varchar(99)='',@i INT=0WHILE @i<LEN(@)SELECT
@i+=1,@o+=IIF(ascii(x)=ascii(lower(x)),lower(y),upper(y))FROM(SELECT
SUBSTRING(@,@i+1,1)x,SUBSTRING(@,len(@)-@i,1)y)z
PRINT @o

Ungolfed

DECLARE @ varchar(99)='Hello, Midnightas'

,@o varchar(99)=''
,@i INT=0

WHILE @i<LEN(@)
  SELECT @i+=1,@o+=IIF(ascii(x)=ascii(lower(x)),lower(y),upper(y))
  FROM
    (SELECT SUBSTRING(@,@i+1,1)x,SUBSTRING(@,len(@)-@i,1)y)z

PRINT @o

Violino


codificare l'input?
cat

@cat è l'unico modo. In sql non esiste alcun comando STDIN o input. Se guardi stackoverflow, ecco come vengono risolte tutte le domande - puoi anche guardare le mie altre risposte su codegolf
t-clausen.dk,

Oh, sì, ricordo sicuramente di aver avuto questa conversazione con un utente SQL prima (tu, forse). È strano, ma dovrebbe andare bene.
cat

1
@cat non abbiamo mai avuto questa conversazione prima, ma mi hai aiutato con un conteggio dei byte prima
t-clausen.dk

3

In realtà, 25 byte

;`úíuY"ùû"E£`M@ùRZ`i@ƒ`MΣ

Provalo online!

Spiegazione:

;`úíuY"ùû"E£`M@ùRZ`i@ƒ`MΣ
;                          create a copy of the input
 `úíuY"ùû"E£`M             for each character in input:
  úíuY                       0-based index in lowercase English letters, or -1 if not found, increment, boolean negate (1 if uppercase else 0)
      "ùû"E£                 `û` if the character is lowercase else `ù` (str.lower vs str.upper)
              @ùRZ         make the other copy of the input lowercase, reverse it, and zip it with the map result
                  `i@ƒ`M   for each (string, function) pair:
                   i@ƒ       flatten, swap, apply (apply the function to the string)
                        Σ  concatenate the strings

3

Haskell, 83 80 75 71 byte

Il modo più semplice a cui potrei pensare.

import Data.Char
f a|isUpper a=toUpper|1>0=toLower
zipWith f<*>reverse

Se si scambiano i parametri di (#), kpossono essere riscritti in uno stile senza punti k=reverse>>=zipWith(#)
:,

La seconda riga può essere senza punti in bcome f a|isUpper a=toUpper|1>0=toLower, sebbene ciò sia in conflitto con il miglioramento di Flonk.
xnor

Puoi usare la versione di fxnor e riscrivere Flonk kin zipWith f<*>reverse.
nimi,

Non è necessario eliminare il parametro s?
Lynn,

Sì, e puoi anche tagliare k=.
xnor

3

PowerShell, 154 , 152 , 99 , 86 byte

Grazie @TimmyD per avermi salvato ben 47 byte (ne ho anche salvati altri 6)

Grazie @TessellatingHeckler per aver salvato altri 13 byte.

Più recente:

param($a)-join($a[$a.length..0]|%{("$_".ToLower(),"$_".ToUpper())[$a[$i++]-in65..90]})

Originale:

param($a);$x=0;(($a[-1..-$a.length])|%{$_=$_.tostring().tolower();if([regex]::matches($a,"[A-Z]").index-contains$x){$_.toupper()}else{$_};$x++})-join''

Formattazione normale:

Più recente (secondo me sembra meglio due righe):

param($a)
-join($a[$a.length..0] | %{("$_".ToLower(), "$_".ToUpper())[$a[$i++] -in 65..90]})

Spiegazione:

param($a)-join($a[$a.length..0]|%{("$_".ToLower(),"$_".ToUpper())[$a[$i++]-in65..90]})
param($a)
# Sets the first passed parameter to variable $a
         -join(                                                                      )
# Converts a char array to a string
               $a[$a.length..0]
# Reverses $a as a char array
                               |%{                                                  }
# Shorthand pipe to foreach loop
                                  ("$_".ToLower(),"$_".ToUpper())
# Creates an array of the looped char in lower and upper cases
                                                                 [$a[$i++]-in65..90]
# Resolves to 1 if the current index of $a is upper, which would output "$_".ToUpper() which is index 1 of the previous array

Originale:

param($a)
$x = 0
(($a[-1..-$a.length]) | %{
    $_ = $_.tostring().tolower()
    if([regex]::matches($a,"[A-Z]").index -contains $x){
            $_.toupper()
        }else{
            $_
        }
        $x++
    }
) -join ''

Il primo poster qui, è stato motivato perché raramente vedo PowerShell, ma a 154 152 byte su questo ... Posso capire perché!Qualche suggerimento apprezzato.

Ho imparato che devo cambiare completamente il mio modo di pensare a golf nel codice e il suo divertimento!


Ciao e benvenuto in PPCG! Questo è fantastico!
NoOneIsHere il

Benvenuti in PPCG! Bello vedere un altro utente di PowerShell qui. Puoi ritagliare un po 'sostituendo le .tostring()virgolette e usando la manipolazione di numeri interi ASCII anziché regex. Prova quanto segue, per 105 byte - param($a)-join($a[$a.length..0]|%{if(($x=$a[$i++])-le90-and$x-ge65){"$_".ToUpper()}else{"$_".ToLower()}}).
AdmBorkBork,

Brillante! Possiamo renderlo ancora più breve usando un intervallo invece di -le e -ge:param($a)-join($a[$a.length..0]|%{if(65..90-contains$a[$i++]){"$_".ToUpper()}else{"$_".ToLower()}})
ThePoShWolf

X-inYè più breve di Y-containsX, e puoi cambiare il tuo ifper l' operatore ternario falso per ottenere 86 byte -param($a)-join($a[$a.length..0]|%{("$_".ToLower(),"$_".ToUpper())[$a[$i++]-in65..90]})
TessellatingHeckler

Amico, mi sento come se avessi perso molti trucchi senza aver mai programmato il golf prima d'ora. È quasi come imparare di nuovo a scrivere codice!
ThePoShWolf,

2

Dyalog APL , 12 byte

⌽f¨⍨⊢≠f←819⌶

819⌶ è la funzione di piegatura del case

f←perché il suo nome è lungo, lo assegniamo a f

⊢≠f Booleano in cui il testo differisce dal testo in maiuscolo

f¨⍨ usa quello (1 significa maiuscolo, 0 significa minuscolo) per piegare ogni lettera ...

... del testo invertito

Gestisce non ASCII secondo le regole del consorzio Unicode.



2

Racchetta, 146 byte

(λ(s)(build-string(string-length s)(λ(n)((if(char-upper-case?(string-ref s n))char-upcase char-downcase)(list-ref(reverse(string->list s))n)))))

La racchetta fa male a tutta questa faccenda del "golf".

Scrollata di spalle Come sempre, qualsiasi aiuto per accorciare questo sarebbe molto apprezzato.



2

Jolf, 21 byte

Provalo qui!

Μid?&γ._pXiS=pxHHpxγγ

Spiegazione

Μid?&γ._pXiS=pxHHpxγγ
Μid                   (Μ)ap (i)nput with (d)is fucntion:
   ?        =pxHH     (H is current element) if H = lowercase(H)
    &γ._pXiS          and set γ to the uppercase entity in the reversed string
                 pxγ  lowercase γ
                    γ else, return γ

(d)is function... Sacrificio ortografico per il bene del golf!
Steven H.


2

C #, 86 85 byte

s=>string.Concat(s.Reverse().Select((c,i)=>s[i]>96?char.ToLower(c):char.ToUpper(c)));

AC # lambda in cui l'input e l'output sono una stringa. Puoi provarlo su .NetFiddle .


Ho difficoltà a capire perché non posso raggiungere per la conversione char.ToLower(c)a c+32. Spero di risolverlo!

12 byte salvati grazie a @PeterTaylor ( c|32per aggiungere 32 al valore ASCII di ce c&~32sottrarre 32). Il risultato sarebbe 72 byte (ma può fallire con caratteri non alfa).

s=>string.Join("",s.Reverse().Select((c,i)=>(char)(s[i]>96?c|32:c&~32)));

1
Sarebbe c|32invece di c+32, ma non funzionerà con caratteri non alfa.
Peter Taylor,

@PeterTaylor Funziona benissimo! Grazie!
aloisdg dice Reinstate Monica il

1

PHP, 128 byte

$s=$argv[1];$l=strrev($s);for($i=0;$i<strlen($s);++$i){echo(strtolower($s[$i])!==$s[$i]?strtoupper($l[$i]):strtolower($l[$i]));}

Potrei tentare di ottimizzare ulteriormente questo, ma lo lascerò così com'è per ora.


1

Ottava, 51 50 byte

@(s)merge(isupper(s),b=flip(toupper(s)),tolower(b))

@(s)merge(s>64&s<91,b=flip(toupper(s)),tolower(b))

1

VIM, 46 byte

Sarebbero tre byte g~Gse non avessimo bisogno di leggere da stdin o scrivere su stdout, ma vabbè ...

vim -es '+normal! g~G' '+%print|q!' /dev/stdin

Per testarlo, esegui

echo "testString" | vim -es '+normal! g~G' '+%print|q!' /dev/stdin

Questa è la mia prima presentazione qui, non sono sicuro che questo tipo di presentazione sia accettabile.


Bello, adoro giocare a golf in vim! Tuttavia, questo programma in realtà non inverte la stringa, commuta solo la maiuscola. Puoi invertire la stringa con :se ri<cr>C<C-r>"ma poi dovrai capire come scrivere in maiuscolo le lettere giuste.
DJMcMayhem

@DrGreenEggsandIronMan Oh amico, mi sono perso del tutto! Torna al tavolo da disegno!
DoYouEvenCodeBro

1

Javascript (utilizzando una libreria esterna) (224 byte)

(s)=>{t=_.From(s);var cnt=t.Count();var caps=t.Select(x=>{return x.toUpperCase()===x&&x.toLowerCase()!==x}).ToArray(),i=-1;return t.AggregateRight((a,b)=>{i++;var c=caps[i];return c?a+b.toUpperCase():a+b.toLowerCase()},"");}

Disclaimer: usando una libreria che ho scritto per portare LINQ di C # su Javascript

Image 1


Chiamare la persona che ha votato in negativo questo senza una spiegazione. Qualche motivo per quello?
applejacks01,

È probabile che volessero che tu conteggiassi anche la biblioteca, sebbene l'utilizzo di una biblioteca esterna rientri pienamente nei limiti della politica standard.
Addison Crump,

1
Non sono downvoter, ma se stai usando una libreria esterna, almeno menziona il nome nella tua risposta, e per una libreria oscura, ti preghiamo di fornire un link al repository.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

1

Sed, 113 + 1 = 114 byte

Perché? Perché è divertente usare ciò che è sbagliato strumento per fare le cose: P

Utilizzo: esegui sed -rf file, inserisci il testo e premi Ctrl+ D(invia EOF).

golfed:

s/[A-Z]/\a\l&/g;s/^.*$/\f&\v/;:x;s/\f\a/\a\f/;s/\a\v/\v\a/;s/\f(.)(.*)(.)\v/\3\f\2\v\1/;tx;s/\f|\v//g;s/\a./\U&/g

Ungolfed:

s/[A-Z]/\a\l&/g #Prepend all upper-case letters with a 
                #BEL ASCII character and make them lowercase
s/^.*$/\f&\v/   #Wrap text between a from feed (\f) and a vertical tab (\v)
                #These are used as markers

:x #Define a label named x

s/\f\a/\a\f/;s/\a\v/\v\a/ #Move BEL characters outside of the boundary, so they're not moved later
s/\f(.)(.*)(.)\v/\3\2\1/  #This part does the switching itself
                          #It grabs a character preceded by a form feed and another 
                          #one followed by a vertical tab and swaps them, while keeping the text in-between
                          #and replaces the marker \f and \v

tx             #Conditional jump (t) to label x
               #Jumps to the label x if the last substitution (s command) was successful 
s/\f|\v//g     #Delete markers
s/\a(.)/\u\1/g #Make letters preceded by a BEL upper-case

1

Java 7, 221 217 180 byte

void c(char[]s){int x=0,y=s.length-1;for(char t;x<y;s[x]=s(t,s[y]),s[y]=s(s[y],t),x++,y--)t=s[x];}char s(char a,char b){return(char)(64<a&a<91?96<b&b<123?b-32:b:64<b&b<91?b+32:b);}

Carichi di byte salvati grazie all'approccio di @LeakuNun .

Casi non testati e test:

Provalo qui.

class Main{
  void c(char[] s){
    int x = 0,
        y = s.length-1;
    for(char t; x < y; s[x] = s(t, s[y]),
                       s[y] = s(s[y], t),
                       x++,
                       y--){
       t = s[x];
    }
  }

  char s(char a, char b){
    return (char)(64 < a & a < 91
                    ? 96 < b & b < 123
                        ? b-32
                        : b
                    : 64 < b & b < 91
                        ? b+32
                        : b);
  }

  public static void main(String[] a){
    print("Hello, Midnightas");
    print("TEST");
    print("test");
    print("Test");
    print(".,..,,!@");
    print("ABCDefgHijklMNOPqrsTuVWxyz");
    print("AbCdEfGHIJKlmnop123");
  }

  static void print(String s){
    char[] t = s.toCharArray();
    c(t);
    System.out.println(t);
  }
}

Produzione:

SathginDim ,olleh
q.
TSET
tset
Tset
@!,,..,.
ZYXWvutSrqpoNMLKjihGfEDcba
321pOnMLKJIhgfedcba

È possibile input e output char[].
Leaky Nun,

@LeakyNun In realtà (credo di) non riesco in meno quantità di byte. Consentirebbe la rimozione String a="";e la modifica o+=per 0[i]=salvare byte, ma Java non ha un carattere .toUpperCase()/ .toLowerCase()metodo e la conversione da char a String, usa il metodo upper / lower e quindi di nuovo in char richiederebbe (molto) altro byte. Ma sentiti libero di rovesciare l'ideone collegato e trovare qualcosa per far char[]funzionare il lavoro in meno byte.
Kevin Cruijssen, l'

1
180 byte che possono essere ulteriormente giocati a golf (non modificandolo in posizione).
Leaky Nun,

0

C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
  char *a,*b,*c;

  a=c=strdup(argv[1]);
  b=&argv[1][strlen(a)-1];
  for(;*a;a++,b--){
    *a=(*a>='A'&&*a<='Z')?((*b>='a'&&*b<='z')?*b-32:*b):((*b>='A'&&*b<='Z')?*b+32:*b);
  }
  puts(c);
  free(c);
  return 0;
}

L'input dovrebbe essere preso dallo stdin.
Anmol Singh Jaggi l'

Dato che si tratta di code-golf, inserisci il numero di byte che questo programma costerebbe.

Potrei ridurlo significativamente a seconda delle regole, ma non riesco a trovare alcuna regola.
user56095
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.