5318008 - Zabawa z kalkulatorami


32

W szkołach na całym świecie dzieci wpisują cyfrę do kalkulatora LCD, odwracają ją do góry nogami i wybuchają śmiechem po utworzeniu słowa „cycuszki”. Oczywiście jest to najpopularniejsze słowo, ale istnieje wiele innych słów, które można stworzyć.

Wszystkie słowa muszą mieć jednak mniej niż 10 liter (słownik zawiera słowa dłuższe niż to, dlatego należy wykonać filtr w programie). W tym słowniku znajduje się kilka wielkich liter, więc przekonwertuj wszystkie słowa na małe.

Za pomocą słownika w języku angielskim utwórz listę liczb, które można wpisać do kalkulatora LCD i utworzyć słowo. Podobnie jak w przypadku wszystkich pytań do kodu golfowego, wygrywa najkrótszy program do wykonania tego zadania.

Do moich testów użyłem listy słów UNIX zebranych przez wpisanie:

ln -s /usr/dict/words w.txt

Lub alternatywnie, zdobądź go tutaj .

Na przykład powyższy obraz został utworzony przez wpisanie liczby 35007do kalkulatora i odwrócenie jej do góry nogami.

Litery i ich odpowiednie cyfry:

  • b :8
  • g :6
  • l :7
  • ja :1
  • o :0
  • s :5
  • z :2
  • h :4
  • e :3

Zauważ, że jeśli liczba zaczyna się od zera, po tym zeru wymagana jest kropka dziesiętna. Liczba nie może zaczynać się od kropki dziesiętnej.

Myślę, że to kod MartinaBüttnera, chciałem ci za to podziękować :)

/* Configuration */

var QUESTION_ID = 51871; // Obtain this from the url
// It will be like http://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";

/* App */

var answers = [], page = 1;

function answersUrl(index) {
  return "http://api.stackexchange.com/2.2/questions/" +  QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}

function getAnswers() {
  jQuery.ajax({
    url: answersUrl(page++),
    method: "get",
    dataType: "jsonp",
    crossDomain: true,
    success: function (data) {
      answers.push.apply(answers, data.items);
      if (data.has_more) getAnswers();
      else process();
    }
  });
}

getAnswers();

var SIZE_REG = /\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;
var NUMBER_REG = /\d+/;
var LANGUAGE_REG = /^#*\s*([^,]+)/;

function shouldHaveHeading(a) {
  var pass = false;
  var lines = a.body_markdown.split("\n");
  try {
    pass |= /^#/.test(a.body_markdown);
    pass |= ["-", "="]
              .indexOf(lines[1][0]) > -1;
    pass &= LANGUAGE_REG.test(a.body_markdown);
  } catch (ex) {}
  return pass;
}

function shouldHaveScore(a) {
  var pass = false;
  try {
    pass |= SIZE_REG.test(a.body_markdown.split("\n")[0]);
  } catch (ex) {}
  return pass;
}

function getAuthorName(a) {
  return a.owner.display_name;
}

function process() {
  answers = answers.filter(shouldHaveScore)
                   .filter(shouldHaveHeading);
  answers.sort(function (a, b) {
    var aB = +(a.body_markdown.split("\n")[0].match(SIZE_REG) || [Infinity])[0],
        bB = +(b.body_markdown.split("\n")[0].match(SIZE_REG) || [Infinity])[0];
    return aB - bB
  });

  var languages = {};
  var place = 1;
  var lastSize = null;
  var lastPlace = 1;
  answers.forEach(function (a) {
    var headline = a.body_markdown.split("\n")[0];
    //console.log(a);
    var answer = jQuery("#answer-template").html();
    var num = headline.match(NUMBER_REG)[0];
    var size = (headline.match(SIZE_REG)||[0])[0];
    var language = headline.match(LANGUAGE_REG)[1];
    var user = getAuthorName(a);
    if (size != lastSize)
      lastPlace = place;
    lastSize = size;
    ++place;
    answer = answer.replace("{{PLACE}}", lastPlace + ".")
                   .replace("{{NAME}}", user)
                   .replace("{{LANGUAGE}}", language)
                   .replace("{{SIZE}}", size)
                   .replace("{{LINK}}", a.share_link);
    answer = jQuery(answer)
    jQuery("#answers").append(answer);

    languages[language] = languages[language] || {lang: language, user: user, size: size, link: a.share_link};
  });

  var langs = [];
  for (var lang in languages)
    if (languages.hasOwnProperty(lang))
      langs.push(languages[lang]);

  langs.sort(function (a, b) {
    if (a.lang > b.lang) return 1;
    if (a.lang < b.lang) return -1;
    return 0;
  });

  for (var i = 0; i < langs.length; ++i)
  {
    var language = jQuery("#language-template").html();
    var lang = langs[i];
    language = language.replace("{{LANGUAGE}}", lang.lang)
                       .replace("{{NAME}}", lang.user)
                       .replace("{{SIZE}}", lang.size)
                       .replace("{{LINK}}", lang.link);
    language = jQuery(language);
    jQuery("#languages").append(language);
  }

}
body { text-align: left !important}

