Ta sama długość, inny ciąg


53

Wyzwanie

Biorąc niepusty ciąg S o długości L , składające się wyłącznie z drukowanych znaków ASCII, wyjście drugiego łańcucha o długości L , który składa się w całości z drukowanych znaków ASCII, ale nie jest równa S .

Do celów tego wyzwania znak ASCII do wydruku to jeden między U + 0020 i U + 007E włącznie; to znaczy od (spacja) do ~(tylda). Nowe linie i karty nie są uwzględnione.

Na przykład "abcde"niektóre prawidłowe dane wyjściowe mogą być:

  • "11111"
  • "abcdf"
  • "edcba"

Ale byłyby one nieprawidłowe:

  • "abcde"
  • "bcde"
  • "abcde0"

Przypadki testowe

"asdf"
"1111"
"       "
"~~~~~"
"abcba"
"1"
" "
"~"
" ~"
"~ "
"  0"
"!@#$%^&*()ABCDEFGhijklmnop1234567890"
" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"

Zasady

  • Możesz założyć, że dane wejściowe składają się wyłącznie z drukowalnych znaków ASCII.
  • Nie można zakładać, że dane wejściowe nie zawierają wszystkich 95 znaków do wydrukowania.
  • Możesz założyć, że dane wejściowe zawierają co najmniej jeden znak i mają mniej niż 256 znaków.
  • Dane wyjściowe muszą również składać się wyłącznie z drukowalnych znaków ASCII. Nie można na przykład wyprowadzić bajtu \ x7F do wprowadzenia "~".
  • Wyjście musi być inne niż wejście z prawdopodobieństwem 1; to znaczy, możesz generować losowe ciągi, dopóki jeden nie będzie inny niż wejście, ale nie możesz po prostu wyprowadzić L losowych znaków i mieć nadzieję, że będzie inny.
  • Nowe linie są niedozwolone w danych wyjściowych, ale możesz wypisać jedną nową linię, która nie jest liczona do ciągu.

Punktacja

To jest , więc wygrywa najkrótszy kod w bajtach w każdym języku.


Zauważ, że „pozytywne” wyklucza pusty ciąg. Dla większej przejrzystości, może zastąpić „pozytywne” na „niezerowe”?
CalculatorFeline

5
@CalculatorFeline Ale to obejmuje łańcuchy o długości ujemnej / s
ETHproductions

1
... Te nie istnieją.
CalculatorFeline

@CalculatorFeline Lepiej teraz?
ETHprodukcje

3
Kolejne proste, ale nie trywialne wyzwanie.
Weijun Zhou,

Odpowiedzi:


34

Python 2 , 21 bajtów

lambda s:`s`[:len(s)]

Wypróbuj online!

Pobiera reprezentację ciągu wejściowego i obcina go do długości ciągu wejściowego. W przypadku typowego ciągu umieszcza to w 'cudzysłowie i kroi na końcu:

abc  ->   'abc'  ->  'ab
     rep        chop

Zauważ, że nowy ciąg zaczyna się od '. Pokażmy, że wyjście zawsze różni się od wejścia.

  • Jeśli wejście nie ma ', to wyjście zaczyna się od, 'a wejście nie.

  • Jeśli dane wejściowe zawierają 'a, ale nie ", Python użyje "zewnętrznych cytatów, dając pierwszy znak, "którego nie ma w ciągu wejściowym.

  • Jeśli dane wejściowe zawierają jedno 'i drugie ", wówczas cudzysłowy zewnętrzne są, 'a każdy 'jest poprzedzany znakiem ucieczki \'. Ilekroć pierwszy "pojawia się na wejściu, jest przesuwany w prawo przez inicjał 'w wyjściu i wszelkie możliwe znaki ucieczki. Oznacza to, że nie może się równać z "odpowiednią pozycją na wyjściu.

Na koniec zauważ, że zacytowanie danych wejściowych i ewentualnie znaków ucieczki zawsze zwiększa liczbę znaków, więc obcięcie wyniku powoduje, że ma on tę samą długość co dane wejściowe.

