Garip: harfler


11

Amaç

Rastgele boyuttaki matristeki tek harfi ayıran ve döndüren bir program veya işlev (veya eşdeğeri) yazın.

ayrıntılar

Bunun gibi rastgele boyutların girişi olarak bir matris (dize olarak) geçirilirsiniz.

bbbbbbbbbb
bbbbbdbbbb
bbbbbbbbbb
bbbbbbbbbb
bbbbbbbbbb

İşiniz geri kalanıyla eşleşmeyen mektubu bulmak (bu durumda, dsatır 2, sütun 6'da bulunur) ve bu mektubu çıktı olarak döndürmektir. Matris, harfler A-Z, a-zyeni satırlar ( \nyalnızca satırların uçlarında) ve 5x5 ile 10x10 (25-100 harfler) arasında değişen boyutlara sahip olacaktır.

Standart boşluklar geçerlidir. Bu bir kod golf meydan okumadır; en az bayt kodlu giriş kazanır.

Giriş

Girdi, bir program ise standart girdi yoluyla bir dize olarak veya bir işlev (veya benzeri) ise bir bağımsız değişken olarak geçirilir.

Çıktı

Matris içinde "garip" olan bir tek karakter veya None , nil, NUL, veya dize "None"hayır "tuhaf" karakteri varsa.

Daha fazla örnek

AAAAAAA
AAAAAAA
AAAAAAA
AAAIAAA
AAAAAAA

Cevap: I

vvqvvvvvvv
vvvvvvvvvv
vvvvvvvvvv
vvvvvvvvvv
vvvvvvvvvv

Cevap: q

puuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu

Cevap: p

Jeneratör

İşte programınızı test etmek için kullanabileceğiniz Python'da yazılmış rastgele bir matris üreteci. Not: Hata yapma ve tek bir harfe yazmama şansı azdır.


1
İşte JS içine Python kod edebi çeviri olduğunu.
Arnauld

1
@juniorRubyist "bonusu kaldırmak", "bonusu zorunlu kılmak" ile aynı şey değildir. Şu ana kadar isteğe bağlı olan kısmı zorluğun gerekliliklerine taşıyarak, mevcut cevapların büyük bir kısmını geçersiz kıldınız.
Martin Ender

Yanıtlar:



6

J , 12 10 7 bayt

-.}./.~

Çevrimiçi deneyin!

    /.~        Group identical items together
  }.           Remove one item from each group
-.             Remove the rest from the input

10 baytlık sürüm