#answer-list {
  padding: 10px;
  width: 50%;
  float: left;
}

#language-list {
  padding: 10px;
  width: 50%px;
  float: left;
}

table thead {
  font-weight: bold;
}

table td {
  padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b">
<div id="answer-list">
  <h2>Leaderboard</h2>
  <table class="answer-list">
    <thead>
      <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr>
    </thead>
    <tbody id="answers">

    </tbody>
  </table>
</div>
<div id="language-list">
  <h2>Winners by Language</h2>
  <table class="language-list">
    <thead>
      <tr><td>Language</td><td>User</td><td>Score</td></tr>
    </thead>
    <tbody id="languages">

    </tbody>
  </table>
</div>
<table style="display: none">
  <tbody id="answer-template">
    <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
  </tbody>
</table>
<table style="display: none">
  <tbody id="language-template">
    <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
  </tbody>
</table>


4
Czy można użyć kropki dziesiętnej po pierwszej liczbie, nawet jeśli nie jest to wymagane?
Dennis

1
Czy musimy pisać 0.7734na cześć, czy byłoby .7734to do przyjęcia?
Dennis

3
Jakie zachowanie jest prawidłowe, jeśli słownik zawiera słowa z dużymi literami, interpunkcją itp.?
Peter Taylor,

1
@ Dennis 0.7734jest wymagany
Beta Decay

4
Co ze słowami, które wymagają dziesiętnego zera po przecinku? Na przykład oligowymaga końcowego zera po przecinku:0.6170
Pan Lama

Odpowiedzi:


7

CJam, 44 42 bajty

r{el"oizehsglb"f#W%"0."a.e|N+_,B<*_W&!*r}h

Wypróbuj online w interpretatorze CJam .

Aby uruchomić program z wiersza poleceń, pobierz interpreter Java i wykonaj:

java -jar cjam-0.6.5.jar 5318008.cjam < /usr/share/dict/words

Jak to działa

r            e# Read a whitespace-separated token from STDIN.
{            e# While loop:
 el          e#   Convert to lowercase.
 "oizehsglb" e#   Push that string.
 f#          e#   Get the index of each character from the input in that string.
             e#   This pushes -1 for "not found".
 W%          e#   Reverse the resulting array.
 "0."a       e#   Push ["0."].
 .e|         e#   Vectorized logical NOT. This replaces an initial 0 with "0.".
 N+          e#   Append a linefeed.
 _,B<*       e#   Repeat the array (array.length < 11) times.
 _W&!*       e#   Repeat the array !(array.intersection(-1)) times.
 r           e#   Read a whitespace-separated token from STDIN.
}h           e# If the token is not empty, repeat the loop.

9

Bash + coreutils, 54

Ponownie, dzięki @TobySpeight za pomoc w grze w golfa.

rev|tr oizehsglb 0-8|sed '/.\{11\}\|[^0-9]/d;s/^0/&./'

Lista słów wejściowych pochodzi z STDIN:

$ ./5318008.sh < /usr/share/dict/words | head
8
38
338
5338
638
5638
36138
31738
531738
7738
$ 

„Belie” i „Belie” to słowa? Im więcej wiesz ...
clismique

6

Python 2, 271 216 211 205 bajtów

To jedyny pomysł, jaki do tej pory miałam. Zaktualizuję to, gdy pomyślę o czymś innym! Zakładałem, że musimy czytać z pliku, ale jeśli nie, daj mi znać, abym mógł zaktualizować :)

Ogromne podziękowania dla Dennisa za uratowanie mnie 55 bajtów :)

Również dzięki Sp3000 za zapisanie 6 bajtów :)

d,f,g='oizehsglb',[x.lower()for x in open('w.txt').read().split('\n')if len(x)<10],[]
for x in f:
 c=x[::-1]
 for b in d:c=c.replace(b,`d.find(b)`)
 g=[g,g+[['0.'+c[1:],c][c[0]!='0']]][c.isdigit()]
print g

Nie znam dużo Pythona, ale czy coś takiego nie "oizehsglb".index(b)byłoby krótsze?
Dennis

3
d[b] == "oizehsglb".index(b). Być może brakuje rzutowania na ciąg / postać.
Dennis

1
Och, wow, nigdy nie przyszło mi do głowy, że liczby, które mogliśmy zastąpić, miały wartości liczbowe w porządku. Tak, to na pewno zadziała! Dzięki!
Kade