Zauważ, że kluczowe znaczenie miało adaptacyjne przełączenie Pythona "w drugim przypadku. Jeśli tego nie zrobi, nie powiedzie się przy wprowadzaniu trzech znaków '\'. Lub dowolny dłuższy prefiks ciągu pokazu poprawek za pomocą '. Ta metoda nie będzie działać w przypadku większości języków.


Co to rozumowanie do indeksowania „til len(s)zamiast -2?
Julian Wolf

1
@JulianWolf W przypadku danych wejściowych zawierających oba znaki 'oraz "więcej niż 2 znaki zostaną dodane, ponieważ cudzysłowy muszą być poprzedzone znakami ucieczki.
Anders Kaseorg

Ma sens; nie wziął tego pod uwagę. Dzięki!
Julian Wolf

Możesz użyć [2:]zamiast [:len(s)]zejść do 16 znaków.
xbarbie

@xbarbie To nie zawsze daje taką samą długość, jeśli są postacie wymagające ucieczki.
xnor


15

JavaScript (ES6), 37 33 36 29 26 18 21 19 bajtów

s=>s.slice(1)+ +!+s

Wypróbuj online!

-4 bajty dzięki ETHProductions

-7 + -5 + -2 bajtów dzięki CalculatorFeline

-3 bajty dzięki Rickowi Hitchcockowi

Przenosi pierwszy znak na koniec i ustawia go na 0, jeśli jest liczbowy i niezerowy, a 1 w przeciwnym razie.

Wyjaśnienie

s=>                    anonymous function with parameter s
                 +s    convert s to a number
                !      not (converts to boolean; relevant: 0->true,1->false)
               +       convert !+s back to number (true->1, false->0)
   s.slice(1)+         prefix the rest of the string
              ␣        needed to avoid the +s combining

Dowód

Ponieważ drugi znak staje się pierwszym, trzeci znak staje się drugim itd., Wszystkie znaki muszą być identyczne. Ostatni pozostały znak może być tylko 0 lub 1, więc powtarzany znak musiałby być albo 0 albo 1. Ale dowolny ciąg 0s daje 1 na końcu i odwrotnie; dlatego niemożliwe jest utworzenie danych wejściowych równych ich wynikom. -ETHProdukty

Zobacz zmiany poprzednich wersji i objaśnień.

f=
s=>s.slice(1)+ +!+s

console.log(f("000"))
console.log(f("111"))
console.log(f("001"))
console.log(f("110"))
console.log(f("~"))
console.log(f("111111111111111111111111111111111111111111111111111"))
console.log(f("Hello world!"))
console.log(f("23"))
console.log(f(" "))
console.log(f("1x"))


13

Galaretka , 3 bajty

~Ṿṁ

Dane wyjściowe to ciąg cyfr, przecinków i znaków łącznika minus, których pierwszy znak będzie się różnić od pierwszego znaku ciągu wejściowego.

Wypróbuj online!

Jak to działa

~Ṿṁ  Main link. Argument: s (string)

~    Map bitwise NOT over the characters c in s.
     This attempts to cast c to int and then apply bitwise NOT, mapping
     '0', ..., '9' to 0, ..., 9 (before ~), then -1, ..., -10 (after ~).
     For non-digits, the attempt fails, mapping c to 0.
 Ṿ   Uneval, yielding a comma-separated string of integers in [-10, ..., 0].
     The first character will be '-' if s starts with a digit and '0' if not.
  ṁ  Mold; truncate the result to the length of s.

6

Haskell , 20 bajtów

map$head.show.(<'M')

Wypróbuj online!

Konwertuje na ciąg Fi T. Liczy się to, że postacie Fi Tkonwertowane na siebie nawzajem. Odbywa się to poprzez sprawdzenie, czy znak jest mniejszy niż Mdo uzyskania, Truelub Falsenastępnie wzięcie pierwszego znaku reprezentacji ciągu.


Haskell , 23 bajty

q '~'=' '
q _='~'
map q

Wypróbuj online

Zastępuje każdą postać, z ~wyjątkiem, że ~staje się spacją.


Jakie jest znaczenie przestrzeni q '~'? Dlaczego nie można go usunąć?
Cyoce,

