Değişken Uzunlukta Karma Uygula


10

Arkadaşım ve ben bu oyunu kelimelerle oynadık. Eğlenceli bir eğlencedir ve hiçbir şey kalmayana kadar bir kelimedeki harfleri "iptal etmeyi" içerir. Gerçekten benden çok daha hızlı olmasından bıktım, bu yüzden onu uygulamak ve sonunda onu dövmeme izin vermek senin işin. Açıkçası, programı olabildiğince gizlemem gerektiğinden, olabildiğince küçük olması gerekiyor.

Bu oyun nasıl çalışıyor?

Oyun oldukça basit bir algoritma. Alfabetik bir dizgiyi daha fazla azaltılamayana kadar azaltır, böylece bir çeşit karma yapar. İnsanların yaptığımız gerçek oyunu uygulamak çok zordur, ancak aşağıdaki algoritmaya basitleştirilebilir:

Alfabeyi ikiye katlayarak ve şu iki parçayı sıralayarak başlıyorsunuz:

a b c d e f g h i j k l m
z y x w v u t s r p q o n

Ardından, ortadan başlayarak, pozitif tamsayıları üst yarısına ve negatifleri alt tarafa atarsınız:

a  b  c  d  e f g h i j k l m
13 12 11 10 9 8 7 6 5 4 3 2 1

z   y   x   w   v  u  t  s  r  p  q  o  n
-13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1

Sonra dizenizi alırsınız (kullanacağız hello world) ve alfabetik olmayan karakterleri görmezden gelirseniz , çevirin:

h e l l  o w   o  r  l d
6 9 2 2 -2 -10 -2 -5 2 10

Sonra harf değerlerini toplarsınız. Önceki diyagramda sıralananlar (ör. dVe w, lve o) iptal edilirken diğerleri toplanır.

sum(6 9 2 2 -2 -10 -2 -5 2 10 )=12

12 sayı bve karma nedenle, hello worldISb

Tamamen iptal eden kelime (örneğin İçin love), çıkış "0 karakter": -. Girişte -yine dikkate alınmayacağını unutmayın. Sadece çıktıda önemlidir.

Buradaki sayı büyüklüğü 13 büyükse, o zaman üzerinde iki katına başlar a's ve z' Temelde pek olarak almak s a'ın ya da z' ın uyum numarasına ve bu yüzden gibi son harfi içine geride kalanları atın:

code golf: 43.

3 a'e uyar ve 4 tane kaldı:

aaa 4: j
result: aaaj

İpucu: Bu bölüm, divmodsıfıra doğru yuvarlanması dışında temelde değildir -infinity(örn. -43, 3'ler olur zve -4bu pşekilde olur zzzp).

Not: a's z' veya 'tam olarak uyuyorsa çizgi gelmez 0.

Açıklamalar:

  • Karma durumdur içinde hassas
  • Standart Loophole'lara izin verilmiyor
  • G / Ç çok tuhaf, stdin, stdout, komut satırı arg, işlevi vb. Olmayan herhangi bir biçimde olabilir.
  • Bu çok kısa bayt kazanır boyutu kazanır.

Örnekler:

hello world  -->  b

love  -->  -

this is an example -->  aak

hello *&*(&(*&%& world  -->  b

good bye --> ae

root users --> zzs

3
loveboş ...
Justin

Yanıtlar:


4

CJam, 46 bayt

Çevrimiçi deneyin veya çevrimiçi test paketini deneyin .

lel{'n-_W>+_zE<*}%:+{_De<C~e>___0>-'n+'-?o-}h;

açıklama

Algoritma beklediğiniz şekilde çalışır: girişi okuyun, küçük harfe dönüştürün, her karakteri bir değerle eşleyin, değerleri toplayın ve karakterleri yazdırın ve toplam sıfır oluncaya kadar toplamı ayarlayın. Muhtemelen en ilginç optimizasyon (sadece iki bayt tasarruf etmesine rağmen) bunun yerine, ihmal edilen karakter eşlemelerinin kullanılmasıdır, çünkü bu, eşlenen değeri hesaplarken işareti düzeltmek için çıkarma argümanlarını değiştirmekten kaçınır ve reddedilen bir değerin çıkarılması, ekleme ile değiştirilebilir.

lel             "Read a line of input and convert all letters to lowercase.";
{               "Map each character:";
  'n-_W>+         "Map each character to its negated value by subtracting 'n'
                   and incrementing if the result is nonnegative.";
  _zE<*           "If the value is out of the letter range, use 0 instead.";
}%
:+              "Compute the sum of the mapped character values.";
{               "Do...";
  _De<C~e>        "Compute the sum clamped to the letter range.";
  __              "If the clamped sum is nonzero, ...";
  _0>-'n+         "... then produce the clamped sum mapped back to a letter by
                     decrementing if it is positive and adding 'n', ...";
  '-              "... else produce '-'.";
  ?
  o               "Output the character produced above.";
  -               "Subtract the clamped sum out of the sum.";
}h              "... while the sum is nonzero.";
;               "Clean up.";

4

Pyth, 79 78 77 65 61 58

J+\-GK+0fTr13_14=ZsX@JzJKMe,pk*G/H13%H13@JxK?g\aZ>Z0_g\z_Z

Sen kullanabilirsiniz @Jzyerine f}YJzmuhtemelen daha çok var ama şimdi uyumalıyım. İyi şanslar;)
FryAmTheEggman

@FryAmTheEggman Havalı, kavşağının farkında değildim @!
orlp

2

Klip 10 , 87

Fr+`m[y?cAyg#Ay-v,-RRZ]0]}m.U`[Fx?x?<x0,:-/xR'z*m'm%xR!!%xR],:/xR'a*m'n%xR!!%xR]]'-[R13

