Aynı uzunluk, farklı dize


53

Meydan okuma

Olmayan bir boş bir dizge S uzunluğu L ASCII karakter tamamen oluşan çıkış uzunluğu başka bir dize L tamamen ASCII karakter oluşur, ancak eşit değildir S .

Bu zorluğun amaçları doğrultusunda, yazdırılabilir bir ASCII karakteri U dahil olmak üzere U + 0020 ve U + 007E arasındadır; yani, (boşluk) ile ~(tilde) arasındadır. Yeni satırlar ve sekmeler dahil değildir.

Örneğin, verilen "abcde"bazı geçerli çıktılar şunlar olabilir:

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

Ancak bunlar geçersiz olur:

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

Test durumları

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

kurallar

  • Girişin tamamen yazdırılabilir ASCII karakterlerinden oluştuğunu varsayabilirsiniz.
  • Girdilerin, yazdırılabilir 95 karakterin tümünü içermediğini varsayamazsınız.
  • Girişin en az bir karakter içerdiğini ve 256 karakter uzunluğundan az olduğunu varsayabilirsiniz.
  • Çıktı ayrıca tamamen yazdırılabilir ASCII karakterlerinden oluşmalıdır. Örneğin, girdi için byte \ x7F çıktısını alamadınız "~".
  • Çıkış, olasılık 1 olan girişden farklı olmalıdır; yani, girişten farklı olana kadar rastgele dizeler oluşturabilirsiniz, ancak yalnızca L rastgele karakterleri çıkarıp, farklı olmasını umamazsınız.
  • Çıktıda yeni satırlara izin verilmez, ancak dizeye doğru sayılmayan bir satır sonunu yazabilirsiniz.

puanlama

Bu , yani her dilde bayt cinsinden en kısa kod kazanır.


"Pozitif" ifadesinin boş dizgiyi hariç tuttuğunu unutmayın. Daha fazla netlik için, "pozitif" ifadesini "sıfır olmayan" ile değiştirmelisiniz.
Hesap MakinesiFeline

5
@CalculatorFeline Ama negatif uzunluklu dizeleri / s
içerecektir

1
... Bunlar yok.
CalculatorFeline

@CalculatorFeline Şimdi daha iyi?
ETHProductions

3
Başka basit ama önemsiz bir meydan okuma.
Weijun Zhou,

Yanıtlar:


34

Python 2 , 21 bayt

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

Çevrimiçi deneyin!

Giriş dizesinin dize gösterimini alır ve onu girdi dizesinin uzunluğuna kadar keser. Tipik bir dizgede bu, 'tırnak içine alır ve sonunu keser:

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

Yeni dizenin ile başladığını unutmayın '. Çıktının daima girdiden farklı olduğunu gösterelim.

  • Giriş hayır ise ', çıkış ile başlar 've giriş olmaz.

  • Girdi, a 'ile ama hayır içeriyorsa ", Python "dış tırnak işaretleri için kullanılacak "ve giriş dizgisinde olmayan bir ilk karakter verir.

  • Giriş ikisi de varsa 've "daha sonra dış alıntılar var 've her 'olarak kaçan edilir \'. "Girişte ilk görüldüğü yerde, 'çıktıdaki ilk başa ve olası kaçan noktalara kaydırılır . Bu ", çıktıda karşılık gelen pozisyonda bir ile eşleşemeyeceği anlamına gelir .

Son olarak, girdiyi alıntılamanın ve karakterlerden kaçan karakterlerin her zaman karakter sayısını artırdığına dikkat edin, bu nedenle çıktının kesilmesi onu girdiyle aynı uzunlukta yapar.

Python'un "ikinci durumda uyarlamalı olarak geçmesinin çok önemli olduğunu unutmayın . Bunu yapmazsa, üç karakterli girişte başarısız olur '\'. Veya, düzeltme show dizesinin artık herhangi bir önekini kullanarak '. Bu nedenle, bu yöntem çoğu dilde işe yaramaz.


İndekslemenin sebebi len(s)yerine ' -2?
Julian Wolf

1
Her iki içeren bir girdi için @JulianWolf 've "tırnak kaçmış olması gerektiğinden fazla 2 karakter eklenmiş olacaktır.
Anders Kaseorg

Mantıklı; bunu düşünmemiştim. Teşekkürler!
Julian Wolf

16 karaktere kadar almak [2:]yerine kullanabilirsiniz [:len(s)].
xbarbie

@xbarbie Kaçış gerektiren karakterler varsa, her zaman aynı uzunluğu vermez.
xnor


15

JavaScript (ES6), 37 33 36 29 26 18 21 19 bayt

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

Çevrimiçi deneyin!