@Cyoce Haskell zezwala 'na znak w identyfikatorach, więc q'~'=' 'zostanie przeanalizowany jako q' ~ '=' '(zgłoszenie błędu leksykalnego, ponieważ ostatni 'nie ma sobie równych.)
Ørjan Johansen

5

Biała spacja, 59 bajtów

Widoczna reprezentacja

NSSNSSSTSSSSSNSNSSNSSNSTNTSTTTTSSTNTTSNSNSTSSSNSSSNTNSSNSNN

Co to robi:

Dla każdego czytanego znaku drukuje spację, z wyjątkiem gdy jest to spacja, a następnie drukuje @.

Demontaż:

loop:
    push 32
     dup
      dup
       dup
        ichr
       get
       sub
      jn not_32
     dup
      add
not_32:
     pchr
    jmp loop

Zawsze miło jest zobaczyć rozwiązanie w Whitespace. Zwłaszcza, gdy normalnie nie jesteś w stanie go zobaczyć . +1
Josiah Winslow

Niezła odpowiedź! Próbowałem wymyślić coś krótszego w strukturze, ale nic nie znalazłem. Ale można golf 2 bajty, zmieniając SSSTSSSSSN (push 32)się SSSTSSTN (push 9)i TSSS (add)do TSSN (multiply). Wydrukuje zakładkę dla każdego znaku o wartości Unicode powyżej 9 oraz Q(9 * 9 = 81) dla każdego znaku o wartości Unicode równej 0..9. Wypróbuj online bez
użycia

Zignoruj ​​mój komentarz powyżej. W przypadku wyzwania karta nie jest uważana za drukowaną postać ASCII.
Kevin Cruijssen

5

MATL , 6 5 bajtów

Qo!V!

Wypróbuj online!

Wyjaśnienie

Q     % Implicitly input a string. Add 1 to each code point.
o     % Parity: 0 if odd, 1 if even. Note that '0' has ASCII code 48, so after
      % having added 1 it now gives 1. Similarly. '1' has ASCII code 49, so it
      % now gives 0. All other chars give 0 or 1. 
!V!   % Convert each number to the corresponding char. Implicitly display

To 5 w CJam: l'0f=(jeśli robi to, co myślę, że robi)
Martin Ender

@MartinEnder Tak, dokładnie tak :-) Właśnie dodałem wyjaśnienie
Luis Mendo

5

Haskell , 19 bajtów

Anonimowa funkcja, która przyjmuje i zwraca a String. Użyj jako (map$(!!1).show.succ) "1111".

map$(!!1).show.succ

Wypróbuj online! (Korzystanie z wiązki testowej @ xnor.)

  • Dla każdego znaku w ciągu wejściowym zwiększa znak, a następnie konwertuje go na format literału znaku, a następnie przyjmuje drugi znak literału, który jest znakiem tuż po 'cytacie początkowym .
  • W przypadku prawie wszystkich znaków do wydruku skutkuje to po prostu zwiększeniem znaku. Wyjątkiem są &i ~, które zamiast tego \, ponieważ ich następcy 'i \DELuciekają w literackich postaciach.

całkiem pewny, że headmożna go użyć zamiast (!!1)dodatkowego bajtu
Julian Wolf

Nie, headto (!!0)nie (!!1). Zawiodłoby to na postaci '.
Ørjan Johansen

Ah, tak. Właśnie czytałem odpowiedź na python i zapomniałem, że cytaty zwykle wymagają specjalnego traktowania.
Julian Wolf

4

05AB1E , 5 bajtów

žQDÀ‡

Wypróbuj online!

Wyjaśnienie

Zamienia każdy znak na następny znak do wydruku ascii, owijając od tyldy do spacji.

žQ     # push a string of printable acsii chars (space to tilde)
  D    # duplicate
   À   # rotate left
    ‡  # translate

4

V , 7 bajtów

íÁ/a
g?

Wypróbuj online! lub Zweryfikuj wszystkie przypadki testowe!

Jak to działa?

Rozważ wszystkie ciągi znaków składające się z drukowalnego ASCII. Każdy ciąg musi albo 1) zawierać znaki alfabetu lub 2) nie zawierać znaków alfabetu.

