Panjang yang sama, string yang berbeda


53

Tantangan

Mengingat non-string kosong S dari panjang L yang terdiri sepenuhnya dari karakter ASCII yang dapat dicetak, string output lain dari panjang L yang seluruhnya terdiri dari karakter ASCII yang dapat dicetak, namun tidak sama untuk S .

Untuk keperluan tantangan ini, char ASCII yang dapat dicetak adalah di antara U + 0020 dan U + 007E, inklusif; yaitu, dari (spasi) ke ~(tilde). Baris dan tab baru tidak termasuk.

Sebagai contoh, diberikan "abcde", beberapa output yang valid dapat berupa:

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

Tetapi ini tidak valid:

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

Uji kasus

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

Aturan

  • Anda dapat berasumsi bahwa input seluruhnya terdiri dari karakter ASCII yang dapat dicetak.
  • Anda mungkin tidak berasumsi bahwa input tersebut tidak mengandung semua 95 karakter yang dapat dicetak.
  • Anda dapat menganggap input berisi setidaknya satu karakter dan panjangnya kurang dari 256 karakter.
  • Output juga harus seluruhnya terdiri dari karakter ASCII yang dapat dicetak. Anda tidak dapat, misalnya, menampilkan byte \ x7F untuk input "~".
  • Output harus berbeda dari input dengan probabilitas 1; yaitu, Anda dapat menghasilkan string acak hingga satu berbeda dari input, tetapi Anda tidak bisa hanya mengeluarkan karakter acak L dan berharap itu berbeda.
  • Baris baru tidak diizinkan dalam output, tetapi Anda dapat menampilkan satu baris tambahan yang tidak dihitung ke arah string.

Mencetak gol

Ini adalah , jadi kode terpendek dalam byte di setiap bahasa menang.


Perhatikan bahwa "positif" tidak termasuk string kosong. Untuk kejelasan ekstra, mungkin ganti "positif" dengan "bukan nol"?
CalculatorFeline

5
@CalculatorFeline Tapi itu akan mencakup string panjang negatif / s
ETHproduksi

1
... Itu tidak ada.
CalculatorFeline

@CalculatorFeline Lebih baik sekarang?
ETHproduksi

3
Tantangan lain yang sederhana tapi tidak sepele.
Weijun Zhou

Jawaban:


34

Python 2 , 21 byte

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

Cobalah online!

Mengambil representasi string dari string input dan memotongnya ke panjang string input. Untuk string tipikal, ini menempatkannya dalam 'tanda kutip dan memotong akhirnya:

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

Perhatikan bahwa string baru dimulai dengan '. Mari kita tunjukkan bahwa output selalu berbeda dari input.

  • Jika input tidak ', maka output dimulai dengan 'dan input tidak.

  • Jika input berisi 'dan tetapi tidak ", maka Python akan digunakan "untuk tanda kutip luar, memberikan karakter pertama "yang tidak ada dalam string input.

  • Jika input memiliki keduanya 'dan ", maka tanda kutip luar adalah 'dan masing-masing 'diloloskan sebagai \'. Di mana pun yang pertama "muncul dalam input, itu bergeser ke kanan dengan inisial 'dalam output dan dengan kemungkinan melarikan diri. Ini berarti tidak dapat cocok dengan "posisi yang sesuai di output.

Akhirnya, perhatikan bahwa mengutip input dan mungkin melarikan diri karakter selalu meningkatkan jumlah karakter, sehingga memotong output membuatnya sama dengan input.

Perhatikan bahwa penting bagi Python untuk beralih secara adaptif "dalam kasus kedua. Jika tidak melakukannya, maka akan gagal pada input tiga karakter '\'. Atau, awalan yang lebih panjang dari string tampilkan perbaikan menggunakan '. Jadi, metode ini tidak akan berfungsi untuk sebagian besar bahasa.


Apa alasan untuk mengindeks 'til len(s)bukan -2?
Julian Wolf

1
@JulianWolf Untuk input yang mengandung keduanya 'dan ", lebih dari 2 karakter akan ditambahkan karena tanda kutip perlu diloloskan.
Anders Kaseorg

Masuk akal; tidak mempertimbangkan itu. Terima kasih!
Julian Wolf

Anda bisa menggunakan [2:]bukannya [:len(s)]untuk turun ke 16 karakter.
xbarbie

@xbarbie Itu tidak selalu memberikan panjang yang sama, jika ada karakter yang perlu melarikan diri.
xnor


15

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

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

Cobalah online!

-4 byte berkat ETHProductions

-7 + -5 + -2 bytes berkat CalculatorFeline

-3 byte terima kasih kepada Rick Hitchcock