ETHProductions sayesinde -4 byte

CalculatorFeline sayesinde -7 + -5 + -2 bayt

Rick Hitchcock sayesinde -3 bayt

İlk karakteri sonuna kadar hareket ettirir ve sayısal ise ve sıfır değilse, 0 olarak ayarlar.

açıklama

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

Kanıt

İkinci karakter birinci olur çünkü üçüncü karakter ikinci olur, vb. Tüm karakterlerin aynı olması gerekir. Kalan son karakter sadece 0 veya 1 olabilir, bu yüzden tekrarlanan karakterin 0 veya 1 olması gerekir. bu nedenle, çıktısına eşit bir girdi oluşturmak mümkün değildir. -ETHProductions

Eski versiyonlar ve açıklamalar için düzenlemelere bakınız.

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

Jöle , 3 bayt

~Ṿṁ

Çıktı, ilk karakteri giriş dizesinin ilk karakterinden farklı olacak rakam, virgül ve hipen eksi karakterlerinden oluşan bir dizedir.

Çevrimiçi deneyin!

Nasıl çalışır

~Ṿṁ  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 bayt

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

Çevrimiçi deneyin!

A dizeye dönüştürür Fve T. Önemli olan karakterlerin Fve Tbirbirlerine dönüştürülmesidir. Bu karakter küçükse kontrol edilerek yapılır Malmak Trueveya Falsedaha sonra dize temsilin ilk karakterini alarak.


Haskell , 23 bayt

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

Çevrimiçi deneyin

Boşluk bırakmadığı ~sürece her karakteri değiştirir ~.


İçindeki boşluğun önemi nedir q '~'? Neden kaldırılamıyor?
Cyoce

@Cyoce Haskell 'tanımlayıcılarda bir karakter olarak izin verir , öyleyse q'~'=' 'ayrıştırılır q' ~ '=' '(son eşleştirilemediğinden sözlü bir hata bildirir ').
Ørjan Johansen

5

Boşluk, 59 bayt

Görünür temsil

NSSNSSSTSSSSSNSNSSNSSNSTNTSTTTTSSTNTTSNSNSTSSSNSSSNTNSSNSNN

Bu ne yapar:

Okuduğu her karakter için boşluk yazması gerekir, boşluk olduğu durumlar dışında bir @ basar.

demontaj:

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

Whitespace'de bir çözüm görmek her zaman güzel. Özellikle normalde gerçekten göremediğiniz zaman. +1
Josiah Winslow

Güzel cevap! Yapıya daha kısa bir şey bulmaya çalıştım ama hiçbir şey bulamadım. Ama golf 2 değiştirerek bayt can SSSTSSSSSN (push 32)için SSSTSSTN (push 9)ve TSSS (add)için TSSN (multiply). Unicode değeri 9'dan büyük olan her karakter için bir sekme ve unicode değeri olan her karakter için bir Q(9 * 9 = 81) yazacaktır 0..9. Çevrimiçi ham 57 bayt deneyin
Kevin Cruijssen

Yukarıdaki yorumumu yoksay. Meydan okuma için, bir sekme yazdırılabilir bir ASCII karakteri olarak kabul edilmez ..
Kevin Cruijssen

5

MATL , 6 5 bayt

Qo!V!

Çevrimiçi deneyin!

açıklama

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

CJam’da 5: l'0f=(düşündüğüm şeyi yaparsa)
Martin Ender

@MartinEnder Evet, kesinlikle bu :-) Bir açıklama ekledim
Luis Mendo

5

Haskell , 19 bayt

A ve anonim bir işlev String. Olarak kullanın (map$(!!1).show.succ) "1111".

map$(!!1).show.succ