Tak więc ten program działa, najpierw konwertując jeden znak niealfabetyczny na 'a', a następnie wykonując ROT13 na ciągu wejściowym.

í       " Substitute:
 Á      "   A non-alphabetic character ([^a-zA-Z])
  /     "   with
   a    "   the letter 'a'
g?      " Perform ROT13 on...
        "   (Implicit) the current line.

Zrywa się, jeśli masz liczbę taką jak 9sama, a zwiększanie powoduje dodanie kolejnego znaku do łańcucha
nmjcman101

@ nmjcman101 Ah, to dobra uwaga. Mam powrócił
DJMcMayhem

Lubię jednak ROT13, nie wiedziałem, że V (im) może to zrobić
nmjcman101

4

C (gcc) , 22 bajty

f(char*s){*s=65+*s%2;}

Pobiera wskaźnik łańcucha i modyfikuje pierwszy znak.

Wypróbuj online!


1
Krótszy: *s=159-*s. Zawsze zmienia ostatni bit, dlatego nigdy nie nadaje tej samej postaci. Należy pamiętać, że159 = ' ' + '~'
celtschk

Myślę, że masz na myśli 158 = '' + '~'. 159–32 = 127, co byłoby znakiem spoza zakresu. Ale dobry pomysł.
Computronium

@celtschk Involutions nie może działać, ponieważ istnieje dziwna liczba (95) znaków do wydrukowania, więc co najmniej jeden z nich zostanie zmapowany do siebie.
Dennis

@Computronium: Ups, masz rację, mam ~zły kod znaku .
celtschk

4

C (gcc) , 20 bajtów

Zobaczył odpowiedź Dennisa, pomyślał o niezbędnej 2-bajtowej poprawie.

f(char*s){*s^=*s/3;}

Wypróbuj online! (Stopka Dennisa).

Podobnie jak oryginał, modyfikuje pierwszy znak łańcucha w miejscu, ale xorsuje go, dzieląc wartość przez 3 (najmniejsza liczba, która działa. 2 zawodzi na pojedynczym znaku, 'U'który daje 127, nie można go wydrukować).


4

Python 2 , 25 bajtów

lambda s:`s<'T'`[0]+s[1:]

Wypróbuj online!

Anders Kaseorg uratował bajt, wyodrębniając pierwszą postać z Truelub False.


Sugeruję zmianę '?'na dwucyfrowy kod znaków, ale Python nie jest jednym z tych języków, w których możesz to zrobić :(
CalculatorFeline

Warianty oszczędzające bajt (ale rezygnujące z kompatybilności z Python 3): lambda s:`+(s<'1')`+s[1:]lublambda s:`s<'T'`[0]+s[1:]
Anders Kaseorg


3

Oktawa , 19 18 bajtów

@(s)['',(s<66)+65]

Wypróbuj online!

Wyjaśnienie:

@(s)                 % Anonymous function taking a string s as input
         s<66        % A boolean vector with `1` for all characters below ASCII-66.
        (s<66)+65    % Add 65 to this, so that all elements that are 32-65 are now 66.
                     % All other elements are 65 
    ['',         ]   % Implicitly convert the list of 65 and 66 to the letters A and B

3

CJam , 5 bajtów

l)iA%

Wypróbuj online!

Konwertuje ostatni znak na jego punkt kodowy i przyjmuje ten moduł 10. Jest to wyraźnie różne w przypadku znaków innych niż cyfry na ostatniej pozycji. Ale cyfry zaczynają się w punkcie kodowym 48, więc przyjęcie tych modów 10 spowoduje ich cykliczne przesunięcie w lewo, a zatem ostatni znak jest zawsze zmieniany.




3

Cubix , 10 bajtów

..@|i?2%)O

Wypróbuj online! lub Zobacz, jak działa!

Dla każdego znaku wypisuje, 1jeśli znak ma parzysty punkt kodowy, w 2przeciwnym razie; 1ma nieparzysty punkt kodowy i 2parzysty, więc wynik nigdy nie będzie równy wejściu.

Wyjaśnienie

Ten kod odpowiada następującej kostce netto:

    . .
    @ |