Memindahkan karakter pertama ke akhir dan menetapkannya ke 0 jika itu numerik dan bukan nol, dan 1 sebaliknya.

Penjelasan

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

Bukti

Karena char kedua menjadi yang pertama, char ketiga menjadi yang kedua, dll. Semua karakter harus identik. Sisa karakter terakhir hanya bisa menjadi 0 atau 1, jadi karakter yang diulang harus 0 atau 1. Tetapi string 0s mana pun menghasilkan 1 di akhir, dan sebaliknya; oleh karena itu, tidak mungkin untuk membuat input yang sama dengan outputnya. -Produk ETET

Lihat hasil edit untuk versi dan penjelasan sebelumnya.

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

Jelly , 3 byte

~Ṿṁ

Output adalah string karakter digit, koma dan hypen-minus, yang karakter pertamanya akan berbeda dari karakter pertama dari string input.

Cobalah online!

Bagaimana itu bekerja

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

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

Cobalah online!

Konversi ke string Fdan T. Yang penting adalah bahwa karakter Fdan Tmengkonversi satu sama lain. Ini dilakukan dengan memeriksa apakah karakternya kurang dari Muntuk mendapatkan Trueatau False, kemudian mengambil karakter pertama dari representasi string.


Haskell , 23 byte

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

Cobalah online

Mengganti setiap karakter dengan ~, kecuali ~menjadi spasi.


Apa arti penting ruang dalam q '~'? Mengapa itu tidak bisa dihapus?
Cyoce

@Cyoce Haskell mengizinkan 'sebagai karakter dalam pengidentifikasi, sehingga q'~'=' 'akan diuraikan sebagai q' ~ '=' '(melaporkan kesalahan leksikal karena yang terakhir 'tidak tertandingi.)
Ørjan Johansen

5

Ruang putih, 59 byte

Representasi yang terlihat

NSSNSSSTSSSSSNSNSSNSSNSTNTSTTTTSSTNTTSNSNSTSSSNSSSNTNSSNSNN

Apa fungsinya:

Untuk setiap karakter yang dibaca itu mencetak spasi, kecuali jika spasi, lalu mencetak @.

Membongkar:

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

Selalu senang melihat solusi di Whitespace. Terutama ketika Anda biasanya tidak dapat melihatnya . +1
Josiah Winslow

Jawaban bagus! Saya mencoba menemukan sesuatu yang lebih pendek dari struktur, tetapi tidak dapat menemukan apa pun. Tapi Anda bisa bermain golf 2 byte dengan mengubah SSSTSSSSSN (push 32)to SSSTSSTN (push 9)dan the TSSS (add)to TSSN (multiply). Ini akan mencetak tab untuk setiap karakter dengan nilai unicode di atas 9, dan a Q(9 * 9 = 81) untuk setiap karakter dengan nilai unicode dari 0..9. Cobalah online 57 byte mentah , atau Coba online dengan highlight dan penjelasan tambahan
Kevin Cruijssen

Abaikan komentar saya di atas. Untuk tantangan, tab tidak dianggap sebagai karakter ASCII yang dapat dicetak ..
Kevin Cruijssen

5

MATL , 6 5 byte

Qo!V!

Cobalah online!

Penjelasan

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

Itu 5 di CJam: l'0f=(jika itu sesuai dengan apa yang saya pikirkan)
Martin Ender

@ MartinEnder Ya, persis seperti itu :-) Saya baru saja menambahkan penjelasan
Luis Mendo

5

Haskell , 19 byte

Fungsi anonim yang mengambil dan mengembalikan a String. Gunakan sebagai (map$(!!1).show.succ) "1111".

map$(!!1).show.succ

Cobalah online! (Menggunakan harness pengujian @ xnor.)

  • Untuk setiap karakter dalam string input, tambahkan karakter, lalu ubah ke format literal karakter, lalu ambil karakter kedua dari literal, yang merupakan karakter tepat setelah 'kutipan awal .
  • Untuk hampir semua karakter yang dapat dicetak, ini menghasilkan hanya karakter yang bertambah. Pengecualiannya adalah &dan ~, yang justru memberi \, karena penerusnya 'dan \DELlolos dalam literal karakter.

cukup yakin headdapat digunakan sebagai pengganti (!!1)byte tambahan
Julian Wolf

Tidak, headini (!!0), tidak (!!1). Itu akan gagal pada karakter '.
Ørjan Johansen

Ah benar Saya baru saja membaca jawaban python dan lupa bahwa kutipan biasanya memerlukan perlakuan khusus.
Julian Wolf

4

05AB1E , 5 byte

žQDÀ‡

Cobalah online!

Penjelasan

Mengganti setiap char dengan char ascii yang dapat dicetak berikutnya, membungkus dari tilde ke angkasa.

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