Çevrimiçi deneyin! (@ Xnor'ın test kablo demetini kullanma.)

  • Girdi dizisindeki her karakter için, karakteri artırır, sonra bunu karakterin değişmez biçimine dönüştürür, daha sonra başlangıç 'teklifinden hemen sonra karakter olan değişmezin ikinci karakterini alır .
  • Neredeyse tüm yazdırılabilir karakterler için bu sadece artırılmış karakterle sonuçlanır. İstisnalar, &ve ~bunun yerine \, çünkü onların halefleri 've \DELkarakter değişmezlerinden kaçmaları sağlanır.

Ekstra bir bayt headyerine kullanılacağından emin olabilirsiniz(!!1)
Julian Wolf

Hayır, headbir (!!0)değil, (!!1). Karakterde başarısız olur '.
Ørjan Johansen

Ah doğru. Sadece python cevabını okuyordum ve tekliflerin genellikle özel tedavi gerektirdiğini unuttum.
Julian Wolf

4

05AB1E , 5 bayt

žQDÀ‡

Çevrimiçi deneyin!

açıklama

Her karakteri bir sonraki yazdırılabilir ascii karakteri ile değiştirir, tilde boşluğa kaydırır.

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

4

V , 7 bayt

íÁ/a
g?

Çevrimiçi deneyin! veya Tüm test durumlarını doğrulayın!

O nasıl çalışır?

Yazdırılabilir ASCII'den oluşan tüm karakterleri dikkate alın. Her dize ya 1) Alfabetik karakterler içermeli veya 2) Alfabetik karakterler içermemelidir.

Bu yüzden bu programın çalışması ilk önce alfabetik olmayan bir karaktere dönüştürmek 'a've ardından giriş dizgisinde ROT13 uygulamaktır.

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

Bu 9, yalnız gibi bir numaranız varsa kırılır , bunun
artması

@ nmjcman101 Ah, bu iyi bir nokta. Geri döndüm
DJMcMayhem

ROT13 olayını sevdim, V (im) 'in bunu yapabileceğini bilmiyordum
nmjcman101

4

C (gcc) , 22 bayt

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

Bir dize işaretçisi alır ve ilk karakteri yerine getirir.

Çevrimiçi deneyin!


1
Daha kısa: *s=159-*s. Her zaman son biti değiştirir, bu yüzden asla aynı karakteri vermez. Not159 = ' ' + '~'
celtschk

Bence 158 = '' + '~' demek istiyorsun. 159-32 = 127, bu kapsam dışı bir karakter olur. Ama iyi fikir.
Computronium

@celtschk Tek başına yazdırılabilir chraracters miktarı (95) bulunduğundan, katılımcılar işe yaramaz, bu nedenle bunlardan en az biri kendisine eşlenir.
Dennis,

@Computronium: Hata! Haklısın, ~yanlış karakter kodunu aldım .
celtschk

4

C (gcc) , 20 bayt

Dennis'in cevabını gördüm, 2 baytlık önemli bir gelişme düşündüm.

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

Çevrimiçi deneyin! (Dennis'in altbilgisi.)

Orijinal gibi, dizgenin ilk karakterini değiştirir, ancak değeri 3'e bölerek (en küçük sayı. 2 'U'yazdırılabilir değil 127 veren tek karakterde başarısız olur .)


4

Python 2,25 bayt

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

Çevrimiçi deneyin!

Anders Kaseorg, ilk karakteri Trueveya ' dan alarak bir bayt kurtardı False.


'?'2 basamaklı bir kod kodunu değiştirmenizi öneririm , ancak Python bunu yapabileceğiniz dillerden biri değil :(
CalculatorFeline

Bir bayt tasarrufu sağlayan lambda s:`+(s<'1')`+s[1:]lambda s:`s<'T'`[0]+s[1:]
değişkenler


3

Octave , 19 18 bayt

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

Çevrimiçi deneyin!

Açıklama:

@(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 bayt

l)iA%

Çevrimiçi deneyin!

Son karakteri kod noktasına dönüştürür ve bu modulo 10'u alır. Bu, son konumdaki rakam olmayan karakterler için açıkça farklıdır. Ancak, rakamlar kod noktasında (48) başlar, bu yüzden bu mod (10) almak onları çevrimsel olarak sola kaydırır ve dolayısıyla son karakter daima değişir.




3

Cubix , 10 bayt

..@|i?2%)O

Çevrimiçi deneyin! veya Koşmasını izleyin!

Her karakter için, 1karakterin çift kod noktası varsa yazdırır 2; 1garip bir kod noktasına ve 2hatta sahip olduğundan, çıktı asla girdiye eşit olmaz.

açıklama

Bu kod aşağıdaki küp ağına karşılık gelir:

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

IP (komut işaretçisi), en sol yüzün sol üst köşesinde başlar ve doğuya doğru ilerler. Bu dizi talimatı izler:

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 bayt

#oi/
t i@

Çevrimiçi deneyin!

açıklama

Fikir, Martin Ender'in CJam sunumundan alınmıştır. İlk karakter kod noktası olarak alınır, mod 10 azaltılır ve çıktının sonuna taşınır. Tam olarak bir karakter değiştiğinden, karakterlere izin vermek aynı dizeyi geri almakla sonuçlanamaz.

#   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

tMod 10 için kullanmak gerçekten zekice ve hoş. :)
Martin Ender

3

Pushy , 1 bayt

Q

Çevrimiçi deneyin!

Bu, verilen dizgiyi ASCII karakter kodları listesine dönüştürür, onları indeksler (modüler indeksleme) büyük harfli alfabe içerisine getirir, ardından sonucu basar. Temel olarak, her karakter neşleştirilir chr(ord(n) % 26 + 65). Haritalamanın nasıl çalıştığını görmek için bu programı kullanabilirsiniz .

Çıktı:

  • Karakterler doğrudan yenilere eşlendiğinden, girişle aynı uzunluk her zaman aynı olacaktır.
  • Her zaman yalnızca yazdırılabilir ASCII karakterleri içerecektir (yalnızca büyük harfler içerdiğinden)
  • Hiçbir olası girdi karakter var her zaman olduğu gibi girişine farklı olacak nşekilde chr(ord(n) % 26 + 65) == ngerçek olamayacak kadar bu gibi bir tamsayı olmalıdır, xöyle ki 26x = 65bunun için hiçbir çözüm yoktur.

1 bayt

q

Çevrimiçi deneyin!

Bu cevap tamamen aynıdır, ancak büyük harf alfabe karakterleri yerine küçük harfli alfabe karakterleriyle eşleşmesi dışındadır. Bu, nböyle bir giriş karakteri olmadığından hala geçerlidir chr(ord(n) % 26 + 97) == n.


2

Brain-Flak , 53 bayt

İçin +1 içerir -c

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

Bu, bir boşluk olmadığı sürece ilk karakteri azaltır, bu durumda ilk karakteri artırır.

Çevrimiçi deneyin!

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

2

Jöle , 4 bayt

^1Ṿ€

Rakam dizesini çıkarır. Hiçbir çıkış karakteri karşılık gelen giriş karakterine eşit olmaz.

Çevrimiçi deneyin!

Nasıl çalışır

^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);