1
Nie testowałem, ale: 1) .findjest krótszy niż .index, 2) W zależności od posiadanej wersji, przynajmniej w wersji 2.7.10 openbez domyślnego argumentu trybu r, 3) Nie działa tylko for x in open(...)? (może być konieczne usunięcie końcowego nowego wiersza) Jeśli nie, oznacza to, że .split('\n')jest krótszy niż.splitlines()
Sp3000,

1
Również g+=[['0.'+c[1:],c][c[0]!='0']]*c.isdigit(), a można zaoszczędzić kilka bardziej przez odwrócenie się fwtedy robi for c in fzamiast c=x[::-1]. Również używasz tylko fraz, więc nie musisz zapisywać go jako zmiennej
Sp3000

6

JavaScript (ES7), 73 bajty

Można to zrobić w ES7 zaledwie 73 bajty:

s=>[for(w of s)'oizehsglb'.search(w)].reverse().join``.replace(/^0/,'0.')

Nie golfowany:

var b = function b(s) {
    return s.length < 10 && /^[bglioszhe]*$/.test(s) ? s.replace(/./g, function (w) {
        return 'oizehsglb'.search(w);
    }).reverse().join('').replace(/^0/, '0.') : '';
};

Stosowanie:

t('hello'); // 0.7734
t('loose'); // 35007
t('impossible'); //

Funkcjonować:

t=s=>                       // Create a function 't' with an argument named 's' 
   [                        // Return this array  comprehension
     for(i of s)            // Loops through each letter in the string
     'oizehsglb'.search(w)  // Converts it to it's corresponding number
   ]
  .reverse().join``         // Reverse the array and make it a string
  .replace(/^0/,'0.')       // If the first character is a 0, add a decimal after it

Uruchomiłem to na liście słów UNIX i umieściłem wyniki w pojemniku na wklejanie:

Wyniki

Kod użyty do uzyskania wyników w przeglądarce Firefox :

document.querySelector('pre').innerHTML.split('\n').map(i => t(i.toLowerCase())).join('\n').replace(/^\s*[\r\n]/gm, '');

Co dzieje się z t('Impossible')?
Arturo Torres Sánchez

@ ArturoTorresSánchez Masz rację, naprawiłem to
Downgoat

jest dołączyć`` ES2015, czy też jest przed ES2015?
WallyWest,

@WallyWest To jest funkcja ES6. Jest obsługiwany w większości głównych przeglądarek
Downgoat

Co jest w tym specyficzne dla ES7?
Arjun

5

Python 2, 121 bajtów

for s in open("w.txt"):
 L=map("oizehsglb".find,s[-2::-1].lower())
 if-min(L)<1>len(L)-9:print`L[0]`+"."[L[0]:]+`L`[4::3]

Zakłada, że ​​plik słownika w.txtkończy się znakiem nowej linii i nie ma pustych linii.


3

GNU sed, 82

(w tym 1 za -r)

Dzięki @TobySpeight za pomoc w grze w golfa.

s/$/:/
:
s/(.)(:.*)/\2\1/
t
s/://
y/oizehsglb/012345678/
/.{11}|[^0-9]/d;s/^0/&./

Lista słów wejściowych pochodzi z STDIN:

$ sed -rf 5318008.sed /usr/share/dict/words | tail
3705
53705
1705
0.705
50705
5705
505
2
0.02
5002
$ 

2

TI-BASIC, 75 88 bajtów

edycja 2: nieważne, jest to technicznie niepoprawne, ponieważ akceptuje tylko jedno słowo na raz (nie słownik). Spróbuję to naprawić, aby pozwolić na wejście więcej niż jednego słowa ...

edycja: ups; Pierwotnie sprawiłem, że pokazywał on na końcu wartość .0, jeśli ostatnią liczbą było 0, a nie odwrotnie. Naprawiono, chociaż jest to dość złe obejście (wyświetla „0” obok liczby, jeśli zaczyna się od 0, w przeciwnym razie wyświetla dwie spacje w tym samym miejscu). Z drugiej strony poprawnie obsługuje słowa takie jak „Otto” (wyświetla oba zera), ponieważ tak naprawdę nie wyświetla liczb dziesiętnych!


Nie mogę wymyślić lepszego języka, w którym można by to zrobić. Zdecydowanie można grać w golfa, ale w tej chwili jestem zbyt zmęczony. Tylda to symbol negacji [ ( - )przycisk].

Dane wejściowe są pobierane ze zmiennej odpowiedzi kalkulatora, co oznacza, co zostało ostatnio ocenione (jak _w interaktywnej powłoce pytona), więc musisz wpisać ciąg na ekranie głównym (znak cudzysłowu jest włączony ALPHA+), naciśnij ENTER, a następnie uruchom program. Alternatywnie możesz użyć dwukropka do oddzielenia poleceń, więc jeśli nazwiesz program, powiedz „CALCTEXT” i chcesz uruchomić go w ciągu „CZEŚĆ”, możesz wpisać "HELLO":prgmCALCTEXTzamiast wykonywać je osobno.