4

V , 7 byte

íÁ/a
g?

Cobalah online! atau Verifikasi semua kasus uji!

Bagaimana cara kerjanya?

Pertimbangkan semua string yang terdiri dari ASCII yang dapat dicetak. Setiap string harus 1) Berisi karakter alfabet, atau 2) Tidak mengandung karakter alfabet.

Jadi cara program ini bekerja adalah dengan terlebih dahulu mengubah satu karakter non-alfabet menjadi 'a', dan kemudian melakukan ROT13 pada string input.

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

Ini rusak jika Anda memiliki nomor seperti 9sendiri, di mana penambahan itu menambahkan karakter lain ke string
nmjcman101

@ nmjcman101 Ah, itu poin yang bagus. Saya telah kembali
DJMcMayhem

Saya suka hal ROT13, saya tidak tahu V (im) bisa melakukan itu
nmjcman101

4

C (gcc) , 22 byte

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

Mengambil penunjuk string dan memoderasi karakter pertama di tempatnya.

Cobalah online!


1
Shorter: *s=159-*s. Selalu mengubah bit terakhir, oleh karena itu tidak pernah memberikan karakter yang sama. Perhatikan bahwa159 = ' ' + '~'
celtschk

Saya pikir maksud Anda 158 = '' + '~'. 159-32 = 127, yang akan menjadi karakter di luar cakupan. Tapi ide bagus.
Computronium

@celtschk Involutions tidak dapat bekerja, karena ada jumlah ganjil (95) karakter cetak yang dapat dicetak, jadi setidaknya salah satu dari mereka akan memetakan ke dirinya sendiri.
Dennis

@ Computronium: Ups, Anda benar, saya mendapat kode karakter yang ~salah.
celtschk

4

C (gcc) , 20 byte

Melihat jawaban Dennis, memikirkan perbaikan penting 2 byte.

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

Cobalah online! (Footer oleh Dennis.)

Seperti aslinya, memodifikasi karakter pertama dari string di tempat, tetapi xors dengan nilainya dibagi dengan 3 (angka terkecil yang berfungsi. 2 gagal pada karakter tunggal 'U'yang memberikan 127, tidak dapat dicetak.)


4

Python 2 , 25 byte

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

Cobalah online!

Anders Kaseorg menyimpan byte dengan mengekstraksi karakter pertama dari Trueatau False.


Saya sarankan mengubah '?'ke 2 digit kode sandi, tetapi Python bukan salah satu dari bahasa di mana Anda bisa melakukan itu :(
CalculatorFeline

Varian yang menyimpan byte (tetapi menjatuhkan kompatibilitas Python 3): lambda s:`+(s<'1')`+s[1:]ataulambda s:`s<'T'`[0]+s[1:]
Anders Kaseorg

3

Haskell, 30 26 byte

f ' '='~'
f c=pred c
map f

Cobalah online!

Mengganti setiap char dengan pendahulunya dan space dengan tilde.


3

Oktaf , 19 18 byte

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

Cobalah online!

Penjelasan:

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

l)iA%

Cobalah online!

Mengkonversi karakter terakhir ke titik kode dan mengambil modulo 10. Ini jelas berbeda untuk karakter non-digit di posisi terakhir. Tetapi digit dimulai pada titik kode 48, jadi mengambil mod 10 akan menggeser mereka secara siklis dan karenanya karakter terakhir selalu berubah.



3

Japt , 4 byte

®c v

Cobalah online!

Penjelasan:

®c v
®    At each char:
 c     Convert to its ASCII value
   v   Return 1 if divisible by 2, otherwise return 0

3

Cubix , 10 byte

..@|i?2%)O

Cobalah online! atau Tonton saja!

Untuk setiap karakter, cetak 1jika karakter tersebut memiliki titik kode genap, 2jika tidak; 1memiliki titik kode ganjil dan 2genap, sehingga output tidak akan pernah sama dengan input.

Penjelasan

Kode ini sesuai dengan jaring kubus berikut:

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

IP (penunjuk instruksi) dimulai di sudut kiri atas wajah paling kiri, menuju ke timur. Ini mengikuti serangkaian instruksi ini:

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 byte

#oi/
t i@

Cobalah online!

Penjelasan

Ide itu diambil dari pengajuan CJam Martin Ender. Karakter pertama diambil sebagai titik kode, dikurangi mod 10, dan dipindahkan ke akhir output. Karena tepat satu karakter diubah, permutasi karakter tidak dapat menghasilkan string yang sama kembali.

#   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

Menggunakan tuntuk mod 10 benar-benar pintar, bagus. :)
Martin Ender

3