i ? 2 % ) O . .
. . . . . . . .
    . .
    . .

IP (wskaźnik instrukcji) zaczyna się w lewym górnym rogu skrajnie lewej twarzy, kierując się na wschód. Postępuje zgodnie z tą serią instrukcji:

i     Grab a char-code from STDIN and push it to the stack (-1 if there is no more input).
?     If the top item is negative, turn left and hit @ which ends the program.
      If it's positive (any printable ASCII char), turn right. The IP runs through a bunch
        of no-ops, then hits:
)     Increment the top item.
|     Mirror the IP's direction horizontally (turns it around).
)     Increment the top item again. The IP then wraps around again until it hits:
?     The top item is positive, so turn right.
2     Push a 2 to the stack.
%     Push the modulus of the top two items (0 for even char-code, 1 for odd).
)     Increment the result (now 1 for even char-code, 2 for odd).
O     Output as a number. The IP wraps back around to the i and the process starts again.

3

Alice , 9 bajtów

#oi/
t i@

Wypróbuj online!

Wyjaśnienie

Pomysł zaczerpnięto z przesłania Martina Endera do CJam. Pierwszy znak jest traktowany jako punkt kodowy, zredukowany mod 10 i przenoszony na koniec wyniku. Ponieważ zmieniono dokładnie jeden znak, permutacja znaków nie może spowodować odzyskania tego samego łańcucha.

#   skip next command
o   (skipped)
i   push first byte onto stack
    STACK: [97]
/   reflect to SE, switch to ordinal mode (implicit reflect to SW)
i   push remaining input onto stack as string (implicit reflect to NW)
    STACK: [97, "sdf"]
o   output top of stack (implicit reflect to SW)
    STACK: [97]
t   implicitly convert code point to decimal string, and extract last character
    (implicit reflect to NE)
    STACK: ["9", "7"]
o   output this last digit (implicit reflect to SE)
i   push empty string, since there is no more input to take (implicit reflect to NE)
/   reflect to S, switch to cardinal mode
@   terminate

Używanie tmod 10 jest naprawdę sprytne, miłe. :)
Martin Ender

3

Pushy , 1 bajt

Q

Wypróbuj online!

Konwertuje podany ciąg znaków na listę kodów znaków ASCII, indeksuje je (indeksowanie modułowe) na wielkie litery, a następnie drukuje wynik. Zasadniczo każda postać njest przypisana do mapy chr(ord(n) % 26 + 65). Możesz użyć tego programu, aby zobaczyć, jak działa mapowanie.

Wyjście:

  • Będzie zawsze tej samej długości co dane wejściowe, ponieważ znaki są bezpośrednio mapowane na nowe.
  • Zawsze będzie zawierać tylko drukowane znaki ASCII (ponieważ zawiera tylko wielkie litery)
  • Zawsze będzie różny od wejścia, ponieważ nie ma takiego możliwego znaku wejściowego n, że chr(ord(n) % 26 + 65) == naby było to prawdą, musi istnieć liczba całkowita xtaka 26x = 65, dla której nie ma rozwiązania.

1 bajt

q

Wypróbuj online!

Ta odpowiedź jest dokładnie taka sama, z tym wyjątkiem, że odwzorowuje na małe litery, a nie na duże litery. To jest nadal ważna, gdyż nie ma możliwości wejścia charakter ntaki, że chr(ord(n) % 26 + 97) == n.


2

Brain-Flak , 53 bajty

Obejmuje +1 dla -c

([(((()()()()){}){}){}()]({}())){{}(<({}[()()])>)}{}

Spowoduje to zmniejszenie pierwszego znaku, chyba że jest to spacja, w takim przypadku zwiększy pierwszy znak.

Wypróbuj online!

([(((()()()()){}){}){}()]      )                     # Push: input + 1 != 33 on top of...
                         ({}())                      #    input + 1
                                {{}(<          >)}{} # If (input + 1 != 33)
                                     ({}[()()])      #   Push: (input + 1) - 2

2

Galaretka , 4 bajty

^1Ṿ€

Wysyła ciąg cyfr. Żaden znak wyjściowy nie będzie równy odpowiadającemu znakowi wejściowemu.