-._1 1{\:~

Yılan Kadın ...

       \:~        Sort down
  _1 1{           Take the last character (which is a newline) and the second one.
-.                Remove those from the input

2
@ FrownyFrog Bu garip karakteri bulmanın zekice bir yolu
Galen Ivanov

daha iyi ne gibi karar veremiyorum: bu güzel kanca ya da ejderha şaka ...
Jonah

4

Brachylog , 8 4 bayt

oḅ∋≠

Çevrimiçi deneyin!

açıklama

Daha önce Brachylog kullanmadım, bu yüzden bu uygun olmayabilir.

oḅ∋≠  Input is a string.
o     Sort the input.
 ḅ    Split it into blocks of equal elements.
  ∋   There is a block
   ≠  whose elements are all different.
      That block is the output.

Kullanımının ∋≠ardından uzunluğu 1 sonuç almak için çok akıllı. Bunu Brachylog ipuçları sorusuna kesinlikle göndermelisiniz .
17'de

@Fatalize Teşekkürler, bahşiş ekledim.
Zgarb

3

K (oK) , 7 6 bayt

Çözüm

*<#:'=

Çevrimiçi deneyin!

Misal:

*<#:'="vvqvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv"
"q"

Açıklama:

Biraz daha kısa bir yaklaşım buldu: Sağdan sola değerlendirildi:

*<#:'= / the solution
     = / group matching items together
  #:'  / count (#:) each (')
 <     / sort ascending
*      / take the first one

Notlar:

Bu zorluğun bonus yönünün düşmesini beklerken, \ntek çözüm yoksa bu çözüm yeni satır karakterini döndürecektir :

*<#:'="vvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv"
"\n"

3

Prolog (SWI) , 46 bayt

p(L):-select(X,L,Y),\+member(X,Y),writef([X]).

Çevrimiçi deneyin!

Veya prolog sorgularından standart gerçek çıktı uygun değilse:

Prolog (SWI) , 48 bayt

Z*L:-select(X,L,Y),\+member(X,Y),char_code(Z,X).

Çevrimiçi deneyin!

açıklama

Find the first element X in the input  
that when removed, results in output  
that does not contain X

then depending on the version above either:  
print X as a character  
or  
return X as an atom

3

C (gcc) , 93 92 90 66 62 Bayt

İşlev olarak çok daha kısa

t;f(char*p){for(t=*p;*p;)t^*p++?putchar(*p^*--p?*p:t),*p=0:0;}

Çevrimiçi deneyin!

test kodu

main()
{
    char s[99];
    for(;gets(s);)f(s);
}

eski sürüm bir programdır

C 86 Bayt

char*p;s[9];main(t){for(;p=gets(s);)for(t=*p;*p;)t^*p++?putchar(*p^*--p?*p:t),*p=0:0;}

Tek karakteri verir veya hiçbir şey çıkarmaz. böyle koş;

C:\eng\golf>python matrix_gen.py | a.exe
X
C:\eng\golf>python matrix_gen.py | a.exe
G
C:\eng\golf>python matrix_gen.py | a.exe
x
C:\eng\golf>python matrix_gen.py | a.exe

C:\eng\golf>python matrix_gen.py | a.exe
J

Sizin gets()için \ n karakterlerini kaldırarak girişi dezenfekte ediyor gibi test sürücüsüne koymak oldukça adil olduğunu bilmiyorum . Bu, işlevinizin orijinal giriş üzerinde çalışmaması için bazı işler yapar.
Michael Dorgan

@MichaelDorgan Python betiğinden alınan girişin yanı sıra TIO'daki girişle de çalışır. Diğerleri sadece meydan okuma ruhuyla görünmeyen girdiyi kodladılar.
cleblanc

3

05AB1E ,  4  2 bayt

Adnan sayesinde 2 bayt tasarruf etti

.m

Çevrimiçi deneyin!

açıklama

.m   # push a list of the least frequent character(s) in input

Girişin en az 5 satır uzunluğunda olacağını garanti ettiğimiz için yeni satırları kaldırmanız mı gerekiyor?
Shaggy

@Shaggy: Hayır, bilmiyorum. Bu 2x2matrisleri idare etmekti . Hakkında 5x5ve yukarı kısmı kaçırdım . Teşekkürler!
Emigna

nil"Tuhaf biri" yoksa geri dönmek zorunda değil mi?
Sihirli Ahtapot Urn

@MagicOctopusUrn Bu bölüm, bu yanıt gönderildiğinde isteğe bağlıydı. Sanırım bu değişiklik çoğu cevabı geçersiz kılıyor ...
Martin Ender


2

Kabuk , 2 bayt

◄=

Çevrimiçi deneyin!

Bu, bir dizeyi girdi olarak alan ve bir karakter döndüren bir işlevdir. Karakterleri eşitlik için karşılaştırırken giriş dizesinin minimum değerini alır (diğer bir deyişle, en az sayıda diğer karaktere eşit olan karakteri döndürür).


2

C, 94 bayt

İşaretçi ile dön. Yoksa, geri dönün \0.

Bu, bellek sızıntılarına neden olur. int4 bayt olduğu varsayılır .

*t;f(c,p,i)char*c,*p;{t=calloc(64,8);for(*p=-1;*c;c++)t[*c]--;for(i=0;++i<128;)!~t[i]?*p=i:0;}

Çevrimiçi deneyin!



@Shaggy Aslında, bu kuralı nasıl yorumlayacağımı bilmiyorum, çünkü bazı (diğer) kullanıcıların bu kuralı açıkça bildiğini görüyorum, ancak yine de bu gibi cevaplar gönderiyorum.
user202729

2
@ user202729, sadece başkalarının yaptığı için doğru olduğu anlamına gelmez;) Bu tür çözümleri fark ederseniz, en iyisi onlara işaret etmek.
Shaggy

@Shaggy Açıkça kuralı işaret ettim ama bu kullanıcı "kural açıkça bunun geçerli olduğunu söylüyor" dedi. Ne diyeceğimi bilmiyorum. | Bu durumda, işlev t, ilk seferinde değil her seferinde çağrıdan önce dizinin sıfırlanmasını gerektirir .
user202729

@Shaggy Teşekkürler, düzeltildi.
Colera Su


2

Bash , 15 20 bayt

fold -1|sort|uniq -u

Çevrimiçi deneyin!

Açıklama: Satır başına karakter foldgirişi yapılır , eşleşen harf gruplarına ayrılır, sonra yalnızca ue satırlarını yazdırır .1sortuniq

@Nahuel Fouilleul'a bu yaklaşımla ilgili bir sorunu yakalamak ve düzeltmek için teşekkür ederiz .


garip karakter ikinci veya penuitlimate ise işe yaramaz
Nahuel Fouilleul

@NahuelFouilleul İyi yakalama ... Şu anda nasıl düzeltileceğinden emin değilim, ancak önerilen bir düzeltme olmadıkça daha sonra düzelteceğim veya sileceğim.
Justin Mariner

sadece düzeltmek |sort|olabilir ama daha iyi bir çözüm olabilir
Nahuel Fouilleul 29:17

Ayrıca grep ile bir çözüm buldu ama daha uzungrep -oP '^(.)((?=(?!\1).){2}|.*\K(?!\1).)'
Nahuel Fouilleul

@NahuelFouilleul sortDüzeltme ile gidiyorum , teşekkürler. Yine de, her zaman bu grep cevabını kendi isteğiniz gibi gönderebilirsiniz.
Justin Mariner



1

Matlab, 25 Bayt

a=input('');a(a~=mode(a))

"A" girdisi burada "a", "a" modu değildir. Oddball için boş dizi çıkarır.


1

Haskell, 33 * 0,75 = 24,75 bayt

f s=[c|[c]<-(`filter`s).(==)<$>s]

Tek bir karakter yoksa boş bir liste döndürür.

Çevrimiçi deneyin!

Matristeki c( karakter dizesi olarak verilen s) her karakter siçin c, uzunluktaki karakterlere eşit ve uzunluktaki karakterlerin bir dizesini yapın .


1

JavaScript (ES6), 37 bayt

nullTek harf yoksa döndürür .

s=>s.match(`[^
${s.match(/(.)\1/)}]`)

Test senaryoları


1

Japt , 6 bayt

Çok satırlı bir dize olarak girdi alır ve tek bir karakter dizesi veya çözüm yoksa boş bir dize çıkarır.

k@èX É

Dene


açıklama

Girdideki geçerli öğenin ( ) oluşumunu sayan ( 1 ) ve 1 ( ) çıkarma kişlevinden ( @) geçen true ( ) döndüren karakterleri kaldırın .èXÉ



1

Jöle , 4 bayt

ċ@ÐṂ

Çevrimiçi deneyin!

\nTek bir karakter olmaması durumunda dönüş (tek bir satırsonu). Açıkçası \nbasılabilir bir karakter değil.

Tesadüfen bu, Mr.Xcoder Python cevabı ile tamamen aynı algoritmadır. (Ben bağımsız olarak geldim)

Açıklama:

  ÐṂ    Ṃinimum value by...
ċ@      ċount. (the `@` switch the left and right arguments of `ċ`)

Bu çalışır çünkü bir m×nmatriste:

  • Tek karakter varsa: Yeni m-1satırlar, 1 tek karakter ve m×n-1normal karakter vardır, 1 < m-1 < m×n-1çünkü 5 ≤ m, n ≤ 10.
  • Tek karakter yoksa: Yeni m-1satırlar ve m×nnormal karakter vardır ve m-1 < m×n.


1

C (gcc) , 91 86 82 79 71 bayt

f(char*s){for(;*++s==10?s+=2:0,*s;)if(*s^s[-1])return*s^s[1]?*s:s[-1];}

Çevrimiçi deneyin!

  • Xor için Gastropner'a teşekkürler ve? hileler (-3 bayt)
  • Hataları düzeltmek için karşılaştırma sürümü yeniden çalıştı ve yorumlardan Gastropner büyüsünü kullandı .

Açıklama:

Yeni satırları atlarken mevcut ve önceki karakterleri karşılaştırın. Farklıysa, sonraki karakterle karşılaştırın. Bu bize şu anki veya önceki karakterleri döndürürsek gösterir. İşlev, varsa "tek" karakter değerini veya dizi tek değilse 0 değerini döndürür. Biz her zaman \0char önce bir newline olduğundan "sonraki" char kontrol ile kurtulmak . Tek bir karakter yoksa, esas olarak for döngüsünden \ 0 değerini döndürürüz.


Daha yaşlı, daha seksi xor kodu Açıklama:

Sonraki 3 dize değerinin çalışan bir xor maskesi yapın. Hepsi aynı ise, değer üçten herhangi birine eşit olacaktır. Farklılarsa, 2 özdeş birbirini benzersiz bırakarak iptal eder.

Xor'dan önce / n faktörü olmalı veya dağınık hale gelmelidir. Ayrıca s [0] 'un tek değer olması durumunda 2 karakteri eşitsizlik açısından kontrol etmelisiniz. Bu fazladan maliyet || Kontrol.

v;f(char*s){while(s[3]){s[2]==10?s+=3:0;v=*s^s[1]^s[2];if(v^‌​*s++||v^*s)break;}}

79 birkaç değişiklikle. v;f(char*s){while(s[3]){s[2]==10?s+=3:0;v=*s^s[1]^s[2];if(v^*s++||v^*s)break;}}
Gidiş

Yazdığım saçmalık için TIO benim bağlı olduğum şey. Teşekkürler!
Michael Dorgan

Bazı ifadelerin yeniden düzenlenmesi 77 için başka bir -2'ye izin verir: v;f(char*s){while(s[2]==10?s+=3:0,v=*s^s[1]^s[2],s[3])if(v^*s++||v^*s)break;} Ancak kazanan atın diğeri, eğer onunla biraz v;f(char*s){for(v=-1;*++s==10?s+=2,v--:0,*s;v=0)if(*s^s[-1])return s[v];}
uğraşırsan

Evet, ama xor çok seksi görünüyor. :)
Michael Dorgan