1

R, 258 bayt

function(s){a=13;r=data.frame;z=strsplit(gsub("[^a-z]","",tolower(s)),"")[[1]];d=r(l=rev(letters),h=c(-1*a:1,1:a));m=merge(r(l=z),d);n=sum(m$h);q=abs(n);v=rep(ifelse(n>0,"a","z"),q%/%a);paste0(paste(v,collapse=""),d$l[d$h==sign(n)*q%%a],ifelse(n==0,"-",""))}

Bu şimdiye kadarki en kaba R kodu olmalı. Yerleşik bir global değişken olarak "a" ile "z" arasındaki tüm harflerin bir vektörüne sahip olduğu için R'nin iyi bir seçim olabileceğini düşündüm. Ama gerisi bir karışıklık.

Ungolfed + açıklaması:

function(s) {
    a <- 13              # Store the value associated with a
    r <- data.frame      # Store the `data.frame` function

    # Split the input into a vector, ignoring case and non-letters
    z <- strsplit(gsub("[^a-z]", "", tolower(s)), "")[[1]]

    # Create a data frame where the first column is the letters
    # z through a and the second is the associated scores
    d <- data.frame(l=reverse(letters), h=c(-1*a:1, 1:a))

    # Merge the split vector with the data frame of scores
    m <- merge(data.frame(l=z), d)

    # Get the total score for the input
    n <- sum(m$h)
    q <- abs(n)

    # Pad the output with a or z as necessary
    v <- rep(ifelse(n > 0, "a", "z"), q %/% a)

    # Collapse the vector of a's or z's into a string
    out1 <- paste(v, collapse="")

    # Look up the letter associated with remainder
    out2 <- d$l[d$h == sign(n)*q%%a]

    # If n = 0, we still want a dash
    out3 <- ifelse(n == 0, "-", "")

    # Return the concatenation of all pieces of the output
    paste0(out1, out2, out3)
}

Bu, bir dizeyi girdi olarak kabul eden ve ilişkili karma değerini döndüren adsız bir işlev nesnesi oluşturur. Bunu aramak için bir ad verin, örn f=function(s){...}.

Örnekler:

> f("this is an example")
[1] "aak"

> f("root users")
[1] "zzs"

> f("love")
[1] "-"

> f("People like grapes.")
[1] "aaag"

Çevrimiçi deneyin!

Sorular? Daha fazla açıklama yapacağım için mutlu olacağım. Öneriler? Öneriler hoş geldiniz daha vardır!


1

Haskell, 171 bayt

import Data.Char
m=13
l=zip['a'..'z'][-i|i<-[-m..m],i/=0]
p 0="-"
p n|n>m='a':p(n-m)|n<(-m)='z':p(n+m)|1<2=[c|(c,i)<-l,i==n]
f n=p$sum[y|Just y<-[lookup(toLower x)l|x<-n]]

Test sürüşü:

> map f ["hello world", "love", "this is an example", "hello *&*(&(*&%& world", "good bye", "root users"]
["b","-","aak","b","ae","zzs"]

Nasıl çalışır: lHarflerden karşılık gelen değere bir arama tablosu. Giriş dizesindeki tüm karakterleri arayın ve bulunmayanları atın. Ortaya çıkan listeyi toplayın. Toplamı bağlı pbaskılar -belki ya da ilk birkaç aler veya znihayet ler ve (revers-) gelen mektubu aramalarının l.


1

R - 200

function(s){l=letters
N=setNames
x=strsplit(tolower(s),'')[[1]]
n=(13:-13)[-14]
v=sum(N(n,l)[x[x%in%l]])
o=''
while(v){d=min(max(v,-13),13)
o=paste0(o,N(l,n)[as.character(d)])
v=v-d}
if(o=='')o='-'
o}

+1, kesinlikle R cevabımdan daha iyi. İyi iş!
Alex
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.