Pushy , 1 byte

Q

Cobalah online!

Ini mengubah string yang diberikan ke daftar kode karakter ASCII, mengindeksnya (pengindeksan modular) ke dalam alfabet huruf besar, kemudian mencetak hasilnya. Pada dasarnya, setiap karakter ndipetakan ke chr(ord(n) % 26 + 65). Anda dapat menggunakan program ini untuk melihat cara kerja pemetaan.

Hasil:

  • Akan selalu sama panjang dengan input, karena karakter secara langsung dipetakan ke yang baru.
  • Akan selalu hanya terdiri dari karakter ASCII yang dapat dicetak (karena hanya berisi huruf besar)
  • Akan selalu berbeda dengan input, karena tidak ada karakter input yang mungkin nsehingga chr(ord(n) % 26 + 65) == n, seperti untuk ini benar harus ada bilangan bulat xsehingga 26x = 65, yang tidak ada solusi.

1 byte

q

Cobalah online!

Jawaban ini persis sama, kecuali bahwa ia memetakan ke huruf kecil daripada karakter huruf besar . Ini masih berlaku karena tidak ada kemungkinan karakter masukan nsehingga chr(ord(n) % 26 + 97) == n.


2

Brain-Flak , 53 byte

Termasuk +1 untuk -c

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

Ini akan mengurangi karakter pertama kecuali jika itu adalah spasi, dalam hal itu akan menambah karakter pertama.

Cobalah online!

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

2

Jelly , 4 byte

^1Ṿ€

Menghasilkan string digit. Karakter output tidak akan sama dengan karakter input yang sesuai.

Cobalah online!

Bagaimana itu bekerja

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

Mengubah setiap arang sama dengan arang pertama dengan arang yang memiliki bit paling signifikan terbalik.


Apakah "~" bekerja?
CalculatorFeline

Ini sebenarnya tidak membalik sedikit pun dari karakter pertama; itu mengubahnya menjadi bilangan bulat dan membalik sedikit yang paling signifikan dari itu . Jadi ya, @CalculatorFeline, ~berfungsi, menghasilkan 1.
ETHproduksi

Oh Apakah !$aatau ~$abekerja?
CalculatorFeline

@ ETHproductions Saya melakukan edit terakhir sesaat sebelum tidur dan tidak punya waktu untuk memperbaruinya. Tentu saja hak Anda pertama kali dikonversi ke integer dan karenanya mungkin bahkan tidak mengubah karakter pertama tetapi mungkin yang kedua misalnya "12" menjadi "13".
Christoph

@CalculatorFeline sayangnya keduanya gagal !$aberubah "12"menjadi "12"karena falsedikonversi ke string kosong sehingga tidak ada yang diganti dan ~$amengubah semuanya menjadi tidak dapat dicetak karena ~"12"tidak mengkonversi ke int terlebih dahulu tetapi secara harfiah membalik semua bit dalam string.
Christoph


2

Brachylog , 9 byte

{¬Ṣ|∧Ịh}ᵐ

Cobalah online!

Penjelasan

Ini menggantikan semua karakter dengan spasi, kecuali spasi yang digantikannya "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 Bytes

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

Cobalah online!


Harap hapus solusi 66 byte karena itu tidak valid.
CalculatorFeline

Gagal untuk input "1", "10", "101" dll. Anda tidak bisa hanya bergantung pada panjang string.
CalculatorFeline

@CalculatorFeline "1" menghasilkan "0", "10" menghasilkan "01", "101" menghasilkan "010". Dimana masalahnya?
Christoph

@CalculatorFeline "1" => 0, "10" => 01, "101" => 010 Dimana gagal?
Jörg Hülsermann

1
PHP 7.1 menghasilkan A non-numeric value encountered. Dan Anda bisa menggunakannya ~sebagai gantinya a&.
Titus

2

Golfscript, 3 byte

Cobalah online!

)5%

Ambil nilai ASCII nilai modulo 5 karakter terakhir, dan ganti karakter terakhir dengan hasilnya. Ini jelas bekerja untuk karakter non-digit, tetapi jika karakter terakhir adalah digit, itu juga berubah ("0" mod 5 = 3, "1" mod 5 = 4, dll).

Ini juga akan bekerja dengan 7 atau 9 sambil tetap memiliki panjang yang sama.

Juga, yay! Saya punya solusi Golfscript dan solusi terbaik di sini!


2

Funky , 26 22 byte

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

Menghitung ~ayang bukan digit akan mengembalikan NaN. Kemudian 1&batasi untuk 0 atau 1, untuk digit 0, ini akan menjadi 1, dan untuk 1ini akan menjadi 0. Jadi string ini selalu unik.

Cobalah online!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.