Öner s+=*++s-10?0:2yerine*++s==10?s+=2:0
ceilingcat


0

Alice , 16 * 75% = 12 bayt

/-.nDo&
\i..*N@/

Çevrimiçi deneyin!

çıktılar Jabberwocky yinelenen karakter varsa.

açıklama

/...@
\.../

Bu tamamen Ordinal (dize işleme modu) ile çalışan doğrusal programlar için bir çerçevedir. Gerçek kod zikzaklı bir şekilde yürütülür ve şu şekilde açılır:

i..DN&-o

i   Read all input.
..  Make two copies.
D   Deduplicate one copy, giving only the two letters and a linefeed.
N   Multiset difference. Removes one copy of each letter and one linefeed.
    Therefore it drops the unique letter.
&-  Fold substring removal over this new string. This essentially removes
    all copies of the repeated letter and all linefeeds from the input,
    leaving only the unique letter.
.   Duplicate.
n   Logical NOT. Turns empty strings into "Jabberwocky" and everything else
    into an empty string.
*   Concatenate to the previous result.
o   Print the unique letter or "Jabberwocky".

Bunun yerine, (boş bir dizeye harf çevirisi) &-de kullanabiliriz ey. Alternatif olarak, yığın manipülasyonuna bir karakter daha harcayarak, istenmeyen karakterleri kaldırabilmemizi sağlayan girdiyi tekilleştirebiliriz N, ancak yine de aynı bayt sayısı:

i.D.QXN.n*o@

Alice , 13 bayt

/N.-D@
\i&.o/

Çevrimiçi deneyin!

Bu bonus olmadan çözüm, sadece eksik .n*.



0

APL + WIN, 16 bayt

(1=+/a∘.=a)/a←,⎕

Ekran girişi istenir ve tek harf yoksa ya tek harf veya hiçbir şey çıktılanmaz


a/⍨1=+/a∘.=a←,⎕bir bayt için
Uriel

@Uriel Teşekkürler ama korkarım operatör ⍨ eski APL + WIN sürüm 5'de mevcut değil :(
Graham

0

PowerShell , 39 bayt

([char[]]"$args"|group|sort c*)[0].Name

Çevrimiçi deneyin!

Girdiyi yeni satırlarla (meydan okumada belirtildiği gibi) bir dize olarak alır, onu bir chardiziye dönüştürür . Daha sonra Group-Objectkarakterleri, böylece karakterlerin isimleriyle birlikte gruplandırılması, sonra sortda count'a dayanması . Bu, ilk önce yalnız karakterin olmasını sağlar, bu nedenle [0]dizini alır ve.Name .

Eğer yeni satır "hiçbir şey" için kabul edilebilir değilse, bu bonus için hak kazanır.


sort c*)[0]Kısaltılmasını umuyordum , ama bulduğum şey aynı bayt sayısıydı ? c* -eq 1).
kök