seq(inString("OIZEHSGLB",sub(Ans,X,1))-1,X,length(Ans),1,~1
Text(0,0,sub("0.  ",1+2(0 or Ans(1)),2),sum(seq(Ans(X)10^(dim(Ans)-X),X,1,dim(Ans

2

Python 2, 147 158 156 bajtów

Brakowało mi tego „0” wymaganie. Mam nadzieję, że teraz wszystko działa dobrze.

edit : Usunięto „.readlines ()” i nadal działa; p

edit2 : Usunięto niektóre spacje i przenieś druk do 3 linii

edit3 : Zapisano 2 bajty dzięki Sp3000 (usunięto miejsce po wydrukowaniu i zmieniono „indeks” na „znajdź”)

for x in open("w.txt"):
 a="oizehsglb";g=[`a.find(b)`for b in x[::-1].lower()if b in a]
 if len(g)==len(x)-1<10:
  if g[0]=="0":g[0]="0."
  print"".join(g)

1

Python 2, 184 174 bajtów

for s in open('w.txt'):
 try:a=''.join(map(lambda c:dict(zip('bglioszhe','867105243'))[c],s[:-1][::-1]));a=[a,'0.'+a[1:]][a[0]=='0'];print['',''.join(a)][len(s)<11]
 except:0

1

Rubin 2, 88 86 bajtów

x="oizehsglb"
puts$_.tr(x,"0-8").reverse.sub /^0/,"0." if$_.size<11&&$_.delete(x)<?A

Liczba bajtów obejmuje 2 dla lnopcji w wierszu poleceń:

$ ruby -ln 5318008.rb wordlist.txt

W takim przypadku ==""można go zastąpić <?A. I nie ma takiej potrzeby, gsub()jak sub()to wystarczy.
manatwork

1

C, 182 172 169/181 172 bajtów

char*l="oizehsglb",S[99],*s,*t;main(x){for(;t=S+98,gets(S);){for(s=S;*s;s++)if(x=strchr(l,*s|32))*--t=48+x-(int)l;else break;*t==48?*t--=46,*t=48:0;*s||s-S>10?0:puts(t);}}

Rozszerzony

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *l="oizehsglb",S[99],*s,*t;

main(int x, char **argv)
{
    for (;t=S+98,gets(S);){
        for (s=S;*s;s++)
            if (x=strchr(l,*s|32))
                *--t=48+x-(int)l;
            else
                break;
        if (*t==48) {       // '0'
            *t--=46;        // '.'
            *t=48;  // '0'
        }

        if (!*s && s-S <= 10)
            puts(t);
    }
}

za pomocą połączonego words.txt, z konwersją małych liter:

$ ./a.out  < words.txt  | tail
2212
0.2
0.802
0.602
7702
37702
0.02
321607002
515002
0.02002

$ ./a.out < words.txt   | wc -l
 550

1
Czy *s|32w tym kontekście nie będzie działać jako konwersja małych liter?
Hagen von Eitzen

Świetny pomysł! Dzięki!
jakiś użytkownik

1

Haskell, 175 bajtów bez importu (229 bajtów z importem)

Odpowiedni kod (powiedzmy w pliku Calc.hs):

import Data.Char(toLower)
import Data.Maybe(mapMaybe)
s="oizehsglb\n"
g('0':r)="0."++r
g x=x
main=mapM_(putStrLn.g.reverse.mapMaybe(`lookup`zip s['0'..'8'])).filter(\l->length l<10&&all(`elem`s)l).lines.map toLower=<<getContents

$ cat /usr/share/dict/words | runghc Calc.hs

0

Java, 208 200 176 bajtów

String f(char[] w){String o="",l="oizehsglb";for(int i=w.length;i>0;i--)o+=l.indexOf(w[i-1]|32);if(o.contains("-")||o.length()>8)o="  ";return o.charAt(0)+"."+o.substring(1);}

Rozszerzony

String f(char[] w)
{
    String o = "", l = "oizehsglb";
    for(int i = w.length; i > 0; i--)
        o+=l.indexOf(w[i-1]|32);
    if(o.contains("-")||o.length() > 8)
        o = "  ";
    return o.charAt(0) + "." + o.substring(1);
}

Zawsze dodaje dziesiętny, a gdy nieprawidłowy zwraca „.”. Ale poza tym działa tak, jak powinno. : P

Dzięki @ LegionMammal978!


Możesz zapisać 7 bajtów, zmieniając ;String l=na ,l=i =o+na +=.
LegionMammal978
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.