Wypróbuj online!

Jak to działa

^1Ṿ€  Main link. Argument: s (string)

^1    XOR each character c in with 1.
      This attempts to cast c to int, mapping '0', ..., '9' to 0, ..., 9.
      For non-digits, the attempt fails, mapping c to 0.
      After XORing with 1, we get 1, 0, 3, 2, 5, 4, 7, 6, 9, 8 for '0', ..., '9', 
      and 1 for all non-digits.
  Ṿ€  Uneval each; mapping 0, ..., 9 to '0', ..., '9'. This yields a character
      array, which is Jelly's string type.
      Note that no character is mapped to itself.


2

PHP, 30 27

<?=strtr($a=$argn,$a,$a^1);

Zmienia każdy znak równy pierwszemu znakowi z char, który ma najmniej znaczący odwrócony bit.


Czy „~” działa ?.
CalculatorFeline

W rzeczywistości nie odwraca najmniej znaczącego fragmentu pierwszego znaku; konwertuje go na liczbę całkowitą i odwraca najmniej znaczącą część tego . Tak więc @CalculatorFeline ~działa , generuje 1.
ETHprodukcje

O. Czy !$aczy ~$adziała?
CalculatorFeline

@ETHproductions Zrobiłem ostatnią edycję na krótko przed pójściem spać i nie miałem czasu na jej aktualizację. Oczywiście twoje prawo najpierw przekształca się na liczbę całkowitą i dlatego może nawet nie zmienić pierwszego znaku, ale może drugi np. „12” staje się „13”.
Christoph

@CalculatorFeline niestety oba błędy !$azamieniają się "12"w, "12"ponieważ falsesą konwertowane na pusty ciąg, dzięki czemu nic nie jest zamieniane i ~$awszystko zamienia się w niedrukowalne, ponieważ ~"12"najpierw nie konwertuje na int, ale dosłownie odwraca wszystkie bity w ciągu.
Christoph


2

Brachylog , 9 bajtów

{¬Ṣ|∧Ịh}ᵐ

Wypróbuj online!

Wyjaśnienie

To zastępuje wszystkie znaki przez spację, z wyjątkiem spacji, które zastępuje "0".

{      }ᵐ      Map on each char of the Input
 ¬Ṣ              The Input char is not " ", and the Output char is " "
   |             Or
    ∧Ịh          The Output char is "0"

2

PHP <7.1, 31 bajtów

for(;~$c=$argn[$i++];)echo$c^1;

Wypróbuj online!


Usuń 66-bajtowe rozwiązanie, ponieważ jest nieprawidłowe.
CalculatorFeline

Błąd dla danych wejściowych „1”, „10”, „101” itd. Nie można polegać tylko na długości łańcucha.
CalculatorFeline

@CalculatorFeline „1” wyjścia „0”, „10” wyjścia „01”, „101” wyjścia „010”. Gdzie jest problem
Christoph

@CalculatorFeline „1” => 0, „10” => 01, „101” => 010 Gdzie to się nie powiedzie?
Jörg Hülsermann

1
Wydajność PHP 7.1 A non-numeric value encountered. I możesz użyć ~zamiast a&.
Tytus

2

Golfscript, 3 bajty

Wypróbuj online!

)5%

Weź wartość ASCII ostatniego znaku modulo 5 i zastąp ostatni znak wynikiem. Działa to oczywiście dla znaków innych niż cyfry, ale jeśli ostatni znak jest cyfrą, również się zmienia („0” mod 5 = 3, „1” mod 5 = 4 itd.).

Działa to również z 7 lub 9, zachowując tę ​​samą długość.

Też tak! Mam tutaj rozwiązanie Golfscript oraz najlepsze rozwiązania!


2

Funky , 26 22 bajtów

s=>s::gsub("."a=>1&~a)

Oblicza, ~aktóre w przypadku znaków innych niż cyfry zwrócą NaN. Następnie 1&ogranicza go do 0 lub 1, dla cyfry 0 będzie to 1i do 1tego będzie 0. Więc ten ciąg jest zawsze unikalny.

Wypróbuj online!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.