çift ​​tırnak işaretleri kaldırılarak kısaltılabilir $args. Ayrıca, tek bir karakter olmadığında (yeni satır yerine) ([char[]]$args|group|? c* -eq 1).Namedoğru bir şekilde döneceği için yapmak daha doğrudur null. Ancak baytlar açısından bu hala sizi 37'nin altına getirmeyecektir.
cogumel0

@ cogumel0 Çift tırnak işareti olmadan çalışmaz.
kök

@ kök doğru. Ancak şartlardan birini (matris içinde veya "tek" olan bir tek karakteri geçmesine None, nil, NUL, veya dize "None"hala değiştirilmelidir hayır "tuhaf" karakteri varsa.). Newline kabul edilebilir cevapların bir parçası değildir.
cogumel0

@ cogumel0 Ah, cevabımı gönderdiğimden beri meydan okuma değişti. "Hiçbiri / nil / ne olursa olsun" zorunlu değil, sadece bir bonus olurdu. Cevabımı olduğu gibi tutacağım.
AdmBorkBork

0

Perl 6 ,  27  24-25% = 18 bayt

*.comb.Bag.min(*.value).key

Dene

{%(.comb.Bag.invert){1}}

Dene

Bu tanımsız bir değer döndürür tek bir karakteri olmayan bir girdi verildiğinde .

Expanded:

{  # bare block lambda with implicit parameter 「$_」

  %(        # coerce into a Hash

    .comb   # split the input into graphemes (implicit method call on 「$_」)
    .Bag    # turn into a weighted Set
    .invert # invert that (swap keys for values) returns a sequence

  ){ 1 }    # get the character that only occurs once
}

0

Brainfuck, 125 bayt

,[----------[>],]<[->+<]<<[[->->+<<]>[>[->-<<<+>>]>[,<<,>>]<<<[->+<]>[->+<]<]>[-<<+>>]>[-<+>]<<<<]>>>>[<]<++++++++++.

Çevrimiçi Deneyin

Tuhaf olan yoksa matrisin harfini yazdırır


0

Java 8, 85 bayt

Bu, Stringila String(örn. Function<String, String>) Arasında bir lambdadır . Bu aslında Luca'nın çözümünün bir kopyasıydı , ama dizeyi biraz sıraladım.

s->new String(s.chars().sorted().toArray(),0,s.length()).replaceAll("(.)\\1+|\\n","")

Ç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.