Her bir char'ı, en az anlamlı bit çevrilen char ile ilk char'a eşit olarak değiştirir.


"~" Çalışıyor mu?
Hesap MakinesiFeline

Aslında ilk karakterin en az anlamlı kısmını çevirmiyor; bir tamsayı dönüştürür ve en az önemli bit döndürür bu . Yani evet, @CalculatorFeline, çıktı ~, çalışıyor 1.
ETHProductions

Ah. Mu !$ayoksa ~$aişe?
CalculatorFeline

@ETHproductions Yatmadan kısa bir süre önce son düzenlemeyi yaptım ve güncelleme için vaktim olmadı. Tabii ki hakkınız ilk önce tamsayıya dönüşüyor ve bu nedenle ilk karakteri bile değiştirmeyebilir ancak belki ikinci olan örneğin "12" "13" olur.
Christoph

@CalculatorFeline ne yazık ki her ikisi de başarısız !$aolur çünkü boş bir dizgeye dönüştürülür, böylece hiçbir şey değiştirilmez ve her şeyi yazdırılamaz hale "12"getirir "12"çünkü int'ye dönüştürmez, ancak dizgede tüm bitleri çevirir. false~$a~"12"
Christoph


2

Brachylog , 9 bayt

{¬Ṣ|∧Ịh}ᵐ

Çevrimiçi deneyin!

açıklama

Bu, değiştirdiği boşluklar dışındaki tüm karakterleri boşlukla değiştirir "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 Bayt

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

Çevrimiçi deneyin!


Lütfen 66 baytlık çözümü kaldırın, çünkü geçersiz.
CalculatorFeline

"1", "10", "101" vb. Girişler için başarısız olur. Yalnızca dize uzunluğuna bağlı olamazsınız.
Hesap MakinesiFeline

@CalculatorFeline "1", "0", "10", "01", "101", "010" çıktı verir. Sorun nerde
Christoph

@CalculatorFeline "1" => 0, "10" => 01, "101" => 010 Nerede başarısız?
Jörg Hülsermann

1
PHP 7.1 verimi A non-numeric value encountered. Ve ~yerine kullanabilirsiniz a&.
Titus

2

Golf Betiği, 3 bayt

Çevrimiçi deneyin!

)5%

Son karakterin ASCII değer modulo 5'ini alın ve son karakteri sonuçla değiştirin. Bu açıkça rakam olmayan karakterler için işe yarar, ancak son karakter bir rakamsa aynı zamanda değişir ("0" mod 5 = 3, "1" mod 5 = 4, vb.).

Bu, aynı uzunluğu korurken aynı zamanda 7 veya 9 ile de çalışacaktır.

Ayrıca, yay! Buradaki en iyi çözümler kadar iyi bir Golfscript çözümüm var!


2

Funky , 26 22 bayt

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

~aRakam olmayanlar için hangisinin NaN döndüreceğini hesaplar . Sonra 1&0 ya da 1 olarak sınırlar, 0 basamağı için, bu olacaktır 1ve bunun için 1olacaktır 0. Yani bu dize her zaman benzersizdir.

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.